当前位置:首页 >> 理学 >>

课程设计 稀疏矩阵的运用 源代码


#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define MAXSIZE 100 int num[100]; typedef struct OLNode{ int i,j; int e; struct OLNode *right,*down; }OLNode,*OLink; typedef struct { int mu,nu,tu; OLink *rhead,*chead; }CrossList; int CreateSMatix_OL(CrossList &M){ int i,j,e; OLink q; OLink p; printf("请输入稀疏矩阵的行数,列数,非零元素的个数:"); scanf("%d%d%d",&M.mu,&M.nu,&M.tu); M.rhead=(OLink *)malloc((M.mu+1)*sizeof(OLNode)); M.chead=(OLink *)malloc((M.nu+1)*sizeof(OLNode)); for( i=1;i<=M.mu;i++)M.rhead[i]=NULL; for( i=1;i<=M.nu;i++)M.chead[i]=NULL; printf("请输入元素的行 列 值。最后输入 0 0 0 为结束\n"); scanf("%d%d%d",&i,&j,&e); while(i!=0){ p=(OLink)malloc(sizeof(OLNode)); p->i=i;p->j=j;p->e=e; if(M.rhead[i]==NULL||M.rhead[i]->j>j){p->right=M.rhead[i];M.rhead[i]=p;} else{ q=M.rhead[i]; while(q->right&&q->right->j<j)q=q->right; p->right=q->right; q->right=p;} if(M.chead[j]==NULL||M.chead[j]->i>i){p->down=M.chead[j];M.chead[j]=p;} else{ q=M.chead[j]; while(q->down&&q->down->i<i)q=q->down; p->down=q->down; q->down=p; } scanf("%d%d%d",&i,&j,&e); } return 1; }//创建十字链表 int Compare(int a1,int b1,int a2,int b2){ if(a1>a2)return 1; else if(a1<a2)return -1; else if(b1>b2)return 1; if(b1<b2)return -1; else return 0; } int SMatrix_ADD(CrossList *A,CrossList *B){ OLNode *pa,*pb,*pre,*p,*cp[100]; int i,j,t; t=A->tu+B->tu; for(j=1;j<=A->nu;j++)cp[j]=A->chead[j]; for(i=1;i<=A->mu;i++){ pa=A->rhead[i]; pb=B->rhead[i]; pre=NULL; while(pb){ if(pa==NULL||pa->j>pb->j){ p=(OLink)malloc(sizeof(OLNode));

if(!pre)A->rhead[i]=p; else pre->right=p; p->right=pa; p->i=i;p->j=pb->j;p->e=pb->e; if(!A->chead[p->j]){ A->chead[p->j]=cp[p->j]=p; } else{ cp[p->j]->down=p; cp[p->j]=p; } pb=pb->right; } else if(pa->j<pb->j){pre=pa; else if(pa->e+pb->e){ t--; pa->e+=pb->e; pre=pa; pb=pb->right;} else { t=t-2; if(!pre)A->rhead[i]=pa->right;

pre=p; p->down=NULL;

pa=pa->right;} pa=pa->right;

else pre->right=pa->right; p=pa;pa=pa->right; if(A->chead[p->j]==p)A->chead[p->j]=cp[p->j]=p->down; cp[p->j]->down=p->down; free(p); pb=pb->right; } } } A->mu=A->mu>B->mu?A->mu:B->mu; A->nu=A->nu>B->nu?A->nu:B->nu; return 1; }//十字链表相加

else

int ShowMAtrix(CrossList *A){ int col; OLink p; for(col=1;col<=A->mu;col++)if(A->rhead[col]){p=A->rhead[col]; while(p){printf("%3d%3d%3d\n",p->i,p->j,p->e);p=p->right;} } return 1; }//十字链表显示 int MultSMatrix_OL(CrossList M, CrossList N, CrossList &Q) { int i, j, e; //中间 变量 OLink p0, q0, p, pl, pla; //中间变量 //检查稀疏矩阵 M 的列数和 N 的行数是否对应相等 if(M.nu != N.mu) { printf ( "稀疏矩阵 A 的列数和 B 的行数不相等,不能相乘。\n" ); return 0; } Q.mu = M.mu, Q.nu = N.nu, Q.tu = 0; if(!(Q.rhead = (OLink *)malloc((Q.mu + 1) * sizeof(OLink)))) exit(-2); if(!(Q.chead = (OLink *)malloc((Q.nu + 1) * sizeof(OLink)))) exit(-2); for(i = 1; i <= Q.mu; i++) Q.rhead[i] = NULL;

