当前位置:   article > 正文

单链表中的基本操作(详细代码图解+注释+算法步骤)_单链表的基本操作代码

单链表的基本操作代码

目录

一、单链表的定义和表示

二、单链表的存储结构

三、单链表中的操作

1.单链表的初始化

2.创建单链表(前插法创建单链表)

实现代码

 运行结果

3. 创建单链表(后插法创建单链表)

实现代码

运行结果

4.单链表的取值

实现代码

 运行结果

5.单链表的按值查找

实现代码

运行结果

6.单链表的插入

实现代码

 运行结果

7.单链表的删除

实现代码

 运行结果

8.查找单链表中某个元素的前驱

实现代码

运行结果

9.查找单链表中某个元素的后继

实现代码

运行结果


一、单链表的定义和表示

线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。

二、单链表的存储结构

  1. //定义单链表的结构类型
  2. typedef int ElemType;
  3. //------单链表的存储结构-----//
  4. typedef struct LNode
  5. {
  6. ElemType data; //结点的数据域
  7. struct LNode *next; //结点的指针域,指向下一个指针
  8. }LNode,*LinkList; //LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型

三、单链表中的操作

  • InitList(LinkList &L):单链表的初始化
  • CreateList_H(LinkList &L,int n):前插法创建单链表——时间复杂度O(n)
  • CreateList_R(LinkList &L,int n):后插法创建单链表——时间复杂度O(n)
  • GetElem(LinkList L,int i,ElemType &e):单链表的取值——时间复杂度O(n)
  • ListInsert(LinkList &L,int i,ElemType e):单链表的插入——时间复杂度O(n)
  • ListDelete(LinkList &L,int i):单链表的删除——时间复杂度O(n)
  • LocateElem(LinkList L,ElemType e):单链表的按值查找——时间复杂度O(n)
  • ListPrior(LinkList L,ElemType e,ElemType *pre):查找单链表中某个元素的前驱——时间复杂度O(n)
  • ListNext(LinkList L,ElemType e,ElemType *next):查找单链表中某个元素的后继——时间复杂度O(n)

1.单链表的初始化

  1. //------单链表的初始化-----//
  2. //【算法步骤】//
  3. //1.生成新结点作为头结点,用头指针L指向头结点。
  4. //2.头结点的指针域置空。
  5. Status InitList(LinkList &L)
  6. {
  7. //构造一个空的单链表L
  8. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  9. L->next=NULL; //头结点的指针域置空
  10. return OK;
  11. }

2.创建单链表(前插法创建单链表)

  1. //------前插法创建单链表-----//
  2. //【算法步骤】//
  3. //1.创建一个只有头结点的空链表。
  4. //2.根据待创建链表包括的元素个数n,循环n次执行以下操作:
  5. //生成一个新结点*P;
  6. //输入元素值赋给新结点*p的数据域;
  7. //将新结点*p插入到头结点之后;
  8. void CreateList_H(LinkList &L,int n)
  9. {
  10. //逆位序输入n个元素的值,建立带表头结点的单链表L
  11. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  12. L->next=NULL; //先建立一个带头结点的空链表
  13. for(int i=0;i<n;++i)
  14. {
  15. LinkList p=new LNode; //生成新结点*p
  16. cin>>p->data; //输入元素值赋给新结点*p的数据域
  17. p->next=L->next;
  18. L->next=p; //将新结点*p插入到头结点之后
  19. }
  20. }

