- //多重列表的实现
- #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;
- }