“ Ctrl AC!一起 AC!”
目录
稀疏矩阵的十字链表表示:
- 每一行的非零元素构成一个带表头的环形链表
- 每一列的非零元素构成一个带表头的环形链表
- 第i行和第i列的表头是同一个
- 所有表头结点构成一个新的带表头的环形链表
因此:
十字链表的表示中有非零元素结点和表头结点两类结点
其中表头结点的row,col均为零,表头结点构成的环形链表的表头的row和col分别代表总行数和总列数。
【本例中的行下标和列下标均假设从1开始算起】
十字链表中结点的结构:
typedef struct matrixnode{
int row,col;
struct matrixnode *right,*down;
union{
int value;
struct matrixnode *next;
}tag;
}matrixnode;
typedef matrixnode *spmatrix; //指向上述结点的指针
typedef spmatrix headspmatrix[100]; // headspmatrix = 类型spmatrix+容量[100] = 类型matrixnode*+容量[100] 即指针数组
创建稀疏矩阵的十字链表表示:
void Createspmatrix(headspmatrix h){
int m,n,t,s,i,r,c,v;
spmatrix p,q; //两个结点指针,可召唤结点
printf("矩阵的行数,列数和非零元素个数:");
scanf("%d%d%d",&m,&n,&t);
p=(spmatrix)malloc(sizeof(matrixnode));
h[0]=p; //h[0]为表头环形链表的表头结点
p->row=m;p->col=n;
s=m>n?m:n; //表头结点数组的最大长度为s
for(i=1;i<=s;i++){ //初始化
p=(spmatrix)malloc(sizeof(matrixnode));
h[i]=p;
h[i-1]->tag.next=p; //上一个表头结点的下一个结点为p
p->row=p->col=0;
p->down=p->right=p;
}
h[s]->tag.next=h[0];
for(int i=1;i<=t;i++){
printf("请输入非零元素的行号,列号和值:");
scanf("%d%d%d",&r,&c,&v);
p=(spmatrix)malloc(sizeof(matrixnode));
p->row=r;p->col=c;p->tag.val=v;
q=h[r]; //将该非零元素插入到所在行的环形链表
while(q->right!=h[r]&&q->right->col<c){
q=q->right;
}
p->right=q->right;
q->right=p;
q=h[c]; //将该非零元素插入到所在列的环形链表
whiille(q->down!=h[c]&&q->down->row<r){
q=q->down;
}
p->down=q->down;
q->down=p;
}
}
稀疏矩阵十字链表的查找:
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(q!=p){
if(q->tag.val==x){
*rowx=q->row;
*colx=q->col;
return 1; //查找成功
}
q=q->right; //该行下一个
}
p=p->tag.next; //下一行
}
return 0; //查找失败
}
感谢阅读!!!
“ Ctrl AC!一起 AC!”