实现代码

  1. //-------------前插法创建单链表------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------前插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.根据待创建链表包括的元素个数n,循环n次执行以下操作:
  31. //生成一个新结点*P;
  32. //输入元素值赋给新结点*p的数据域;
  33. //将新结点*p插入到头结点之后;
  34. void CreateList_H(LinkList &L,int n)
  35. {
  36. //逆位序输入n个元素的值,建立带表头结点的单链表L
  37. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  38. L->next=NULL; //先建立一个带头结点的空链表
  39. for(int i=0;i<n;++i)
  40. {
  41. LinkList p=new LNode; //生成新结点*p
  42. cin>>p->data; //输入元素值赋给新结点*p的数据域
  43. p->next=L->next;
  44. L->next=p; //将新结点*p插入到头结点之后
  45. }
  46. }
  47. //------打印单链表函数-----//
  48. void PrintList(LinkList &L)
  49. {
  50. printf("当前单链表中所有元素为:");
  51. LinkList p=L->next;
  52. if(p==NULL) return;
  53. else
  54. {
  55. while(p!=NULL)
  56. {
  57. if(p->next==NULL)
  58. {
  59. printf("%d",p->data);
  60. }
  61. else
  62. {
  63. printf("%d->",p->data);
  64. }
  65. p=p->next;
  66. }
  67. }
  68. printf("\n");
  69. }
  70. //------创建单链表函数------//
  71. void CreateList(LinkList &L)
  72. {
  73. int n;
  74. printf("请输入要创建的单链表的长度:");
  75. scanf("%d",&n);
  76. printf("请输入依次输入%d个数(空格隔开):",n);
  77. CreateList_H(L,n);
  78. printf("单链表创建成功!\n");
  79. PrintList(L);
  80. }
  81. //------主函数-----//
  82. int main()
  83. {
  84. int n;
  85. LinkList L;
  86. InitList(L);
  87. CreateList(L);
  88. }

 运行结果

3. 创建单链表(后插法创建单链表)

  1. //------后插法创建单链表-----//
  2. //【算法步骤】//
  3. //1.创建一个只有头结点的空链表。
  4. //2.尾指针r初始化,指向头结点。
  5. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  6. //生成一个新结点*P;
  7. //输入元素值赋给新结点*p的数据域;
  8. //将新结点*p插入到尾结点*r之后;
  9. //尾指针r指向新的尾结点*p。
  10. void CreateList_R(LinkList &L,int n)
  11. {
  12. //正位序输入n个元素的值,建立带表头结点的单链表L
  13. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  14. L->next=NULL; //先建立一个带头结点的空链表
  15. LinkList r=L; //尾指针r指向头结点
  16. for(int i=0;i<n;++i)
  17. {
  18. LinkList p=new LNode; //生成新结点*p
  19. cin>>p->data; //输入元素值赋给新结点*p的数据域
  20. p->next=NULL;
  21. r->next=p; //将新结点*p插入到尾结点*r之后
  22. r=p; //r指向新的尾结点*p
  23. }
  24. }

实现代码

  1. //-------------后插法创建单链表------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //------打印单链表函数-----//
  52. void PrintList(LinkList &L)
  53. {
  54. printf("当前单链表中所有元素为:");
  55. LinkList p=L->next;
  56. if(p==NULL) return;
  57. else
  58. {
  59. while(p!=NULL)
  60. {
  61. if(p->next==NULL)
  62. {
  63. printf("%d",p->data);
  64. }
  65. else
  66. {
  67. printf("%d->",p->data);
  68. }
  69. p=p->next;
  70. }
  71. }
  72. printf("\n");
  73. }
  74. //------创建单链表函数------//
  75. void CreateList(LinkList &L)
  76. {
  77. int n;
  78. printf("请输入要创建的单链表的长度:");
  79. scanf("%d",&n);
  80. printf("请输入依次输入%d个数(空格隔开):",n);
  81. CreateList_R(L,n);
  82. printf("单链表创建成功!\n");
  83. PrintList(L);
  84. }
  85. //------主函数-----//
  86. int main()
  87. {
  88. int n;
  89. LinkList L;
  90. InitList(L);
  91. CreateList(L);
  92. }

运行结果

4.单链表的取值

  1. //-------------单链表的取值------------//
  2. Status GetElem(LinkList L,int i,ElemType &e)
  3. {
  4. //在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
  5. LinkList p=L->next; //初始化,p指向首元结点
  6. int j=1; //计数器初值赋为1
  7. while(p && j<i)
  8. {
  9. p=p->next; //指向下一个结点
  10. ++j; //计数器j相应加1
  11. }
  12. if(!p||j>i) return ERROR; //i值不合法i>n或i<=0
  13. e=p->data; //取第i个结点的数据域
  14. return OK;
  15. }

