数据结构 课程设计 十字链表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计十字链表
xx学院
一、问题的分析和任务定义:
该设计是采用十字链表表示稀疏矩阵,并实现矩阵的加法运算。还要检查有关运算的条
件,并对错误的条件产生报警。
根据对该程序任务的理解,对本程序分别从以下几个方面进行分析: 1.输入数据的的类型和输入的范围
该程序首先输入稀疏矩阵的行数和列数,再输入一个有非零元素的行号,有非零元素的
列号,再输入非零元素的值,然后输入当前行下一个元素所在的列,如果该行只有一个非零
元素就直接输入-1结束当前行的一组数据,如果还有其他的非零元素的话就输入当前行下
一个非零元素所在的列,就这样,直到该当前行的非零元素输入完。然后再输入当前列下一
个非零元素的所在的行,其步骤与前一步相同。其输入值都为稀疏矩阵的数据,类型都为整
型。
2.输出数据的形式
这样得到一个稀疏矩阵a,以同样的方法就可以得到另一个稀疏矩阵b,最后就可以得到稀疏矩阵a和稀疏矩阵b的和矩阵.输出是以稀疏矩阵的标准形式输出的。输出值的有两种:
一种是字符,一种是整数。输出的字符型数据是稀疏矩阵的代号,输出的整型数据为稀疏矩
阵的值。
3.测试数据
测试数据一:测试数据二:稀疏矩阵的行数与列数:3 3 稀疏矩阵的行数与列数:3 3 矩阵a:矩阵b:矩阵a:矩阵b: 2 0 0 0 0 2 2 0 0 0 0 0
0 0 6 3 0 0 0 0 0 0 0 0
7 0 0 2 0 5 0 0 0 7 0 0
二、概要设计和数据结构的选择:
1.算法(程序)中用到的所有各种数据类型的定义:
定义整型数据为int m,int n,分别代表矩阵的行和列;
定义十字链表类型结点OLnode *h,*p分别代表为头结点开辟空间和指向下一结点;
在主函数中定义OLnode *a,*b,分别表示a,b两个稀疏矩阵。 2.各程序模块之间的层次关系:
程序中用到的函数:
1 OLnode *create(int m,int n); 创建以十字链表表示的一个元素全为零的稀疏矩阵。
2 int insert(OLnode *a ,int row,int col,int val); 创建稀疏矩阵结点插入函数。
3 OLnode *shuru(); 创建稀疏矩阵的输入函数。
4 void shuchu(OLnode *a); 创建稀疏矩阵的输出函数。
5 OLnode
*add(OLnode *a,OLnode *b);创建对两个相同行列数矩阵进行加法运算函数。
6 void main();创建该程序的主函数。
3.程序中数据结构的选择:如下定义:
typedef struct lnode //十字链表结点类型
{
int row,col;
int val;
struct lnode *rptr ,*cptr ;
}OLnode;
其中row,col和val域分别用来存储非零元素的行号、列号和元素值rptr域用来存储指向同一行下一个结点的指针,cptr域用来指向同一列下一个结点的指针,如果不存在下
一个结点,则相应的指针域为空。
1
4.流程图:
根据利用十字链表表示稀疏矩阵,并实现矩阵的加法运算的算法,可以设计如下流程图:
该流程图体现了本实验问题的算法设计思想:首先,定义十字链表结点的类型并利用十字链
表建立相应的稀疏矩阵,然后再将建立好的两个相同行列数的稀疏矩阵进行求和运算并输出
最终结果。
定义十字链表结点类型
建立十字链表表示稀疏矩阵
稀疏矩阵a 稀疏矩阵b
稀疏矩阵a,b求和
输出结果
结束
图1. 程序流程图三、详细设计和编码:
1.建立一个十字链表表示的稀疏矩阵,定义为m行n列,并为头结点开辟空间,同时定义该稀疏矩阵不会多于100列,每个行链表是一个环,使全部行链表头结点构成环;再定义该
稀疏矩阵不会多于100行,每个列链表是一个环,使全部列链表头结点构成环OLnode *create(int m,int n) //m行n列
{ OLnode *h,*p;
int k;
h=(OLnode *)malloc(sizeof(OLnode)); //为头结点开辟空间 h->row=m;h-
>col=n;h->val=0; //行,数和非零元素元素值 h->rptr=(OLnode
*)malloc(sizeof(OLnode)*n);
h->cptr=(OLnode *)malloc(sizeof(OLnode)*m);
for(p=h->cptr,k=0;k { p->col=100; //定义该稀疏矩阵不会多于100列 p->rptr=p; //每个行链表是一个环 p->cptr=k for(p=h->rptr ,k=0;k { 2 p->row=100; //该稀疏矩阵不会多于100行 p->cptr=p; //每个列链表是一个环 p->rptr=k } return h; } 2.在十字链表中插入一个结点,对于不合理的行列号返回错误。然后分别对行和列进行插 入 int insert(OLnode *a ,int row,int col,int val) { OLnode *p,*q,*r,*u,*v; /* 在十字链表中插入一个结点*/ if(row>=a->row||col>=a->col) return -2; /* 不合理的行列号 */ r=(OLnode *)malloc(sizeof(OLnode)); r->row=row;r->col=col;r->val=val; p=a->cptr +row;q=p->rptr ; while(q->col if(q->col==col) return -1; //该行已有col行元素 u=a->rptr +col;v=u->cptr ; while(v->row {u=v;v=v->cptr ;} if(v->row==row) return -1; //该列已有row行元素 p->rptr=r; r->rptr=q; //插入到行链中 u->cptr=r; r->cptr=v; //插入到列链中 a->val=val; return 0; //插入成功