//////////////////////////////////////////////////////////////
//利用Householder变换将n阶实帆做对称矩阵约化为对称三对角矩阵
//a-长度为n*n的数组,存放n阶实对称矩阵
//n-矩阵的阶数
//q-长度为n*n的数组,返回时存放Householder变换矩阵
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
void eastrq(double a[],int n,double q[],double b[],double c[])
//////////////////////////////////////////////////////////////
//求实对称三对角对称矩阵的全部特征值及特征向量
//利用变型QR方法计算实对称三对角矩阵全部特征值及特征向量
//n-矩阵的阶数
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
//q-长度为n*n的数组,若存放单位矩阵,则返回实对称三对角矩阵的特征向量组
// 若存放Householder变换矩阵,则返回实对称矩阵A的特征向量组
//a-长度为n*n的数组,存放n阶实对称矩阵
int ebstq(int n,double b[],double c[],double q[],double eps,int l)
//////////////////////////////////////////////////////////////
//约化实矩阵为赫申伯格(Hessen berg)矩阵
//利用歼漏初等相似变换将n阶实矩阵约化为上H矩阵
//a-长度为n*n的数组,存放n阶实矩阵,返回时存放上H矩阵
//n-矩阵的阶数
void echbg(double a[],int n)
//////////////////////////////////////////////////////////////
//求赫申伯格(Hessen berg)矩阵的全部特征值
//返回值小于0表示超过迭代jt次仍未达到精度要求
//返回值大于0表示正常返回
//利用带原点位移的双重步QR方法求上H矩阵的全部特征值
//a-长度为n*n的数组,存放上H矩阵
//n-矩阵的阶数
//u-长度为n的数组,返回n个特征值的实部
//v-长度为n的数组,返回n个特征值的虚部
//eps-控制精度要求
//jt-整型变量,控制最大迭代次数
int edqr(double a[],int n,double u[],double v[],double eps,int jt)
//////////////////////////////////////////////////////////////
//求实对称矩阵的特征值及特征向量的雅格比法
//利用雅格比(Jacobi)方法求实对称矩阵的全部特征值及特征向量
//返回值小于0表示超过迭代jt次仍未达到精度要求
//返回值大于0表示正常返回
//a-长度为n*n的数组,存放实对称矩阵,返回时对角线存放n个特征值
//n-矩阵的阶数
//u-长度为n*n的数组,返回特征向量(按氏轿烂列存储)
//eps-控制精度要求
//jt-整型变量,控制最大迭代次数
int eejcb(double a[],int n,double v[],double eps,int jt)
//////////////////////////////////////////////////////////////
选自<<徐世良数值计算程序集(C)>>
每个程序都加上了适当地注释,陆陆续续干了几个月才整理出来的啊。
今天都给贴出来了
#include "stdio.h"
#include "math.h"
//约化对称矩阵为三对角对称矩阵
//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵
//a-长度为n*n的数组,存放n阶实对称矩阵
//n-矩阵的阶数
//q-长度为n*n的数组,返回时存放Householder变换矩阵
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
从代码上看没有问题。
如果你是新安装的编译器,那么有可能是编译器配置问题。 (Error spawning cl.exe)
也有可能是你工程中加了不止一岩悔个文件。(function main )
建议你鼠标点在1 errors位置,然后鼠标滚轮向上滚孝枣禅动,查看具体错误信息。根据错误信息分巧尘析具体原因。
问的有些问题,程序建立的2叉树只能是完全2叉树,其他的树只能手动建立,我这里给你完全2叉树的建立和遍历,完全2叉树是没有插入的,给你函数#include<stdio.h>
#include<stdlib.h>
typedef struct _node_
{
int data
struct _node_ *lchild,*rchild
}bitree
//递归建立完全2x树,root每次遍历后都会返回上层树的根节点,这点容易理解错,最终返回的root是整个2x树的根节点,传参int i 是给2x树赋值:1,2,3,4,5……,int n是想建立的总共节点数。
bitree *CreatBitree(int i,int n)
{
bitree *root = (bitree*)malloc(sizeof(bitree))
root->data = i
if(i * 2 <= n)
root->lchild = CreatBitree(2 * i,n)
else root->lchild = NULL
if(i * 2 + 1 <历缺肢=n)
root ->rchild = CreatBitree (2 * i +1,n);
else root->rchild = NULL
return root
}
//遍历
void proorder(bitree* root)
{
if(root == NULL) return
printf("%d ",root->data)
proorder(root->lchild)
proorder(root->rchild)
}//这是根左右遍历即前序遍历,如果想改成中序或者后序只需要把printf改到lchild后和rchild后即可
写完才发现你要层次遍历啊?!,那个还要引入个队列的建立,需要建队,出队,入队的函数,全写出来很麻烦的,写2x树的都不是初学了,我假设你已经有了队列相关函数,给出函数功能注释,然后直接给你层次遍历的函数吧:
void noorder(bitree *root)
{
sequeue *sq//用的顺序队列,没有用链式的,要不更麻烦了,sequeue是typedef的队列结构体
sq = CreatEmptySequeue()//建立空队列
EnSequeue(sq,root)//根节点入队
while(!EmptySequeue(sq))//判断队列是否空
{
root = Desequeue//出列
printf("%d",root->data)
if(root->lchild !=NULL)
EnSequeue(sq,root->lchild)
if(root->rchild != NULL)
EnSequeue(sq ,root->rchild)
}
return
}
算法描述,肢世 利用队列的先进先出的特性,首先把根节点入队列,然后开始循环,先判断队列是否空,取出队首元素并打印,然后检查出列节点的左节点,有的话入队,没有的话检查右节点,有的话入队,开始下次循环,这时队列里是扮慧第二层的左节点和有节点,这次是先打印2层左节点,然后让2层的左孩子节点入队,右孩子入队,然后打印2层右节点,然后2层右节点的左孩子入队,右孩子入队,队列中现在是第3层节点左边依次向右,依次类推,层次打印2x树
看在我折腾了那么多,时隔这么久才有我给答案,分就别吝啬了哈~~~嘿嘿
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)