实现代码

  1. //-------------单链表的取值------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //-------------单链表的取值------------//
  52. Status GetElem(LinkList L,int i,ElemType &e)
  53. {
  54. //在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
  55. LinkList p=L->next; //初始化,p指向首元结点
  56. int j=1; //计数器初值赋为1
  57. while(p && j<i)
  58. {
  59. p=p->next; //指向下一个结点
  60. ++j; //计数器j相应加1
  61. }
  62. if(!p||j>i) return ERROR; //i值不合法i>n或i<=0
  63. e=p->data; //取第i个结点的数据域
  64. return OK;
  65. }
  66. //------打印单链表函数-----//
  67. void PrintList(LinkList L)
  68. {
  69. printf("当前单链表中所有元素为:");
  70. LinkList p=L->next;
  71. if(p==NULL) return;
  72. else
  73. {
  74. while(p!=NULL)
  75. {
  76. if(p->next==NULL)
  77. {
  78. printf("%d",p->data);
  79. }
  80. else
  81. {
  82. printf("%d->",p->data);
  83. }
  84. p=p->next;
  85. }
  86. }
  87. printf("\n");
  88. }
  89. //------创建单链表函数------//
  90. void CreateList(LinkList &L)
  91. {
  92. int n;
  93. printf("请输入要创建的单链表的长度:");
  94. scanf("%d",&n);
  95. printf("请输入依次输入%d个数(空格隔开):",n);
  96. CreateList_R(L,n);
  97. printf("单链表创建成功!\n");
  98. PrintList(L);
  99. }
  100. //------单链表取值函数------//
  101. void GetList(LinkList &L)
  102. {
  103. int i,e;
  104. printf("请输入要取的数据元素的序号为:");
  105. scanf("%d",&i);
  106. bool flag=GetElem(L,i,e);
  107. if(flag)
  108. {
  109. printf("单链表中序号%d对应的数据元素%d取值成功!\n",i,e);
  110. PrintList(L);
  111. }
  112. else
  113. {
  114. printf("单链表中序号%d对应的数据元素%d取值失败!\n",i,e);
  115. }
  116. }
  117. //------主函数-----//
  118. int main()
  119. {
  120. int n;
  121. LinkList L;
  122. InitList(L);
  123. CreateList(L);
  124. GetList(L);
  125. }

 运行结果

5.单链表的按值查找

  1. //------单链表的按值查找-----//
  2. //【算法步骤】//
  3. //1.用指针P指向首元结点。
  4. //2.从首元结点开始依次顺着链域next向下查找,只要指向当前结点的指针p不为空,并且p所指向结点的数据域不等于给定值e,则循环执行以下操作:p指向下一个结点。
  5. //3.返回p。若查找成功,p此时即为结点的地址值,若查找失败,p的值即为NULL
  6. bool LocateElem(LinkList L,ElemType e)
  7. {
  8. //在带头结点的单链表L中查找值为e的元素
  9. LinkList p=L->next; //初始化,p指向首元结点
  10. while(p && p->data!=e) //顺着链域向后扫描,直到p为空或p所指结点的数据域等于e
  11. p=p->next; //p指向下一个结点
  12. return p; //查找成功返回值为e的结点地址p,查找失败p为NULL
  13. }

实现代码

  1. //-------------单链表的按值查找------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //------单链表的按值查找-----//
  52. //【算法步骤】//
  53. //1.用指针P指向首元结点。
  54. //2.从首元结点开始依次顺着链域next向下查找,只要指向当前结点的指针p不为空,并且p所指向结点的数据域不等于给定值e,则循环执行以下操作:p指向下一个结点。
  55. //3.返回p。若查找成功,p此时即为结点的地址值,若查找失败,p的值即为NULL
  56. bool LocateElem(LinkList L,ElemType e)
  57. {
  58. //在带头结点的单链表L中查找值为e的元素
  59. LinkList p=L->next; //初始化,p指向首元结点
  60. while(p && p->data!=e) //顺着链域向后扫描,直到p为空或p所指结点的数据域等于e
  61. p=p->next; //p指向下一个结点
  62. return p; //查找成功返回值为e的结点地址p,查找失败p为NULL
  63. }
  64. //------打印单链表函数-----//
  65. void PrintList(LinkList L)
  66. {
  67. printf("当前单链表中所有元素为:");
  68. LinkList p=L->next;
  69. if(p==NULL) return;
  70. else
  71. {
  72. while(p!=NULL)
  73. {
  74. if(p->next==NULL)
  75. {
  76. printf("%d",p->data);
  77. }
  78. else
  79. {
  80. printf("%d->",p->data);
  81. }
  82. p=p->next;
  83. }
  84. }
  85. printf("\n");
  86. }
  87. //------创建单链表函数------//
  88. void CreateList(LinkList &L)
  89. {
  90. int n;
  91. printf("请输入要创建的单链表的长度:");
  92. scanf("%d",&n);
  93. printf("请输入依次输入%d个数(空格隔开):",n);
  94. CreateList_R(L,n);
  95. printf("单链表创建成功!\n");
  96. PrintList(L);
  97. }
  98. //------单链表查找函数------//
  99. void SearchList(LinkList &L)
  100. {
  101. int e;
  102. printf("请输入要查找的数据元素为:");
  103. scanf("%d",&e);
  104. bool flag=LocateElem(L,e);
  105. if(flag)
  106. {
  107. printf("单链表中元素%d查找成功!\n",e);
  108. PrintList(L);
  109. }
  110. else
  111. {
  112. printf("单链表中元素%d查找失败!\n",e);
  113. }
  114. }
  115. //------主函数-----//
  116. int main()
  117. {
  118. int n;
  119. LinkList L;
  120. InitList(L);
  121. CreateList(L);
  122. SearchList(L);
  123. }

