当前位置:   article > 正文

数据结构_链表基本操作的实现_代码_例题

数据结构_链表基本操作的实现_代码_例题

一、基本操作实现

1.按位序插入(带头节点)

2.按位序插入(不带头节点)

3.指定结点的后插操作

4.指定结点的前插操作

5.按位序删除(带头节点)

6.指定结点的删除

7.按位查找,返回第i个元素(带头结点)

8.按值查找

9.求表的长度

10.尾插法建立单链表

11.头插法建立单链表(可用于链表的逆置) 

二、例题

1.有序链表的合并,不允许有重复数据


一、基本操作实现

1.按位序插入(带头节点)

  1. typedef struct LNode{
  2. ElemType data;
  3. struct LNode *next;
  4. }LNode,*LinkList;
  5. //按位序插入(带头节点)
  6. bool ListInsert(LinkList &L,int i,ElemType e){
  7. if(i<1) return false;
  8. LNode *p; //指针p指向当前扫描到的结点
  9. int j = 0; //当前p指向的是第几个结点
  10. p = L; //L指向头结点,头结点不存数据
  11. while(p != NULL && j<i-1){
  12. p = p->next;
  13. j++;
  14. }
  15. if (p == NULL) return false;
  16. LNode *s = (LNode *)malloc(sizeof(LNode));
  17. s->data = e;
  18. s->next = p->next;
  19. p->next = s;
  20. return true;
  21. }

2.按位序插入(不带头节点)

  1. //按位序插入(不带头节点)
  2. bool ListInsert(LinkList &L,int i,ElemType e){
  3. if(i<1) return false;
  4. if (i == 1){ //插入第1个结点的操作与其他结点不一样
  5. LNode *s = (LNode *)malloc(sizeof(LNode));
  6. s->data = e;
  7. s->next = L;
  8. L = s;
  9. return true;
  10. }
  11. LNode *p; //指针p指向当前扫描到的结点
  12. int j = 0; //当前p指向的是第几个结点
  13. p = L; //L指向头结点,头结点不存数据
  14. while(p != NULL && j<i-1){
  15. p = p->next;
  16. j++;
  17. }
  18. if (p == NULL) return false;
  19. LNode *s = (LNode *)malloc(sizeof(LNode));
  20. s->data = e;
  21. s->next = p->next;
  22. p->next = s;
  23. return true;
  24. }

3.指定结点的后插操作

  1. //指定结点的后插操作
  2. bool InsertNextNode(LNode *p,ElemType e){
  3. if (p == NULL) return false;
  4. LNode *s = (LNode *)malloc(sizeof(LNode));
  5. if (s == NULL) return false;
  6. s->data = e;
  7. s->next = p->next;
  8. p->next = s;
  9. return true;
  10. }

4.指定结点的前插操作

思路:先后插将位置占住,然后再交换前后两个的结点的data。

  1. //指定结点的前插操作
  2. bool InsertNextNode(LNode *p,ElemType e){
  3. if (p == NULL) return false;
  4. LNode *s = (LNode *)malloc(sizeof(LNode));
  5. if (s == NULL) return false;
  6. s->next = p->next;
  7. p->next = s;
  8. s->data = p->data;
  9. p->data = e;
  10. return true;
  11. }

5.按位序删除(带头节点)

  1. //按位序删除(带头节点)
  2. bool ListDelet(LinkList &L,int i,ElemType &e){
  3. if(i<1) return false;
  4. LNode *p; //指针p指向当前扫描到的结点
  5. int j = 0; //当前p指向的是第几个结点
  6. p = L; //L指向头结点,头结点不存数据
  7. while(p != NULL && j<i-1){
  8. p = p->next;
  9. j++;
  10. }
  11. if (p == NULL) return false;
  12. if (p->next == NULL) return false;
  13. LNode *q = p->next;
  14. e = q->data; //用e返回删除元素的值
  15. p->next = q->next;
  16. free(q);
  17. return true;
  18. }

6.指定结点的删除

  1. //指定结点的删除
  2. bool DeletNode(LNode *p){
  3. if (p == NULL) return false;
  4. LNode *q = p->next;
  5. p->data = p->next->data;
  6. p->next = q->next;
  7. free(q);
  8. return true;
  9. }

