PTA-数据结构 两个有序链表序列的交集

朱雀 2022-05-09 08:14 235阅读 0赞

7-3 两个有序链表序列的交集 (20 分)

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

  1. 1 2 5 -1
  2. 2 4 5 8 10 -1

输出样例:

  1. 2 5
  2. //库函数头文件包含
  3. #include<stdio.h>
  4. #include<malloc.h>
  5. #include<stdlib.h>
  6. //函数状态码定义
  7. #define TRUE 1
  8. #define FALSE 0
  9. #define OK 1
  10. #define ERROR 0
  11. #define INFEASIBLE -1
  12. #define OVERFLOW -2
  13. typedef int Status;
  14. typedef int ElemType;
  15. typedef struct LNode{
  16. ElemType data;
  17. struct LNode* next;
  18. }LNode,*Linklist;
  19. Status InitList(Linklist &L)
  20. {
  21. L = (Linklist)malloc(sizeof(LNode));
  22. if(!L)
  23. exit(OVERFLOW);
  24. L->next = NULL;
  25. return OK;
  26. }
  27. void InsertList(Linklist &L)
  28. {
  29. ElemType e;
  30. Linklist p = L;
  31. Linklist curp;
  32. while(scanf("%d",&e) && e!=-1)
  33. {
  34. curp = (Linklist)malloc(sizeof(LNode));
  35. curp->data = e;
  36. curp->next = NULL;
  37. p->next = curp;
  38. p = p->next;
  39. }
  40. }
  41. void PrintList(Linklist &L)
  42. {
  43. if(!L)
  44. {
  45. printf("NULL\n");
  46. return ;
  47. }
  48. Linklist p = L->next;
  49. int flag = 0;
  50. while(p)
  51. {
  52. if(!flag)
  53. {
  54. printf("%d",p->data);
  55. flag++;
  56. }
  57. else
  58. printf(" %d",p->data);
  59. p = p->next;
  60. }
  61. printf("\n");
  62. }
  63. Linklist IntersectList(Linklist s1,Linklist s2)
  64. {
  65. Linklist p1 = s1->next;
  66. Linklist p2 = s2->next;
  67. if(!p1 || !p2)
  68. return NULL;
  69. Linklist s3 = s1;
  70. Linklist p3 = s3;
  71. while(p1 && p2)
  72. {
  73. if(p1->data == p2->data)
  74. {
  75. p3->next = p1;
  76. p1 = p1->next;
  77. p2 = p2->next;
  78. p3 = p3->next;
  79. p3->next = NULL;
  80. }
  81. else if(p1->data < p2->data)
  82. p1 = p1->next;
  83. else if(p1->data > p2->data)
  84. p2 = p2->next;
  85. }
  86. if(p3==s3)
  87. return NULL;
  88. return s3;
  89. }
  90. int main()
  91. {
  92. Linklist s1,s2;
  93. InitList(s1);
  94. InsertList(s1);
  95. InitList(s2);
  96. InsertList(s2);
  97. Linklist s3 = IntersectList(s1,s2);
  98. PrintList(s3);
  99. return 0;
  100. }

发表评论

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

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

相关阅读