当前位置:   article > 正文

【数据结构】单链表应用1

单链表应用

1.删除链表A中与B重复的元素,输出单链表A

主要是用到查找和删除算法

  1. //扣掉A中与B中重复的元素,输出A链表
  2. #include<stdio.h>
  3. typedef struct Lnode{
  4. int data;
  5. struct Lnode *next;
  6. }Lnode,*LinkList;
  7. void DeleteList(LinkList &A,LinkList &B);
  8. void InsertList(LinkList &L,int n,int a[]);
  9. int main(){
  10. LinkList A,B;
  11. Lnode *p;
  12. int a[]={2,3,6,7,9,14,56,45,65,67};//两个数组
  13. int b[]={3,4,7,11,34,54,45,25};
  14. InsertList(A,sizeof(a)/sizeof(a[0]),a);
  15. InsertList(B,sizeof(b)/sizeof(b[0]),b);
  16. int ListLengthA=sizeof(a)/sizeof(a[0]);
  17. int ListLengthB=sizeof(b)/sizeof(b[0]);
  18. p=A->next;
  19. while(p){
  20. printf("%d ",p->data);
  21. p=p->next;
  22. }
  23. printf("\n");
  24. p=B->next;
  25. while(p){
  26. printf("%d ",p->data);
  27. p=p->next;
  28. }
  29. printf("\n");
  30. DeleteList(A,B);
  31. p=A->next;
  32. while(p){
  33. printf("%d ",p->data);
  34. p=p->next;
  35. }
  36. }
  37. //尾插法建立单链表,将数组里数变到单链表中
  38. void InsertList(LinkList &L,int n,int a[]){
  39. L=new Lnode;
  40. L->next=NULL;
  41. Lnode *p;
  42. Lnode *r=L;
  43. int i;
  44. for(i=0;i<n;i++){
  45. p=new Lnode;
  46. p->data=a[i];
  47. r->next=p;
  48. r=p;
  49. }
  50. r->next=NULL;//设置A,B链表的尾结点指针域都为空
  51. }
  52. //这个函数里面主要是进行查找和删除工作
  53. void DeleteList(LinkList &A,LinkList &B){
  54. //为删除进行定义准备
  55. Lnode *pre;
  56. Lnode *p,*q,*r;
  57. pre=A;
  58. //进行查找:依此取A中的元素,去B中查找
  59. p=A->next;
  60. while(p){
  61. q=B->next;
  62. while(q&&q->data!=p->data){
  63. q=q->next;
  64. }
  65. //如果查找出的结果是找到了,那么进行删除,删除p指针所指的元素
  66. if(q){
  67. pre->next=p->next;
  68. r=p;
  69. p=p->next;
  70. delete r;
  71. //如果查找结果为没找到,则让pre指针指向将要进行被查找的元素的前一个
  72. }else{
  73. pre=p;
  74. p=p->next;
  75. }
  76. }
  77. }
  78. //删除算法的步骤就是1.找到要删除元素的前一个指针2.另设变量,开始链接3.释放要删除元素的指针
  79. //这道题的pre指针就充当着将要删除元素的前一个指针

2.两个一般线性表合并

主要是用到查找和插入算法

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct Lnode{
  4. int data;
  5. struct Lnode *next;
  6. }Lnode,*LinkList;
  7. void InsertList(LinkList &L,int n,int a[]);
  8. void MergeList(LinkList &A,LinkList &B);
  9. int main(){
  10. LinkList A,B,C;
  11. Lnode *p;
  12. int a[]={7,5,3,11};//两个数组
  13. int b[]={2,6,3};
  14. InsertList(A,sizeof(a)/sizeof(a[0]),a);
  15. InsertList(B,sizeof(b)/sizeof(b[0]),b);
  16. p=A->next;
  17. while(p){
  18. printf("%d ",p->data);
  19. p=p->next;
  20. }
  21. printf("\n");
  22. p=B->next;
  23. while(p){
  24. printf("%d ",p->data);
  25. p=p->next;
  26. }
  27. printf("\n");
  28. MergeList(A,B);
  29. p=A->next;
  30. while(p){
  31. printf("%d ",p->data);
  32. p=p->next;
  33. }
  34. }
  35. //尾插法建立单链表,将数组里数变到单链表中
  36. void InsertList(LinkList &L,int n,int a[]){
  37. L=new Lnode;
  38. L->next=NULL;
  39. Lnode *p;
  40. Lnode *r=L;
  41. int i;
  42. for(i=0;i<n;i++){
  43. p=new Lnode;
  44. p->data=a[i];
  45. r->next=p;
  46. r=p;
  47. }
  48. r->next=NULL;
  49. }
  50. //这个函数主要用到查找和插入
  51. void MergeList(LinkList &A,LinkList &B){
  52. //进行插入工作的准备
  53. Lnode *p,*q,*r;
  54. p=A->next;
  55. int j=1;
  56. while(p&&j<4){
  57. p=p->next;//让p最终指向链表A的最后一个结点
  58. j++;
  59. }
  60. //依此取B元素,在A链中查找
  61. q=B->next;
  62. while(q){
  63. r=A->next;
  64. while(r&&r->data!=q->data){
  65. r=r->next;
  66. }
  67. if(!r){ //如果r为空,则说明B中的这个元素要插入在A后
  68. //下面是插入的算法
  69. LinkList s;
  70. s=new Lnode;
  71. s->data=q->data;
  72. s->next=p->next;
  73. p->next=s;
  74. }
  75. q=q->next;
  76. }
  77. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/609297
推荐阅读
相关标签
  

闽ICP备14008679号