7.按位查找,返回第i个元素(带头结点)

  1. //按位查找,返回第i个元素(带头结点)
  2. LNode * GetElem(LinkList L,int i){
  3. if(i<0) return NULL;
  4. LNode *p;
  5. int j = 0;
  6. p = L;
  7. while(p != NULL && j<i){
  8. p = p->next;
  9. j++;
  10. }
  11. return p;
  12. }

8.按值查找

  1. //按值查找
  2. LNode * LocateElem(LinkList L,ElemType e){
  3. LNode *p = L->next;
  4. while(p != NULL && p->data != e){
  5. p = p->next;
  6. }
  7. return p;
  8. }

9.求表的长度

  1. //求表的长度
  2. int Length(LinkList L){
  3. int len = 0;
  4. LNode *p = L;
  5. while(p->next != NULL){
  6. p = p->next;
  7. len ++;
  8. }
  9. return len;
  10. }

10.尾插法建立单链表

  1. //尾插法建立单链表
  2. LinkList List_TailInsert(LinkList &L){
  3. int x;
  4. L = (LinkList)malloc(sizeof(LNode));
  5. LNode *s,*r = L;
  6. scanf("%d",&x);
  7. while(x != 9999){
  8. s = (LNode *)malloc(sizeof(LNode));
  9. s->data = x;
  10. r->next = s;
  11. r = s;
  12. scanf("%d",&x);
  13. }
  14. r->next = NULL;
  15. return L;
  16. }

11.头插法建立单链表(可用于链表的逆置) 

  1. //头插法建立单链表(可用于链表的逆置)
  2. LinkList List_HeadInsert(LinkList &L){
  3. LNode *s;
  4. int x;
  5. L = (LinkList)malloc(sizeof(LNode));
  6. L->next = NULL; //初始为空链表
  7. scanf("%d",&x);
  8. while(x != 9999){
  9. s = (LNode*)malloc(sizeof(LNode));
  10. s->data = x;
  11. s->next = L->next;
  12. L->next = s;
  13. scanf("%d",&x);
  14. }
  15. return L;
  16. }

二、例题

1.有序链表的合并,不允许有重复数据

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct LNode{
  4. int data;
  5. struct LNode *next;
  6. }LNode,*LinkList;
  7. //尾插法建立单链表
  8. LinkList List_TailInsert(LinkList &L){
  9. int x;
  10. L = (LinkList)malloc(sizeof(LNode));
  11. LNode *s,*r = L;
  12. scanf("%d",&x);
  13. while(x != 9999){
  14. s = (LNode *)malloc(sizeof(LNode));
  15. s->data = x;
  16. r->next = s;
  17. r = s;
  18. scanf("%d",&x);
  19. }
  20. r->next = NULL;
  21. return L;
  22. }
  23. void ListPrint(LinkList L){
  24. LNode *p;
  25. p = L->next;
  26. while(p != NULL){
  27. printf("%d ",p->data);
  28. p = p->next;
  29. }
  30. printf("\n");
  31. }
  32. void MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC){
  33. LNode *pa,*pb,*pc;
  34. pa = LA->next;
  35. pb = LB->next;
  36. LC = LA;
  37. pc = LC;
  38. while(pa && pb){
  39. if(pa->data < pb->data){
  40. pc->next = pa;
  41. pc = pa;
  42. pa = pa->next;
  43. }
  44. else if(pa->data > pb->data){
  45. pc->next = pb;
  46. pc = pb;
  47. pb = pb->next;
  48. }
  49. //这里解决了不允许有重复数据的要求
  50. else{
  51. pc->next = pa;
  52. pc = pa;
  53. pa = pa->next;
  54. pb = pb->next;
  55. }
  56. }
  57. pc->next = pa?pa:pb;
  58. delete LB;
  59. }
  60. int main(){
  61. LinkList LA,LB,LC;
  62. List_TailInsert(LA);
  63. ListPrint(LA);
  64. List_TailInsert(LB);
  65. ListPrint(LB);
  66. MergeList_L(LA,LB,LC);
  67. ListPrint(LC);
  68. return 0;
  69. }

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

闽ICP备14008679号