稀疏矩阵十字链表表示
类型定义
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define MAX 100 /* 稀疏矩阵的十字链表表示: 非零元素节点与表头节点公用一种类型 */ typedef struct matrixnode { int row,col; struct matrixnode *right,*down; union { int val;//非零元素节点的值 struct matrixnode*next;//指向下一个表头节点 }tag; }matrixnode; typedef matrixnode*spmatrix; typedef spmatrix headspmatrix[MAX];//保存i行/i列的表头节点指针 void say(spmatrix p) { printf("row:%d\ncol:%d\n",p->row,p->col); printf("right---%p\ndown---%p\n",p->right,p->down); } void Createspmatrix (headspmatrix h) { int m,n,t,s,i,r,c,v; spmatrix p,q; printf("矩阵的行数.列数.和非零元素的个数:\n"); scanf("%d%d%d",&m,&n,&t); //初始化一个表头节点,储存链表的行数,列数 p=(spmatrix)malloc(sizeof(matrixnode)); h[0]=p; p->row=m;p->col=n; s=m>n?m:n;//表头节点个数取行列数的较大值 h[0]->tag.val=s; for(i=1;i<=s;i++) { p=(spmatrix)malloc(sizeof(matrixnode)); h[i]=p; h[i-1]->tag.next=p;//将上一个表头节点与该表头节点连接 p->row=p->col=0;//表头节点的row和col置空 p->down=p->right=p;//当前表头节点初始化为空,down和right指向自身。 } h[s]->tag.next=h[0];//最后一个表头节点与头节点连接,形成环 for(i=1;i<=t;i++) { printf("请输入非零元素的行号,列号,值:\n"); scanf("%d%d%d",&r,&c,&v); p=(spmatrix)malloc(sizeof(matrixnode)); //printf("46\n"); p->row=r;p->col=c;p->tag.val=v;//printf("47\n"); q=h[r];//取得该行表头节点指针 //printf("49\n"); while(q->right!=h[r]&&q->right->col<c)//连接到相应行 { q=q->right; //printf("52\n"); } // printf("51\n"); p->right=q->right; q->right=p; q=h[c];//取得该列表头节点指针 while(q->down!=h[c]&&q->down->row<r)//连接到相应列 q=q->down; p->down=q->down; q->down=p; } }
相关操作
//在十字链表中查找元素,通过指针返回对应坐标,函数返回1表示查找成功 int locatespmatrix(headspmatrix h,int x,int *rowx,int *colx) { spmatrix p,q; p=h[0]->tag.next; while(p!=h[0]) { q=p->right; while(p!=q) { if(q->tag.val==x) { *rowx=q->row; *colx=q->col; return 1; } q=q->right; } p=p->tag.next; } return 0; } //遍历稀疏矩阵的十字链表并按行优先输出 void matrix_display(headspmatrix h) { spmatrix p,q; p=h[0]->tag.next; while(p!=h[0]) { q=p->right; while(p!=q) { printf("%d %d %d",q->row,q->col,q->tag.val); q=q->right; } printf("\n"); p=p->tag.next; } } //销毁整个十字链表 void matrix_destory(headspmatrix h) { spmatrix p,q,t; p=h[0]->tag.next; int s=0; while(p!=h[0]) { q=p->right; while(p!=q) { t=q->right; free(q); printf("%d is kill\n",++s); q=t; } p=p->tag.next; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。