当前位置:   article > 正文

头歌 单链表的基本操作_头歌单链表的基本操作答案

头歌单链表的基本操作答案

第1关 单链表的插入操作

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. using namespace std;
  5. /* 定义ElemType为int类型 */
  6. typedef int ElemType;
  7. void input(ElemType &s);
  8. void output(ElemType s);
  9. int equals(ElemType a,ElemType b);
  10. /* 单链表类型定义 */
  11. typedef struct LNnode
  12. {
  13. ElemType data;
  14. struct LNnode *next;
  15. }LNnode,*LinkList;
  16. void InitList(LinkList &L);
  17. int ListInsert(LinkList &L,int i,int e) ;
  18. void ListTraverse(LinkList L,void(*vi)(ElemType));
  19. int main() //main() function
  20. {
  21. LinkList A;
  22. ElemType e;
  23. InitList(A);
  24. int n,i;
  25. // cout<<"Please input the list number ";
  26. cin>>n;
  27. for(i=1;i<=n;i++)
  28. {
  29. cin>>e;
  30. ListInsert(A, i, e);
  31. }
  32. //cout<<"请输入插入的位置:"<<endl;
  33. cin>>i;
  34. //cout<<"请输入插入的值:"<<endl;
  35. input(e);
  36. if( ListInsert(A,i,e) )
  37. {
  38. cout<<"插入成功,插入后单链表如下:"<<endl;
  39. ListTraverse(A,output) ;
  40. }
  41. else
  42. cout<<"插入位置不合法,插入失败!"<<endl;
  43. return 0;
  44. }
  45. /*****ElemType类型元素的基本操作*****/
  46. void input(ElemType &s)
  47. {
  48. cin>>s;
  49. }
  50. void output(ElemType s)
  51. {
  52. cout<<s<<" ";
  53. }
  54. int equals(ElemType a,ElemType b)
  55. {
  56. if(a==b)
  57. return 1;
  58. else
  59. return 0;
  60. }
  61. /*****单链表的基本操作*****/
  62. void InitList(LinkList &L)
  63. {
  64. // 操作结果:构造一个空的单链表L
  65. /********** Begin **********/
  66. L = (LinkList )malloc(sizeof(LNnode));
  67. if(!L) return ;
  68. L->next = nullptr;
  69. /********** End **********/
  70. }
  71. int ListInsert(LinkList &L,int i,int e)
  72. {
  73. // 在带头结点的单链线性表L的第i个元素之前插入元素e
  74. /********** Begin **********/
  75. if(!L) return 0;
  76. LinkList p = L;
  77. for(int j = 1;j<i && p;j++){
  78. p=p->next;
  79. }
  80. if(!p) return 0;
  81. LinkList a = (LinkList ) malloc(sizeof(LNnode));
  82. if(!a) return 0;
  83. a->data = e;
  84. a->next = p->next;
  85. p->next = a;
  86. return 1;
  87. /********** End **********/
  88. }
  89. void ListTraverse(LinkList L,void(*vi)(ElemType))
  90. {
  91. // 初始条件:单链表L已存在。
  92. //操作结果:依次对L的每个数据元素调用函数vi()
  93. /********** Begin **********/
  94. LinkList p = L;
  95. while(p->next != nullptr){
  96. vi(p->next->data);
  97. p=p->next;
  98. }
  99. /********** End **********/
  100. }

 第2关 单链表的删除操作

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. using namespace std;
  5. /* 定义ElemType为int类型 */
  6. typedef int ElemType;
  7. void input(ElemType &s);
  8. void output(ElemType s);
  9. int equals(ElemType a,ElemType b);
  10. /* 单链表类型定义 */
  11. typedef struct LNnode
  12. {
  13. ElemType data;
  14. struct LNnode *next;
  15. }LNnode,*LinkList;
  16. void InitList(LinkList &L);
  17. int ListInsert(LinkList &L,int i,int e) ;
  18. int ListDelete(LinkList L,int i,ElemType &e);
  19. void ListTraverse(LinkList L,void(*vi)(ElemType));
  20. int main() //main() function
  21. {
  22. LinkList A;
  23. ElemType e;
  24. InitList(A);
  25. int n,i;
  26. // cout<<"Please input the list number ";
  27. cin>>n;
  28. for(i=1;i<=n;i++)
  29. {
  30. cin>>e;
  31. ListInsert(A, i, e);
  32. }
  33. //cout<<"请输入删除的位置:"<<endl;
  34. cin>>i;
  35. if( ListDelete(A,i,e) )
  36. {
  37. cout<<"删除成功,删除后单链表如下:"<<endl;
  38. ListTraverse(A,output) ;
  39. cout<<"删除元素的值:";
  40. output(e);
  41. cout<<endl;
  42. }
  43. else
  44. cout<<"删除位置不合法,删除失败!"<<endl;
  45. }
  46. /*****ElemType类型元素的基本操作*****/
  47. void input(ElemType &s)
  48. {
  49. cin>>s;
  50. }
  51. void output(ElemType s)
  52. {
  53. cout<<s<<" ";
  54. }
  55. int equals(ElemType a,ElemType b)
  56. {
  57. if(a==b)
  58. return 1;
  59. else
  60. return 0;
  61. }
  62. /*****单链表的基本操作*****/
  63. void InitList(LinkList &L)
  64. { // 构造一个空的单链表L
  65. L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
  66. if(!L) // 存储分配失败
  67. return ;
  68. L->next=NULL; // 指针域为空
  69. }
  70. int ListInsert(LinkList &L,int i,ElemType e)
  71. { // 在带头结点的单链线性表L的第i个元素之前插入元素e
  72. LinkList p,s;
  73. p = L;
  74. int j = 0;
  75. while (p && j < i-1) { // 寻找第i-1个结点
  76. p = p->next;
  77. ++j;
  78. }
  79. if (!p || j > i-1)
  80. return 0; // i小于1或者大于表长
  81. s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
  82. s->data = e; s->next = p->next; // 插入L中
  83. p->next = s;
  84. return 1;
  85. }
  86. void ListTraverse(LinkList L,void(*vi)(ElemType))
  87. { // 调用函数vi()依次输出单链表L的每个数据元素
  88. LinkList p=L->next;
  89. while(p)
  90. {
  91. vi(p->data);
  92. p=p->next;
  93. }
  94. printf("\n");
  95. }
  96. int ListDelete(LinkList L,int i,ElemType &e) // 算法2.10。不改变L
  97. {
  98. // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
  99. /********** Begin **********/
  100. if(!L->next) return 0;
  101. LinkList up = L ;
  102. LinkList p = up->next;
  103. if(i==1){
  104. e = L->next->data;
  105. LinkList t = L->next;
  106. L->next = L->next->next;
  107. free(t);
  108. return e;
  109. }
  110. for(int j = 1;j<i && p;j++){
  111. p = p->next;
  112. up = up->next;
  113. }
  114. if(!p) return 0 ;
  115. LinkList t = p;
  116. up->next = p->next;
  117. e = t->data;
  118. free(t);
  119. return e;
  120. /********** End **********/
  121. }

 第3关 单链表的按照序号查找值操作

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. using namespace std;
  5. /* 定义ElemType为int类型 */
  6. typedef int ElemType;
  7. void input(ElemType &s);
  8. void output(ElemType s);
  9. int equals(ElemType a,ElemType b);
  10. /* 单链表类型定义 */
  11. typedef struct LNnode
  12. {
  13. ElemType data;
  14. struct LNnode *next;
  15. }LNnode,*LinkList;
  16. void InitList(LinkList &L);
  17. int ListInsert(LinkList &L,int i,int e) ;
  18. void ListTraverse(LinkList L,void(*vi)(ElemType));
  19. int GetElem(LinkList L,int i,ElemType &e) ;
  20. int main() //main() function
  21. {
  22. LinkList A;
  23. ElemType e;
  24. InitList(A);
  25. int n,i;
  26. // cout<<"Please input the list number ";
  27. cin>>n;
  28. for(i=1;i<=n;i++)
  29. {
  30. cin>>e;
  31. ListInsert(A, i, e);
  32. }
  33. //cout<<"请输入查找的序号:"<<endl;
  34. cin>>i;
  35. if( GetElem(A,i,e) )
  36. {
  37. cout<<"查找成功!"<<endl;
  38. cout<<"第"<<i<<"个元素的值:"<<endl;
  39. output(e);
  40. cout<<endl;
  41. }
  42. else
  43. cout<<"查找失败!"<<endl;
  44. }
  45. /*****ElemType类型元素的基本操作*****/
  46. void input(ElemType &s)
  47. {
  48. cin>>s;
  49. }
  50. void output(ElemType s)
  51. {
  52. cout<<s<<" ";
  53. }
  54. int equals(ElemType a,ElemType b)
  55. {
  56. if(a==b)
  57. return 1;
  58. else
  59. return 0;
  60. }
  61. /*****单链表的基本操作*****/
  62. void InitList(LinkList &L)
  63. { // 操作结果:构造一个空的单链表L
  64. L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
  65. if(!L) // 存储分配失败
  66. return ;
  67. L->next=NULL; // 指针域为空
  68. }
  69. int ListInsert(LinkList &L,int i,ElemType e)
  70. { // 在带头结点的单链线性表L的第i个元素之前插入元素e
  71. LinkList p,s;
  72. p = L;
  73. int j = 0;
  74. while (p && j < i-1) { // 寻找第i-1个结点
  75. p = p->next;
  76. ++j;
  77. }
  78. if (!p || j > i-1)
  79. return 0; // i小于1或者大于表长
  80. s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
  81. s->data = e; s->next = p->next; // 插入L中
  82. p->next = s;
  83. return 1;
  84. }
  85. void ListTraverse(LinkList L,void(*vi)(ElemType))
  86. { // 初始条件:单链表L已存在。
  87. //操作结果:依次对L的每个数据元素调用函数vi()
  88. LinkList p=L->next;
  89. while(p)
  90. {
  91. vi(p->data);
  92. p=p->next;
  93. }
  94. printf("\n");
  95. }
  96. int GetElem(LinkList L,int i,ElemType &e)
  97. {
  98. // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回0
  99. /********** Begin **********/
  100. if(!L->next) return 0;
  101. LinkList p = L;
  102. for(int j =0;j<i && p;j++){
  103. p = p->next;
  104. }
  105. if(!p) return 0;
  106. e = p->data;
  107. return e;
  108. /********** End **********/
  109. }

 第4关 单链表的按照值查找结点位序的操作

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. using namespace std;
  5. /* 定义ElemType为int类型 */
  6. typedef int ElemType;
  7. void input(ElemType &s);
  8. void output(ElemType s);
  9. int equals(ElemType a,ElemType b);
  10. /* 单链表类型定义 */
  11. typedef struct LNnode
  12. {
  13. ElemType data;
  14. struct LNnode *next;
  15. }LNnode,*LinkList;
  16. void InitList(LinkList &L);
  17. int ListInsert(LinkList &L,int i,int e) ;
  18. void ListTraverse(LinkList L,void(*vi)(ElemType));
  19. int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType));
  20. int main() //main() function
  21. {
  22. LinkList A;
  23. ElemType e;
  24. InitList(A);
  25. int n,i;
  26. // cout<<"Please input the list number ";
  27. cin>>n;
  28. for(i=1;i<=n;i++)
  29. {
  30. cin>>e;
  31. ListInsert(A, i, e);
  32. }
  33. //cout<<"请输入查找的元素:"<<endl;
  34. cin>>e;
  35. i=LocateElem(A,e,equals);
  36. if( i )
  37. {
  38. cout<<"查找成功!"<<endl;
  39. output(e);
  40. cout<<"是单链表第"<<i<<"个元素"<<endl;
  41. }
  42. else
  43. cout<<"查找失败!"<<endl;
  44. }
  45. /*****ElemType类型元素的基本操作*****/
  46. void input(ElemType &s)
  47. {
  48. cin>>s;
  49. }
  50. void output(ElemType s)
  51. {
  52. cout<<s<<" ";
  53. }
  54. int equals(ElemType a,ElemType b)
  55. {
  56. if(a==b)
  57. return 1;
  58. else
  59. return 0;
  60. }
  61. /*****单链表的基本操作*****/
  62. void InitList(LinkList &L)
  63. { // 操作结果:构造一个空的单链表L
  64. L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
  65. if(!L) // 存储分配失败
  66. return ;
  67. L->next=NULL; // 指针域为空
  68. }
  69. int ListInsert(LinkList &L,int i,ElemType e)
  70. { // 在带头结点的单链线性表L的第i个元素之前插入元素e
  71. LinkList p,s;
  72. p = L;
  73. int j = 0;
  74. while (p && j < i-1) { // 寻找第i-1个结点
  75. p = p->next;
  76. ++j;
  77. }
  78. if (!p || j > i-1)
  79. return 0; // i小于1或者大于表长
  80. s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
  81. s->data = e;
  82. s->next = p->next; // 插入L中
  83. p->next = s;
  84. return 1;
  85. }
  86. void ListTraverse(LinkList L,void(*vi)(ElemType))
  87. { // 初始条件:单链表L已存在。
  88. //操作结果:依次对L的每个数据元素调用函数vi()
  89. LinkList p=L->next;
  90. while(p)
  91. {
  92. vi(p->data);
  93. p=p->next;
  94. }
  95. printf("\n");
  96. }
  97. int LocateElem(LinkList L,ElemType e,int (*equal)(ElemType,ElemType))
  98. {
  99. // 初始条件: 单链表L已存在,equal()是数据元素判定函数(满足为1,否则为0)
  100. // 操作结果: 返回L中第1个与e满足关系equal()的数据元素的位序,若这样的数据元素不存在,则返回值为0
  101. /********** Begin **********/
  102. if(!L->next) return 0;
  103. LinkList p = L->next;
  104. for(int i = 1;p;i++){
  105. if(equal(p->data,e))
  106. return i;
  107. p = p->next;
  108. }
  109. /********** End **********/
  110. }