运行结果

  

6.单链表的插入

  1. //------单链表的插入-----//
  2. //【算法步骤】//
  3. //将值为e的新结点插入到表的第i个结点的位置上,即插入到结点ai-1与ai之间,具体插入过程如图所示,步骤如下:
  4. //1.查找结点ai-1并由指针p指向该结点。
  5. //2.生成一个新结点*s。
  6. //3.将新结点*s的数据域置为e。
  7. //4.将新结点*s的指针域指向结点ai。
  8. //5.将结点*p的指针域指向新结点*s。
  9. Status ListInsert(LinkList &L,int i,ElemType e)
  10. {
  11. //在带头结点的单链表L中第i个位置插入值为e的新结点
  12. LinkList p=L;
  13. int j=0;
  14. while(p && (j<i-1))
  15. {
  16. p=p->next; //查找第i-1个结点,p指向该结点
  17. ++j;
  18. }
  19. if(!p||j>i-1) return ERROR; //i>n+1或者i<1
  20. LinkList s=new LNode; //生成新结点*s
  21. s->data=e; //将结点*s的数据域置为e
  22. s->next=p->next;//将结点*s的指针域指向结点ai
  23. p->next=s; //将结点*p的指针域指向结点*s
  24. return OK;
  25. }

实现代码

  1. //-------------单链表的插入(先用后插法创建一个单链表,然后在单链表中第i个位置插入值尾e的新结点)------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //------单链表的插入-----//
  52. //【算法步骤】//
  53. //将值为e的新结点插入到表的第i个结点的位置上,即插入到结点ai-1与ai之间,具体插入过程如图所示,步骤如下:
  54. //1.查找结点ai-1并由指针p指向该结点。
  55. //2.生成一个新结点*s。
  56. //3.将新结点*s的数据域置为e。
  57. //4.将新结点*s的指针域指向结点ai。
  58. //5.将结点*p的指针域指向新结点*s。
  59. Status ListInsert(LinkList &L,int i,ElemType e)
  60. {
  61. //在带头结点的单链表L中第i个位置插入值为e的新结点
  62. LinkList p=L;
  63. int j=0;
  64. while(p && (j<i-1))
  65. {
  66. p=p->next; //查找第i-1个结点,p指向该结点
  67. ++j;
  68. }
  69. if(!p||j>i-1) return ERROR; //i>n+1或者i<1
  70. LinkList s=new LNode; //生成新结点*s
  71. s->data=e; //将结点*s的数据域置为e
  72. s->next=p->next;//将结点*s的指针域指向结点ai
  73. p->next=s; //将结点*p的指针域指向结点*s
  74. return OK;
  75. }
  76. //------打印单链表函数-----//
  77. void PrintList(LinkList L)
  78. {
  79. printf("当前单链表中所有元素为:");
  80. LinkList p=L->next;
  81. if(p==NULL) return;
  82. else
  83. {
  84. while(p!=NULL)
  85. {
  86. if(p->next==NULL)
  87. {
  88. printf("%d",p->data);
  89. }
  90. else
  91. {
  92. printf("%d->",p->data);
  93. }
  94. p=p->next;
  95. }
  96. }
  97. printf("\n");
  98. }
  99. //------创建单链表函数------//
  100. void CreateList(LinkList &L)
  101. {
  102. int n;
  103. printf("请输入要创建的单链表的长度:");
  104. scanf("%d",&n);
  105. printf("请输入依次输入%d个数(空格隔开):",n);
  106. CreateList_R(L,n);
  107. printf("单链表创建成功!\n");
  108. PrintList(L);
  109. }
  110. //------单链表插入函数------//
  111. void InsertList(LinkList &L)
  112. {
  113. int i,e;
  114. printf("请输入要插入的位置:");
  115. scanf("%d",&i);
  116. printf("请输入要在第%d个位置插入的数据元素:",i);
  117. scanf("%d",&e);
  118. bool flag=ListInsert(L,i,e);
  119. if(flag)
  120. {
  121. printf("元素%d插入单链表成功!\n", e);
  122. PrintList(L);
  123. }
  124. else
  125. {
  126. printf("元素%d插入单链表失败!\n",e);
  127. }
  128. }
  129. //------主函数-----//
  130. int main()
  131. {
  132. int n;
  133. LinkList L;
  134. InitList(L);
  135. CreateList(L);
  136. InsertList(L);
  137. }

 运行结果

