【数据结构】-线性表-链表 熟练度max=4(split)

前端之家收集整理的这篇文章主要介绍了【数据结构】-线性表-链表 熟练度max=4(split)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

设计一个算法,将一个有头结点A的单链表分解成两个链表A,B,使A中只有奇数,B中只有偶数,并且保持原来的相对顺序

输入 10 9 8 7 6 5 4 3 2 1

输出

A:9 7 5 3 1
B:10 8 6 4 2

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct LNode
  4. {
  5. int data;
  6. struct LNode *next;
  7. }LNode ;
  8. void saveListhead(LNode *&L,int x[])//头插法
  9. {
  10. L=(LNode *)malloc (sizeof(LNode));
  11. L->next=NULL;
  12.  
  13. LNode *q,*s;
  14. q=L;
  15. for(int i=0;i<10;i++)
  16. {
  17. s=(LNode *)malloc(sizeof(LNode));
  18. s->data = x[i];
  19.  
  20. s->next = q->next;
  21. q->next = s;
  22. }
  23. }
  24. void split(LNode *&A,LNode *&B)
  25. {
  26. B=(LNode *)malloc(sizeof(LNode));
  27. B->next=NULL;
  28.  
  29. LNode *a,*b,*c;
  30. a=A;
  31. b=B;
  32. while(a->next!=NULL)//要进行删除操作,必须指向要删除的前一个
  33. {
  34. if(a->next->data%2==0)//偶数,只能尾插,头插就reverse了
  35. {
  36. c=a->next;
  37. a->next=c->next;
  38. c->next=NULL;
  39. b->next=c;
  40. b=c;
  41. }
  42. else
  43. {
  44. a=a->next;
  45. }
  46. }
  47. }
  48. void printList(LNode *L)
  49. {
  50. LNode *q;
  51. q=L->next;
  52. int i=0;
  53. while(q!=NULL)
  54. {
  55. if(i++)
  56. putchar(' ');
  57. printf("%d",q->data);
  58. q=q->next;///忘记写了 ------------------陷入无限循环
  59. }
  60. printf("\n");
  61. }
  62. int main (void)
  63. {
  64. LNode *L,*B;
  65. int x[10]={1,2,3,4,5,6,7,8,9,10};
  66. saveListhead(L,x);
  67. printList(L);
  68. split(L,B);
  69. printList(L);
  70. printList(B);
  71. return 0;
  72. }

关键部分

  1. void split(LNode *&A,只能尾插,头插就reverse
  2. {
  3. //关键部分开始
  4. c=a->next;
  5. a->next=c->next;
  6. c->next=NULL;
  7. b->next=c;
  8. b=c;
  9. //关键部分结束
  10. }
  11. else
  12. {
  13. a=a->next;
  14. }
  15. }
  16. }

猜你在找的数据结构相关文章