类型定义
#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;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。