7.单链表的删除

  1. //------单链表的删除-----//
  2. //【算法步骤】//
  3. //将删除单链表的第i个结点ai,具体插入过程如图所示,步骤如下:
  4. //1.查找结点ai-1并由指针p指向该结点。
  5. //2.临时保存待删除结点ai的地址在q中,以备释放。
  6. //3.结点*p的指针域指向ai的直接后继结点。
  7. //4.释放结点ai的空间。
  8. Status ListDelete(LinkList &L,int i)
  9. {
  10. //在待头结点的单链表L中,删除第i个元素
  11. LinkList p=L;
  12. int j=0;
  13. while((p->next)&&(j<i-1)) //查找第i-1个结点,p指向该结点
  14. {
  15. p=p->next;
  16. ++j;
  17. }
  18. if(!(p->next)||(j>i-1)) return ERROR; //当i>n或i<1时,删除位置不合理
  19. LinkList q=p->next; //临时保存被删结点的地址以备释放
  20. p->next=q->next; //改变删除结点前驱结点的指针域
  21. delete q; //释放删除结点的空间
  22. return OK;
  23. }

实现代码

  1. //-------------单链表的删除(先用后插法创建一个单链表,然后删除单链表的第i个结点ai)------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //------单链表的删除-----//
  52. //【算法步骤】//
  53. //将删除单链表的第i个结点ai,具体插入过程如图所示,步骤如下:
  54. //1.查找结点ai-1并由指针p指向该结点。
  55. //2.临时保存待删除结点ai的地址在q中,以备释放。
  56. //3.结点*p的指针域指向ai的直接后继结点。
  57. //4.释放结点ai的空间。
  58. Status ListDelete(LinkList &L,int i)
  59. {
  60. //在待头结点的单链表L中,删除第i个元素
  61. LinkList p=L;
  62. int j=0;
  63. while((p->next)&&(j<i-1)) //查找第i-1个结点,p指向该结点
  64. {
  65. p=p->next;
  66. ++j;
  67. }
  68. if(!(p->next)||(j>i-1)) return ERROR; //当i>n或i<1时,删除位置不合理
  69. LinkList q=p->next; //临时保存被删结点的地址以备释放
  70. p->next=q->next; //改变删除结点前驱结点的指针域
  71. delete q; //释放删除结点的空间
  72. return OK;
  73. }
  74. //------打印单链表函数-----//
  75. void PrintList(LinkList L)
  76. {
  77. printf("当前单链表中所有元素为:");
  78. LinkList p=L->next;
  79. if(p==NULL) return;
  80. else
  81. {
  82. while(p!=NULL)
  83. {
  84. if(p->next==NULL)
  85. {
  86. printf("%d",p->data);
  87. }
  88. else
  89. {
  90. printf("%d->",p->data);
  91. }
  92. p=p->next;
  93. }
  94. }
  95. printf("\n");
  96. }
  97. //------创建单链表函数------//
  98. void CreateList(LinkList &L)
  99. {
  100. int n;
  101. printf("请输入要创建的单链表的长度:");
  102. scanf("%d",&n);
  103. printf("请输入依次输入%d个数(空格隔开):",n);
  104. CreateList_R(L,n);
  105. printf("单链表创建成功!\n");
  106. PrintList(L);
  107. }
  108. //------单链表删除函数------//
  109. void DeleteList(LinkList &L)
  110. {
  111. int i;
  112. printf("请输入要删除的位置:");
  113. scanf("%d",&i);
  114. bool flag=ListDelete(L,i);
  115. if(flag)
  116. {
  117. printf("单链表中第%d个位置的元素删除成功!\n",i);
  118. PrintList(L);
  119. }
  120. else
  121. {
  122. printf("单链表中第%d位置的元素删除失败!\n",i);
  123. }
  124. }
  125. //------主函数-----//
  126. int main()
  127. {
  128. int n;
  129. LinkList L;
  130. InitList(L);
  131. CreateList(L);
  132. DeleteList(L);
  133. }

 运行结果

