• 数据结构——多重链表的实现


    1. //多重列表的实现
    2. #include<stdio.h>
    3. #include<stdlib.h>
    4. struct lnode
    5. {
    6. int row,col,value;
    7. };
    8. //没有用到down指针
    9. //没有用到tag和next指针
    10. typedef struct node
    11. {
    12. int tag;//区分头结点(0)和非零元素结点(1)
    13. struct node* right;
    14. struct node* down;
    15. //共用体与结构体的区别在于:修改一个成员会影响其他所有成员(同一时刻只能保存一个成员的值)
    16. union
    17. {
    18. struct node *next;//头结点
    19. struct lnode k;//非零元素结点
    20. }con;
    21. }node;
    22. typedef node* dlist;
    23. typedef struct dlist2
    24. {
    25. dlist z[105];
    26. }dlist2;
    27. //用llist指针找到多个空的头节点
    28. typedef dlist2* llist;
    29. int js1=0,js[105];//找到链表中每个头节点链接的第一个节点
    30. llist empty()
    31. {
    32. int a,b,c;
    33. printf("请输入矩阵行数:");
    34. scanf("%d",&a);
    35. printf("请输入矩阵列数:");
    36. scanf("%d",&b);
    37. printf("请输入总元素:");
    38. scanf("%d",&c);
    39. llist headnode;
    40. dlist p_now[105],p_next[105];
    41. int i,j;int x;
    42. //分配内存!
    43. headnode=(llist)malloc(sizeof(dlist2));
    44. for(i=1;i<=100;i++) headnode->z[i]=(dlist)malloc(sizeof(node));
    45. for(i=1;i<=a;i++)
    46. {
    47. js1=0;
    48. for(j=1;j<=b;j++)
    49. {
    50. scanf("%d",&x);
    51. if(x!=0)
    52. {
    53. js1++;js[j]++;
    54. //储存输入的结点
    55. p_next[i]=(dlist)malloc(sizeof(node));
    56. p_next[i]->con.k.row=i;
    57. p_next[i]->con.k.col=j;
    58. p_next[i]->con.k.value=x;
    59. p_next[i]->right=NULL;
    60. p_next[j]=(dlist)malloc(sizeof(node));
    61. p_next[j]->con.k.row=i;
    62. p_next[j]->con.k.col=j;
    63. p_next[j]->con.k.value=x;
    64. p_next[j]->down=NULL;
    65. //接入链表(记得特殊处理直接链接头节点的点)
    66. if(js[j]==1)
    67. {
    68. headnode->z[j]->down=p_next[j];
    69. p_now[j]=headnode->z[j];
    70. }
    71. else p_now[j]->down=p_next[j];//第j列向下链接
    72. if(js1==1)
    73. {
    74. headnode->z[i]->right=p_next[i];
    75. p_now[i]=headnode->z[i];
    76. }
    77. else p_now[i]->right=p_next[i];//第i行向右链接
    78. //预备处理后续结点
    79. p_now[i]=p_next[i];
    80. p_now[j]=p_next[j];
    81. }
    82. }
    83. }
    84. headnode->z[a+1]=NULL;//"按行输出"做准备
    85. return headnode;
    86. }
    87. void print(llist headnode)
    88. {
    89. int i;dlist head;
    90. for(i=1;headnode->z[i]!=NULL;i++)
    91. {
    92. //找到一行的头节点
    93. head=headnode->z[i];
    94. head=head->right;
    95. //输出一行的全部元素
    96. while(head!=NULL)
    97. {
    98. printf("(%d,%d,%d) ",head->con.k.col,head->con.k.row,head->con.k.value);
    99. head=head->right;
    100. }
    101. printf("\n");
    102. }
    103. }
    104. int main()
    105. {
    106. llist na;
    107. na=empty();
    108. printf("输出矩阵:\n");
    109. print(na);
    110. return 0;
    111. }

    7bf9c9a7691f4d7bafa5814a55b40810.jpg

     

     

  • 相关阅读:
    某车联网App 通讯协议加密分析(三) Trace Block
    浅谈顺序表基本操作
    浅析即时通讯开发WebSocket热门疑问
    什么是RAM?如何清理电脑RAM?
    Java手动分页工具类
    rust学习笔记(1-7)
    Debian | 更换 Gnome 至 Xfce4
    elasticsearch-exporter部署手册
    C++ Tutorials: C++ Language: Classes: Special members
    DWB主题事实及ST数据应用层构建,220803,,
  • 原文地址:https://blog.csdn.net/2302_76169191/article/details/133643808