//多重列表的实现
#include<stdio.h>
#include<stdlib.h>
struct lnode
{
int row,col,value;
};
//没有用到down指针
//没有用到tag和next指针
typedef struct node
{
int tag;//区分头结点(0)和非零元素结点(1)
struct node* right;
struct node* down;
//共用体与结构体的区别在于:修改一个成员会影响其他所有成员(同一时刻只能保存一个成员的值)
union
{
struct node *next;//头结点
struct lnode k;//非零元素结点
}con;
}node;
typedef node* dlist;
typedef struct dlist2
{
dlist z[105];
}dlist2;
//用llist指针找到多个空的头节点
typedef dlist2* llist;
int js1=0,js[105];//找到链表中每个头节点链接的第一个节点
llist empty()
{
int a,b,c;
printf("请输入矩阵行数:");
scanf("%d",&a);
printf("请输入矩阵列数:");
scanf("%d",&b);
printf("请输入总元素:");
scanf("%d",&c);
llist headnode;
dlist p_now[105],p_next[105];
int i,j;int x;
//分配内存!
headnode=(llist)malloc(sizeof(dlist2));
for(i=1;i<=100;i++) headnode->z[i]=(dlist)malloc(sizeof(node));
for(i=1;i<=a;i++)
{
js1=0;
for(j=1;j<=b;j++)
{
scanf("%d",&x);
if(x!=0)
{
js1++;js[j]++;
//储存输入的结点
p_next[i]=(dlist)malloc(sizeof(node));
p_next[i]->con.k.row=i;
p_next[i]->con.k.col=j;
p_next[i]->con.k.value=x;
p_next[i]->right=NULL;
p_next[j]=(dlist)malloc(sizeof(node));
p_next[j]->con.k.row=i;
p_next[j]->con.k.col=j;
p_next[j]->con.k.value=x;
p_next[j]->down=NULL;
//接入链表(记得特殊处理直接链接头节点的点)
if(js[j]==1)
{
headnode->z[j]->down=p_next[j];
p_now[j]=headnode->z[j];
}
else p_now[j]->down=p_next[j];//第j列向下链接
if(js1==1)
{
headnode->z[i]->right=p_next[i];
p_now[i]=headnode->z[i];
}
else p_now[i]->right=p_next[i];//第i行向右链接
//预备处理后续结点
p_now[i]=p_next[i];
p_now[j]=p_next[j];
}
}
}
headnode->z[a+1]=NULL;//为"按行输出"做准备
return headnode;
}
void print(llist headnode)
{
int i;dlist head;
for(i=1;headnode->z[i]!=NULL;i++)
{
//找到一行的头节点
head=headnode->z[i];
head=head->right;
//输出一行的全部元素
while(head!=NULL)
{
printf("(%d,%d,%d) ",head->con.k.col,head->con.k.row,head->con.k.value);
head=head->right;
}
printf("\n");
}
}
int main()
{
llist na;
na=empty();
printf("输出矩阵:\n");
print(na);
return 0;
}