8.查找单链表中某个元素的前驱

  1. //-------------查找单链表中某个元素的前驱------------//
  2. Status ListPrior(LinkList L,ElemType e,ElemType *pre)
  3. {
  4. LinkList q=L->next; //初始化,q指向首元结点
  5. if(!q) return ERROR; //若链表为空
  6. LinkList p=q->next; //p指向第二个结点
  7. while(p)
  8. {
  9. if(p->data==e)
  10. {
  11. *pre=q->data;
  12. return OK;
  13. }
  14. else
  15. {
  16. q=p;
  17. p=p->next;
  18. }
  19. }
  20. return ERROR;
  21. }

实现代码

  1. //-------------查找单链表中某个元素的前驱------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //-------------查找单链表中某个元素的前驱------------//
  52. Status ListPrior(LinkList L,ElemType e,ElemType *pre)
  53. {
  54. LinkList q=L->next; //初始化,q指向首元结点
  55. if(!q) return ERROR; //若链表为空
  56. LinkList p=q->next; //p指向第二个结点
  57. while(p)
  58. {
  59. if(p->data==e)
  60. {
  61. *pre=q->data;
  62. return OK;
  63. }
  64. else
  65. {
  66. q=p;
  67. p=p->next;
  68. }
  69. }
  70. return ERROR;
  71. }
  72. //------打印单链表函数-----//
  73. void PrintList(LinkList L)
  74. {
  75. printf("当前单链表中所有元素为:");
  76. LinkList p=L->next;
  77. if(p==NULL) return;
  78. else
  79. {
  80. while(p!=NULL)
  81. {
  82. if(p->next==NULL)
  83. {
  84. printf("%d",p->data);
  85. }
  86. else
  87. {
  88. printf("%d->",p->data);
  89. }
  90. p=p->next;
  91. }
  92. }
  93. printf("\n");
  94. }
  95. //------创建单链表函数------//
  96. void CreateList(LinkList &L)
  97. {
  98. int n;
  99. printf("请输入要创建的单链表的长度:");
  100. scanf("%d",&n);
  101. printf("请输入依次输入%d个数(空格隔开):",n);
  102. CreateList_R(L,n);
  103. printf("单链表创建成功!\n");
  104. PrintList(L);
  105. }
  106. //------单链表查找前驱函数------//
  107. void PriorList(LinkList &L)
  108. {
  109. int e,pre;
  110. printf("请输入要查找前驱的数据元素为:");
  111. scanf("%d",&e);
  112. int flag=ListPrior(L,e,&pre);
  113. if(flag)
  114. {
  115. printf("单链表中数据元素%d的前驱为: %d\n",e,pre);
  116. printf("查找成功!\n");
  117. PrintList(L);
  118. }
  119. else
  120. {
  121. printf("查找失败!\n");
  122. }
  123. }
  124. //------主函数-----//
  125. int main()
  126. {
  127. int n;
  128. LinkList L;
  129. InitList(L);
  130. CreateList(L);
  131. PriorList(L);
  132. }

运行结果

9.查找单链表中某个元素的后继

  1. //-------------查找单链表中某个元素的后继------------//
  2. Status ListNext(LinkList L,ElemType e,ElemType *next)
  3. {
  4. LinkList q=L->next; //初始化,q指向首元结点
  5. if(!q) return ERROR; //若链表为空
  6. LinkList p=q->next; //p指向第二个结点
  7. while(p)
  8. {
  9. if(q->data==e)
  10. {
  11. *next=p->data;
  12. return OK;
  13. }
  14. else
  15. {
  16. q=p;
  17. p=p->next;
  18. }
  19. }
  20. return ERROR;
  21. }