第5关 单链表的逆置操作

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. using namespace std;
  5. /* 定义ElemType为int类型 */
  6. typedef int ElemType;
  7. void input(ElemType &s);
  8. void output(ElemType s);
  9. int equals(ElemType a,ElemType b);
  10. /* 单链表类型定义 */
  11. typedef struct LNnode
  12. {
  13. ElemType data;
  14. struct LNnode *next;
  15. }LNnode,*LinkList;
  16. void InitList(LinkList &L);
  17. int ListInsert(LinkList &L,int i,int e) ;
  18. void ListTraverse(LinkList L,void(*vi)(ElemType));
  19. void reverse (LinkList L);
  20. int main() //main() function
  21. {
  22. LinkList A;
  23. ElemType e;
  24. InitList(A);
  25. int n,i;
  26. // cout<<"Please input the list number ";
  27. cin>>n;
  28. for(i=1;i<=n;i++)
  29. {
  30. cin>>e;
  31. ListInsert(A, i, e);
  32. }
  33. cout<<"逆置单链表:"<<endl;
  34. reverse(A);
  35. ListTraverse(A,output) ;
  36. }
  37. /*****ElemType类型元素的基本操作*****/
  38. void input(ElemType &s)
  39. {
  40. cin>>s;
  41. }
  42. void output(ElemType s)
  43. {
  44. cout<<s<<" ";
  45. }
  46. int equals(ElemType a,ElemType b)
  47. {
  48. if(a==b)
  49. return 1;
  50. else
  51. return 0;
  52. }
  53. /*****单链表的基本操作*****/
  54. void InitList(LinkList &L)
  55. { // 操作结果:构造一个空的单链表L
  56. L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
  57. if(!L) // 存储分配失败
  58. return ;
  59. L->next=NULL; // 指针域为空
  60. }
  61. int ListInsert(LinkList &L,int i,ElemType e)
  62. { // 在带头结点的单链线性表L的第i个元素之前插入元素e
  63. LinkList p,s;
  64. p = L;
  65. int j = 0;
  66. while (p && j < i-1) { // 寻找第i-1个结点
  67. p = p->next;
  68. ++j;
  69. }
  70. if (!p || j > i-1)
  71. return 0; // i小于1或者大于表长
  72. s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
  73. s->data = e; s->next = p->next; // 插入L中
  74. p->next = s;
  75. return 1;
  76. }
  77. void ListTraverse(LinkList L,void(*vi)(ElemType))
  78. { // 初始条件:单链表L已存在。
  79. //操作结果:依次对L的每个数据元素调用函数vi()
  80. LinkList p=L->next;
  81. while(p)
  82. {
  83. vi(p->data);
  84. p=p->next;
  85. }
  86. printf("\n");
  87. }
  88. void reverse (LinkList L)
  89. {
  90. //逆置L指针所指向的单链表
  91. /********** Begin **********/
  92. LinkList l = L->next;
  93. LinkList end = l->next;
  94. LinkList t;
  95. while(end){
  96. t = L->next;
  97. L->next = l->next;
  98. l->next = end->next;
  99. end->next = t;
  100. end = l->next;
  101. }
  102. /********** End **********/
  103. }

 第6关 两个有序单链表的合并操作

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. using namespace std;
  5. /* 定义ElemType为int类型 */
  6. typedef int ElemType;
  7. void input(ElemType &s);
  8. void output(ElemType s);
  9. int equals(ElemType a, ElemType b);
  10. /* 单链表类型定义 */
  11. typedef struct LNnode {
  12. ElemType data;
  13. struct LNnode *next;
  14. } LNnode, *LinkList;
  15. void InitList(LinkList &L);
  16. int ListInsert(LinkList &L, int i, int e);
  17. void ListTraverse(LinkList L, void(*vi)(ElemType));
  18. void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc);
  19. int main() //main() function
  20. {
  21. LinkList A, B, C;
  22. ElemType e;
  23. InitList(A);
  24. InitList(B);
  25. int n, i;
  26. // cout<<"Please input the list number ";
  27. cin >> n;
  28. for (i = 1; i <= n; i++) {
  29. cin >> e;
  30. ListInsert(A, i, e);
  31. }
  32. cin >> n;
  33. for (i = 1; i <= n; i++) {
  34. cin >> e;
  35. ListInsert(B, i, e);
  36. }
  37. cout << "合并两个有序单链表:" << endl;
  38. MergeList(A, B, C);
  39. ListTraverse(C, output);
  40. }
  41. /*****ElemType类型元素的基本操作*****/
  42. void input(ElemType &s) {
  43. cin >> s;
  44. }
  45. void output(ElemType s) {
  46. cout << s << " ";
  47. }
  48. int equals(ElemType a, ElemType b) {
  49. if (a == b)
  50. return 1;
  51. else
  52. return 0;
  53. }
  54. /*****单链表的基本操作*****/
  55. void InitList(LinkList &L) { // 操作结果:构造一个空的单链表L
  56. L = (LinkList) malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
  57. if (!L) // 存储分配失败
  58. return;
  59. L->next = NULL; // 指针域为空
  60. }
  61. int ListInsert(LinkList &L, int i, ElemType e) { // 在带头结点的单链线性表L的第i个元素之前插入元素e
  62. LinkList p, s;
  63. p = L;
  64. int j = 0;
  65. while (p && j < i - 1) { // 寻找第i-1个结点
  66. p = p->next;
  67. ++j;
  68. }
  69. if (!p || j > i - 1)
  70. return 0; // i小于1或者大于表长
  71. s = (LinkList) malloc(sizeof(LNnode)); // 生成新结点
  72. s->data = e;
  73. s->next = p->next; // 插入L中
  74. p->next = s;
  75. return 1;
  76. }
  77. void ListTraverse(LinkList L, void(*vi)(ElemType)) { // 初始条件:单链表L已存在。
  78. //操作结果:依次对L的每个数据元素调用函数vi()
  79. LinkList p = L->next;
  80. while (p) {
  81. vi(p->data);
  82. p = p->next;
  83. }
  84. printf("\n");
  85. }
  86. void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc) { // LC 只是指正 没有指向任何地址
  87. // 已知单链线性表La和Lb的元素按值非递减排列。
  88. // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
  89. /********** Begin **********/
  90. LinkList a = La->next, b = Lb->next, c = La;
  91. Lc = c;
  92. while (a && b) {
  93. LinkList t= (LinkList) malloc(sizeof(LNnode));
  94. if (!t) return;
  95. t->next = nullptr;
  96. if (a->data < b->data) {
  97. t->data = a->data;
  98. c->next = t;
  99. c = c->next;
  100. a = a->next;
  101. }else {
  102. t->data = b->data;
  103. c->next = t;
  104. c = c->next;
  105. b = b->next;
  106. }
  107. }
  108. while (a) {
  109. LinkList t= (LinkList) malloc(sizeof(LNnode));
  110. if (!t) return;
  111. t->next = nullptr;
  112. t->data = a->data;
  113. c->next = t;
  114. c = c->next;
  115. a = a->next;
  116. }
  117. while (b) {
  118. LinkList t= (LinkList) malloc(sizeof(LNnode));
  119. if (!t) return;
  120. t->next = nullptr;
  121. t->data = b->data;
  122. c->next = t;
  123. c = c->next;
  124. b = b->next;
  125. }
  126. /********** End **********/
  127. }

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

闽ICP备14008679号