1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 数据结构--数组和广义表--创建以十字链表为存储结构的矩阵

数据结构--数组和广义表--创建以十字链表为存储结构的矩阵

时间:2022-04-17 05:17:07

相关推荐

数据结构--数组和广义表--创建以十字链表为存储结构的矩阵

在链表中,每个非零元可以用含有5个域的结点来表示,其中i,j,e分别表示非零元的行标,列标,值,向右域right用以链接同一行中的下一个非零元,向下域用以链接同一列中的下一个非零元。同一行中的非零元通过right域链接成一个线性链表,同一列中的非零元通过down域链接成一个线性链表,每个非零元即是某个行链接表中的结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表,故称这样的存储结构为十字链表,可用两个分别存储行链表的头指针和列链表的头指针一维数组表示之。

构造十字链表矩阵的代码如下:

//稀疏矩阵的十字链表存储表示typedef int ElemType;typedef struct OLNode{int i,j; //行标和列标ElemType e;struct OLNode *right,*down;OLNode(){i=j=0;e=0;right=NULL;down=NULL;}}OLNode,*OLink;typedef struct CrossList{OLink *rhead,*chead; //行和列链表头指针向量基址由CreateSMatrix分配int mu,nu,tu; //矩阵行数,列数,非零元个数CrossList(){rhead=NULL;chead=NULL;mu=nu=tu=0;}}CrossList;Status CreateSMatrix_OL(CrossList &M){//创建稀疏矩阵M。采用十字链表存储表示cout<<"please input 'mu','nu','tu' :";int m,n,t;cin>>m>>n>>t;if(t>m*n) return ERROR;M.mu=m; M.nu=n; M.tu=t;if(!(M.rhead=(OLink*)malloc(M.mu*sizeof(OLink)))) exit(OVERFLOW);if(!(M.chead=(OLink*)malloc(M.nu*sizeof(OLink)))) exit(OVERFLOW);//M.rhead[]=M.chead[]=NULL; //初始化行列头指针向量;各行列链表为空链表for(int k=0;k<M.mu;++k){M.rhead[k]=NULL;}for(int k=0;k<M.nu;++k){M.chead[k]=NULL;}int i,j;ElemType e;for(cin>>i>>j>>e;i!=0;cin>>i>>j>>e){//按任意次序输入非零元OLNode* p;if(!(p=(OLNode*)malloc(sizeof(OLNode)))) exit(OVERFLOW);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{//寻查在行表中的插入位置OLNode* q=NULL;for(q=M.rhead[i];(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{//寻查在行表中的插入位置OLNode* q=NULL;for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down);p->down=q->down;q->down=p;}//完成列插入}return OK;}int main(){CrossList m;CreateSMatrix_OL(m);return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。