实现代码

  1. //-------------查找单链表中某个元素的后继------------//
  2. #include <stdio.h>
  3. #include <iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. using namespace std;
  7. typedef int Status;
  8. //定义单链表的结构类型
  9. typedef int ElemType;
  10. //------单链表的存储结构-----//
  11. typedef struct LNode
  12. {
  13. ElemType data; //结点的数据域
  14. struct LNode *next; //结点的指针域,指向下一个指针
  15. }LNode,*LinkList; // LNode是结点,LinkList是链表,LinkList为指向结构体LNode的指针类型
  16. //------单链表的初始化-----//
  17. //【算法步骤】//
  18. //1.生成新结点作为头结点,用头指针L指向头结点。
  19. //2.头结点的指针域置空。
  20. Status InitList(LinkList &L)
  21. {
  22. //构造一个空的单链表L
  23. L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 或L=(LinkList)malloc(sizeof(LNode))
  24. L->next=NULL; //头结点的指针域置空
  25. return OK;
  26. }
  27. //------后插法创建单链表-----//
  28. //【算法步骤】//
  29. //1.创建一个只有头结点的空链表。
  30. //2.尾指针r初始化,指向头结点。
  31. //3.根据创建链表包括的元素个数n,循环n次执行以下操作:
  32. //生成一个新结点*P;
  33. //输入元素值赋给新结点*p的数据域;
  34. //将新结点*p插入到尾结点*r之后;
  35. //尾指针r指向新的尾结点*p。
  36. void CreateList_R(LinkList &L,int n)
  37. {
  38. //正位序输入n个元素的值,建立带表头结点的单链表L
  39. L=new LNode; //或L=(LinkList)malloc(sizeof(LNode))
  40. L->next=NULL; //先建立一个带头结点的空链表
  41. LinkList r=L; //尾指针r指向头结点
  42. for(int i=0;i<n;++i)
  43. {
  44. LinkList p=new LNode; //生成新结点*p
  45. cin>>p->data; //输入元素值赋给新结点*p的数据域
  46. p->next=NULL;
  47. r->next=p; //将新结点*p插入到尾结点*r之后
  48. r=p; //r指向新的尾结点*p
  49. }
  50. }
  51. //-------------查找单链表中某个元素的后继------------//
  52. Status ListNext(LinkList L,ElemType e,ElemType *next)
  53. {
  54. LinkList q=L->next; //初始化,q指向首元结点
  55. if(!q) return ERROR; //若链表为空
  56. LinkList p=q->next; //p指向第二个结点
  57. while(p)
  58. {
  59. if(q->data==e)
  60. {
  61. *next=p->data;
  62. return OK;
  63. }
  64. else
  65. {
  66. q=p;
  67. p=p->next;
  68. }
  69. }
  70. return ERROR;
  71. }
  72. //------打印单链表函数-----//
  73. void PrintList(LinkList L)
  74. {
  75. printf("当前单链表中所有元素为:");
  76. LinkList p=L->next;
  77. if(p==NULL) return;
  78. else
  79. {
  80. while(p!=NULL)
  81. {
  82. if(p->next==NULL)
  83. {
  84. printf("%d",p->data);
  85. }
  86. else
  87. {
  88. printf("%d->",p->data);
  89. }
  90. p=p->next;
  91. }
  92. }
  93. printf("\n");
  94. }
  95. //------创建单链表函数------//
  96. void CreateList(LinkList &L)
  97. {
  98. int n;
  99. printf("请输入要创建的单链表的长度:");
  100. scanf("%d",&n);
  101. printf("请输入依次输入%d个数(空格隔开):",n);
  102. CreateList_R(L,n);
  103. printf("单链表创建成功!\n");
  104. PrintList(L);
  105. }
  106. //------单链表查找后继函数------//
  107. void NextList(LinkList &L)
  108. {
  109. int e,next;
  110. printf("请输入要查找前驱的数据后继为:");
  111. scanf("%d",&e);
  112. int flag=ListNext(L,e,&next);
  113. if(flag)
  114. {
  115. printf("单链表中数据元素%d的后继为: %d\n",e,next);
  116. printf("查找成功!\n");
  117. PrintList(L);
  118. }
  119. else
  120. {
  121. printf("查找失败!\n");
  122. }
  123. }
  124. //------主函数-----//
  125. int main()
  126. {
  127. int n;
  128. LinkList L;
  129. InitList(L);
  130. CreateList(L);
  131. NextList(L);
  132. }

运行结果

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

闽ICP备14008679号