静态链表——集合运算(A-B)U(B-A)

一时失言乱红尘 2022-05-14 15:51 381阅读 0赞

来源:严蔚敏《数据结构》(书上讲的很清楚)

先介绍静态链表,再以例题的形式展示。

静态链表的存储结构

  1. #define maxn 15
  2. struct space
  3. {
  4. int cur;
  5. int key;
  6. }s[maxn];

这种描述方便在于,不设“指针”类型的高级程序设计语言中使用链表结构。

在上面的结构中,一个分量表示一个节点,同时用游标cur代替指针指示节点在数组中的位置。

数组的零分量可以看成头结点,其指针域指示链表的第一个节点。

做线性表的插入和删除的时候,不需要移动元素,只需要修改指针。具有链式存储的优点。

思考:下面遍历的时候,为什么用i=s[i].cur;

  1. int LocateElem_SL(SLinkList *s,ElemType e)
  2. {
  3. //在静态链表中查找第一个值为e的元素
  4. //若找到,则返回它在链表中的位置,否则返回0
  5. i=s[0].cur;
  6. while(i&&s[i].date!=e)
  7. i=s[i].cur;
  8. return i;
  9. }
  10. 假设,s\[0\].cur指示第一个节点在数组中的位置。若设i=s\[0\].cur,则s\[i\].date存储线性表的第一个元素,s\[i\].cur指示第二个节点在数组中的位置。
  11. 一般请款下,若第i个分量节点的第k个节点,则s\[i\].cur指示第k+1个节点的位置。
  12. 因此,静态链表中实现线性表的操作和动态链表相似。i=s\[i\].cur的操作实为指针的后移(类似p=p->next)。

下面以集合(A-B)U(B-A)为例,讨论静态链表的算法。

  1. 题目:在终端输入集合元素,先建立表示集合A的静态链表S,然后输入集合B的元素,同时查找S表。若存在和B相同的元素,则从S表中删除,否则将此元素插入S中。
  2. 思路:将整个数组空间初始化成一个链表。从备用空间中取得一个节点。将空闲的节点链接到备用链表中。
  3. #include<stdio.h>
  4. #define maxn 15
  5. struct space
  6. {
  7. int cur;
  8. int key;
  9. }s[maxn];
  10. void InitSpace_SL(struct space *s)//n+1为静态链表的长度
  11. {
  12. int i;
  13. for(i=0;i<maxn-1;i++)
  14. s[i].cur=i+1;
  15. s[maxn-1].cur=0;
  16. }
  17. int Malloc_SL(struct space *s)
  18. {
  19. int i=s[0].cur;
  20. if(i)
  21. s[0].cur=s[i].cur;
  22. return i;
  23. }
  24. void free_SL(struct space *s,int k)//将下标为k的节点回收
  25. {
  26. s[k].cur=s[0].cur;
  27. s[0].cur=k;
  28. }
  29. void PrintSpace_SL(struct space *s)
  30. {
  31. int i;
  32. for(i=s[1].cur;i!=0;i=s[i].cur)//第一个里面不存东西
  33. printf("%d ",s[i].key);
  34. printf("\n");
  35. }
  36. void different(struct space *s)
  37. {
  38. InitSpace_SL(s);
  39. int head=Malloc_SL(s);
  40. int last=head;
  41. int i,j,k;
  42. int m,n;
  43. scanf("%d%d",&m,&n);//输入集合A和集合B的元素的个数
  44. for(j=1;j<=m;j++)//建立集合A的链表
  45. {
  46. i=Malloc_SL(s);//分配节点
  47. scanf("%d",&s[i].key);
  48. s[last].cur=i;//插入表尾
  49. last=i;
  50. }
  51. s[last].cur=0;
  52. //PrintSpace_SL(s);
  53. int b;
  54. for(j=1;j<=n;j++)
  55. {
  56. scanf("%d",&b);
  57. int p=head;
  58. k=s[head].cur;
  59. while(k&&s[k].key!=b)
  60. {
  61. p=k;
  62. k=s[k].cur;
  63. }
  64. if(k==0)
  65. {
  66. i=Malloc_SL(s);
  67. s[i].key=b;
  68. s[i].cur=0;
  69. s[last].cur=i;
  70. last=i;
  71. }
  72. else
  73. {
  74. s[p].cur=s[k].cur;
  75. free_SL(s,k);
  76. }
  77. }
  78. }
  79. int main()
  80. {
  81. different(s);
  82. PrintSpace_SL(s);
  83. return 0;
  84. }

静态链表的练习:静态链表——UVA11988(破损键盘)

发表评论

表情:
评论列表 (有 0 条评论,381人围观)

还没有评论,来说两句吧...

相关阅读

    相关 静态

    我们可以用数组来构造链表:        在数组中增加一个或两个指针域,用来存放下一个或上一个数据元素的下标,这样就可以构成单链表或者双向链表。 因为没有发生动态申请内存空

    相关 静态

    以前学习的各种链表都是由指针实现的,链表中结点的分配和回收(即释放)都是由系统提供的标准函数malloc和free动态实现的,故称之为动态链表。但是有的高级语言,如BASIC、

    相关 静态

     静态链表相当于是用一个数组来实现线性表的链式存储结构,大概结构图如下![1358343961_3547.png][]                         

    相关 静态

    当某些语言不支持指针的时候,我们如何实现一个链表的数据结构呢??那么我们可以采用静态链表 define MAXSIZE 999 typedef struct{

    相关 静态

    一、解析 我们把这种用数组描述的链表叫做静态链表,又称游标实现法。 实现方法: 首先让数组的元素都是有两个数据域组成,data和cur。也就是说,数组的每个下标都对应一个