for(i = 1; i <= Q.nu; i++) Q.chead[i] = NULL; //相乘 for(i =1; i <= Q.mu; i++) for(j = 1; j <= Q.nu; j++) { p0 = M.rhead[i], q0 = N.chead[j], e = 0; while(p0&&q0) { if( p0->j > q0->i) q0 = q0->down; //M 的列大于 N 的行,则 N 的列指针后移 if(p0->j < q0->i) p0 = p0->right; //M 的列小于 N 的行,则 M 的行指针右移 else { e += p0->e * q0->e; q0 = q0->down, p0 = p0->right; //移动指针 } } if(e)//乘积不为 0 { if(!(p = (OLink)malloc(sizeof(OLNode)))) exit(-2); Q.tu++;//非零元素增加 p->i = i, p->j = j, p->e = e, p->right = NULL, p->down = NULL; //赋值,指针后移 //将 p 插入十字链表 //行插入 if(Q.rhead[i] == NULL) //若 p 为该行的第 1 个结点 Q.rhead[i] = pl = p; //p 插在该行的表头且 pl 指向 p(该行的最后一个结 点) else pl->right = p, pl = p; //插在 pl 所指结点之后,pl 右移 //列插入 if(Q.chead[j] == NULL) //若 p 为该列的第一个点 Q.chead[j] = p; //该列的表头指向 p else { pla = Q.chead[j];//pla 指向 j 行的第 1 个结点 while(pla->down) pla = pla->down;//pla 指向 j 行最后一个结点 pla->down = p; } } } return 1; } //十字链表相乘 void TurnSMatrix_OL(CrossList &M) { int col,row; for(col=1;col<=M.mu;col++) { q=p=M.rhead[col]; while(q){ row=p->i; p->i=p->j; p->j=row; p->down=q; } } }//十字链表转置 OLink p,q;

q=p->right;

p->right=p->down;

int DestroySMatrix_OL(CrossList &M) { int i;//中间变量 OLink p, q;//中间变量 if(!M.rhead || !M.chead) return 1;//M 不存在 else {//M 存在 if(M.chead)//所有列链表头指针置为空 for(i = 1; i <= M.nu; i++)

M.chead[i] = NULL; if(M.rhead)//按行释放节点 for(i = 1; i <= M.mu; i++) { p = M.rhead[i]; while(p) = p->right; free(q); } } //释放行和列链表头指针指向基址 free(M.rhead); free(M.chead); //返回 return 1; } }//十字链表销毁

{

q = p, p

void main(){ int n,i; //TSMatrix M,T,S; CrossList MM,TT,SS; printf("请你选择操作:\n1:用十字链表创建稀疏矩阵。\n2:退出\n(1|2):"); scanf("%d",&n); switch(n){ case 1:{CreateSMatix_OL(MM); printf("已经选择十字链表创建稀疏矩阵,请选择操作\n 1:稀疏矩阵转置\n 2:稀疏矩阵相 加\n 3:稀疏矩阵相乘\n 4:退出\n(1|2|3|4):"); scanf("%d",&i); switch(i){ case 1: TurnSMatrix_OL(MM); ShowMAtrix(&MM); break; case 2: printf("请你输入另一个稀疏矩阵:"); CreateSMatix_OL(TT); SMatrix_ADD(&MM,&TT); ShowMAtrix(&MM);break; case 3:printf("请你输入另一个稀疏矩阵:"); CreateSMatix_OL(TT); MultSMatrix_OL(MM,TT,SS); ShowMAtrix(&SS);break; case 4:exit(0); }};break; case 2:exit(0); default :printf("erorr"); } }


赞助商链接
相关文章:
稀疏矩阵课程设计
数据结构课程设计 设计说明书 稀疏矩阵相关操作的实现...运用 C、JAVA、VC++编程 工具,编程实现稀疏矩阵的...运行程序 ......
数据结构课程设计-稀疏矩阵实现与应用
数据结构课程设计-稀疏矩阵实现与应用_工学_高等教育_教育专区。安徽省巢湖学院...源程序清单和执行结果---12 7、C ...
数据结构课程设计 报告 (十字链表实现稀疏矩阵的加法)
数据结构课程设计 报告 (十字链表实现稀疏矩阵的加法)_计算机软件及应用_IT/...附录:源代码 (只含 pro1.cpp): //pro1.cpp #include<iostream> using ...
数据结构课程设计稀疏矩阵应用
程序设计 数组的运算 实验目的:掌握稀疏矩阵的压缩存储方法及主要运算的实现。 实验内容与要求:设计一个稀疏矩阵计算器, 要求能够: ⑴输入并建立稀疏矩阵; ⑵输出...
稀疏矩阵的存储实现
稀疏矩阵的存储实现_计算机软件及应用_IT/计算机_...武汉理工大学《数据结构》课程设计说明书 课程设计...源代码...17 附3 运行结果......
课程设计报告—稀疏矩阵的完全链表表示及其运算
课程设计报告—稀疏矩阵的完全链表表示及其运算_计算机软件及应用_IT/计算机_专业...一、 源程序 #include<stdio.h> #include<stdlib.h> #include<iostream.h> ...
稀疏矩阵的操作 --课程设计
稀疏矩阵的操作 --课程设计_工学_高等教育_教育专区。课程设计 数据结构 ...的应用软件和系 统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计...
数据结构课程设计(稀疏矩阵运算器)
数据结构课程设计(稀疏矩阵运算器) - 代码完全无误,算法结合了数组和三元组的处理,多样易懂,求个财富值!
《数据结构 课程设计》稀疏矩阵实验报告
《数据结构 课程设计稀疏矩阵实验报告_电脑基础知识...源代码 #include <stdio.h> #define m 6 #...©2016 Baidu 使用百度前必读 | 文库协议 | 广告...
数据结构课设报告—稀疏矩阵转置和乘法
数据结构课设报告—稀疏矩阵转置和乘法_理学_高等教育_教育专区。数据结构课程...2、使用 C++语言编写程序,源程序需加必要的注释。 3、三人一组提交一份设计...
更多相关标签: