当前位置:   article > 正文

创建单链表,并对单链表的数据进行增、删、改、查、数据输入、打印等操作(C++)_c++输入链表

c++输入链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

题目:

目录

题目:

一、创建单链表

二、单链表的初始化

三、单链表的取值

四、单链表的查找

五、单链表的插入

六、单链表的删除

七、单链表的输入数据

八、单链表输出所数据

九、输出单链表的表长

十、输出最大值

全部代码:

结果:

总结


一、填充函数ShowList实现将单链表的所有元素输出出来。

二、填充函数ListLength实现单链表的求表长操作,返回链表的表长。

三、主函数:

1) 建立单链表。建立一个包括头结点和4个结点的(5,4,2,1)的单链表,实现单链表建立的基本操作。

2)将该单链表的所有元素显示出来。

3)取值。在已建好的单链表中的第3个位置(i=3)取出元素的值并输出。

4)查找。在链表中找等于2和等于100的元素,并显示相关信息。

5) 插入元素。在已建好的单链表中的指定位置(i=3)插入一个结点3,实现单链表插入的基本操作,并将该单链表的所有元素显示出来。

6) 删除元素。在一个包括头结点的单链表的指定位置(如i=2)删除一个结点,实现单链表删除的基本操作,并将该单链表的所有元素显示出来。

7)输出该单链表的表长。

8)取最大值。设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点。

一、创建单链表

  1. typedef struct LNode {
  2. ElemType data; //结点的数据域
  3. struct LNode *next; //结点的指针域
  4. } L

二、单链表的初始化

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

三、单链表的取值

  1. Status GetElem(LinkList L, int i, ElemType &e) { //算法2.7 单链表的取值
  2. //在带头结点的单链表L中查找第i个元素
  3. //用e返回L中第i个数据元素的值
  4. int j;
  5. LinkList p;
  6. p=L->next;j=1;
  7. while(p&&j<i)
  8. {
  9. p=p->next;
  10. ++j;
  11. }
  12. if(!p||j>i)return ERROR;
  13. e=p->data;
  14. cout<<e;
  15. return OK;
  16. //TODO
  17. } //GetElem

四、单链表的查找

  1. LNode *LocateElem(LinkList L, ElemType e) { //算法2.8 按值查找
  2. //在带头结点的单链表L中查找值为e的元素
  3. //TODO
  4. LinkList p;
  5. //LinkList p;
  6. p=L->next;
  7. int i=0;
  8. while(p&&p->data!=e)
  9. {
  10. p=p->next;
  11. i++;
  12. }
  13. return p;
  14. } //LocateElem

五、单链表的插入

  1. Status ListInsert(LinkList &L, int i, ElemType e) { //算法2.9 单链表的插入
  2. //在带头结点的单链表L中第i个位置插入值为e的新结点
  3. int j;
  4. LinkList p, s;
  5. p=L;j=0;
  6. while(p&&(j<i-1))
  7. {
  8. p=p->next;++j;
  9. }
  10. if(!p||j>i-1)return ERROR;
  11. s=new LNode;
  12. s->data=e;
  13. s->next=p->next;
  14. p->next=s;
  15. return OK;
  16. //TODO
  17. } //ListInsert

六、单链表的删除

  1. Status ListDelete(LinkList &L, int i) { //算法2.9 单链表的删除
  2. //在带头结点的单链表L中,删除第i个位置
  3. LinkList p, q;
  4. int j;
  5. p = L;
  6. j = 0;
  7. while((p->next)&&(j<i-1))
  8. {
  9. p=p->next;++j;
  10. }
  11. if(!(p->next)||(j>i-1))return ERROR;
  12. q=p->next;
  13. p->next=q->next;
  14. delete q;
  15. return OK;
  16. //TODO
  17. } //ListDelete

七、单链表的输入数据

  1. void CreateList_H(LinkList &L, int n) { //算法2.11 前插法创建单链表
  2. //逆位序输入n个元素的值,建立到头结点的单链表L(单链表的输入)
  3. LinkList p;
  4. L=new LNode;
  5. L->next=NULL;
  6. cout<<"请输入数据(以空格隔开):"<<endl;
  7. for(int i=0;i<n;i++)
  8. {
  9. p=new LNode;
  10. cin>>p->data;
  11. p->next=L->next;L->next=p;
  12. }
  13. //TODO
  14. } //CreateList_H
  1. void CreateList_R(LinkList &L, int n) { //算法2.12 后插法创建单链表
  2. //正位序输入n个元素的值,建立带表头结点的单链表L(单链表的输入)
  3. //TO DO
  4. LinkList p,r;
  5. int i;
  6. L=new LNode;
  7. L->next=NULL;
  8. r=L;
  9. cout<<"请输入数据(以空格隔开):"<<endl;
  10. for(i=0;i<n;i++)
  11. {
  12. p=new LNode;
  13. cin>>p->data;
  14. p->next=NULL;r->next=p;
  15. r=p;
  16. }
  17. } //CreateList_R

八、单链表输出所数据

  1. void ShowList(LinkList L)
  2. {//将该单链表的所有元素显示出来
  3. LinkList p;
  4. p=L->next;
  5. while(p->next!=NULL)
  6. {
  7. cout<<p->data<<" ";
  8. p=p->next;
  9. }
  10. cout<<p->data<<endl;
  11. }

九、输出单链表的表长

  1. int ListLength(LinkList L)
  2. {//实现单链表的求表长操作
  3. //TODO
  4. LinkList p;
  5. int ListLength=1;
  6. p=L->next;
  7. while(p->next!=NULL)
  8. {
  9. ListLength++;
  10. p=p->next;
  11. }
  12. cout<<ListLength<<endl;
  13. }

十、输出最大值

  1. int Max(LinkList L)//求最大值
  2. {
  3. LinkList p,max;
  4. p=L->next;
  5. max=p;
  6. while(p!=NULL)
  7. {
  8. if(p->data>max->data)
  9. max=p;
  10. p=p->next;
  11. }
  12. return max->data;
  13. }

全部代码:

  1. #include<iostream>
  2. #include<string>
  3. #include<iomanip>
  4. #include<fstream>
  5. using namespace std;
  6. #define OK 1
  7. #define ERROR 0
  8. #define OVERFLOW -2
  9. typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
  10. typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
  11. typedef struct LNode {
  12. ElemType data; //结点的数据域
  13. struct LNode *next; //结点的指针域
  14. } LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
  15. Status InitList(LinkList &L) { //算法2.6 单链表的初始化
  16. //构造一个空的单链表L
  17. L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
  18. L->next = NULL; //头结点的指针域置空
  19. return OK;
  20. }
  21. Status GetElem(LinkList L, int i, ElemType &e) { //算法2.7 单链表的取值
  22. //在带头结点的单链表L中查找第i个元素
  23. //用e返回L中第i个数据元素的值
  24. int j;
  25. LinkList p;
  26. p=L->next;j=1;
  27. while(p&&j<i)
  28. {
  29. p=p->next;
  30. ++j;
  31. }
  32. if(!p||j>i)return ERROR;
  33. e=p->data;
  34. cout<<e;
  35. return OK;
  36. //TODO
  37. } //GetElem
  38. LNode *LocateElem(LinkList L, ElemType e) { //算法2.8 按值查找
  39. //在带头结点的单链表L中查找值为e的元素
  40. //TODO
  41. LinkList p;
  42. //LinkList p;
  43. p=L->next;
  44. int i=0;
  45. while(p&&p->data!=e)
  46. {
  47. p=p->next;
  48. i++;
  49. }
  50. return p;
  51. } //LocateElem
  52. Status ListInsert(LinkList &L, int i, ElemType e) { //算法2.9 单链表的插入
  53. //在带头结点的单链表L中第i个位置插入值为e的新结点
  54. int j;
  55. LinkList p, s;
  56. p=L;j=0;
  57. while(p&&(j<i-1))
  58. {
  59. p=p->next;++j;
  60. }
  61. if(!p||j>i-1)return ERROR;
  62. s=new LNode;
  63. s->data=e;
  64. s->next=p->next;
  65. p->next=s;
  66. return OK;
  67. //TODO
  68. } //ListInsert
  69. Status ListDelete(LinkList &L, int i) { //算法2.9 单链表的删除
  70. //在带头结点的单链表L中,删除第i个位置
  71. LinkList p, q;
  72. int j;
  73. p = L;
  74. j = 0;
  75. while((p->next)&&(j<i-1))
  76. {
  77. p=p->next;++j;
  78. }
  79. if(!(p->next)||(j>i-1))return ERROR;
  80. q=p->next;
  81. p->next=q->next;
  82. delete q;
  83. return OK;
  84. //TODO
  85. } //ListDelete
  86. void CreateList_H(LinkList &L, int n) { //算法2.11 前插法创建单链表
  87. //逆位序输入n个元素的值,建立到头结点的单链表L(单链表的输入)
  88. LinkList p;
  89. L=new LNode;
  90. L->next=NULL;
  91. cout<<"请输入数据(以空格隔开):"<<endl;
  92. for(int i=0;i<n;i++)
  93. {
  94. p=new LNode;
  95. cin>>p->data;
  96. p->next=L->next;L->next=p;
  97. }
  98. //TODO
  99. } //CreateList_H
  100. void CreateList_R(LinkList &L, int n) { //算法2.12 后插法创建单链表
  101. //正位序输入n个元素的值,建立带表头结点的单链表L(单链表的输入)
  102. //TO DO
  103. LinkList p,r;
  104. int i;
  105. L=new LNode;
  106. L->next=NULL;
  107. r=L;
  108. cout<<"请输入数据(以空格隔开):"<<endl;
  109. for(i=0;i<n;i++)
  110. {
  111. p=new LNode;
  112. cin>>p->data;
  113. p->next=NULL;r->next=p;
  114. r=p;
  115. }
  116. } //CreateList_R
  117. void ShowList(LinkList L)
  118. {//将该单链表的所有元素显示出来
  119. LinkList p;
  120. p=L->next;
  121. while(p->next!=NULL)
  122. {
  123. cout<<p->data<<" ";
  124. p=p->next;
  125. }
  126. cout<<p->data<<endl;
  127. }
  128. int ListLength(LinkList L)
  129. {//实现单链表的求表长操作
  130. //TODO
  131. LinkList p;
  132. int ListLength=1;
  133. p=L->next;
  134. while(p->next!=NULL)
  135. {
  136. ListLength++;
  137. p=p->next;
  138. }
  139. cout<<ListLength<<endl;
  140. }
  141. int paixun(LinkList L)//排序
  142. {
  143. LinkList p,r,temp,q;
  144. p=L->next;
  145. while(p != NULL) {
  146. q = r;
  147. temp = p;
  148. p = p->next;//指向第一个;
  149. if(q != NULL && q->next != NULL) {
  150. while(temp->data > q->next->data){
  151. q = q->next;
  152. }
  153. temp->next = q->next;
  154. q->next = temp;
  155. }
  156. else if(q == NULL) {
  157. cout<<"H is NULL\n";
  158. return ERROR;
  159. }
  160. else if(q->next == NULL) {
  161. temp->next = NULL;
  162. q->next = temp;
  163. }
  164. }
  165. return 0;
  166. }
  167. int Max(LinkList L)//求最大值
  168. {
  169. LinkList p,max;
  170. p=L->next;
  171. max=p;
  172. while(p!=NULL)
  173. {
  174. if(p->data>max->data)
  175. max=p;
  176. p=p->next;
  177. }
  178. return max->data;
  179. }
  180. int main() {
  181. LinkList s;
  182. int n,a;
  183. cout<<"请输入n的个数:";
  184. cin>>n;
  185. CreateList_R(s,n);
  186. cout<<"结果为:";
  187. ShowList(s);
  188. cout<<"取值,输出第三个的值为:";
  189. GetElem(s,3,a);
  190. cout<<endl;
  191. if(LocateElem(s,2)!=NULL)
  192. cout<<"找到数据2了,位置在"<<cout<<LocateElem(s,2)<<endl;
  193. else
  194. cout<<"没有找到为2的数据" <<endl;
  195. if(LocateElem(s,100)!=NULL)
  196. cout<<"找到数据100了,位置在"<<cout<<LocateElem(s,100)<<endl;
  197. else
  198. cout<<"没有找到为100的数据" <<endl;
  199. cout<<"在第三个位置中,插入数据3"<<endl;
  200. ListInsert(s,3,3);
  201. cout<<"结果为:";
  202. ShowList(s);
  203. cout<<"删除第二个数据:"<<endl;
  204. ListDelete(s,2);
  205. cout<<"结果为:";
  206. ShowList(s);
  207. cout<<"输出单链表的长度:";
  208. ListLength(s);
  209. cout<<"该链表中,最大值为:"<<Max(s)<<endl;
  210. //cout<<"对单链表进行排序"<<endl;
  211. //paixun(s) ;
  212. // cout<<"结果为:";
  213. //ShowList(s);
  214. return 0;
  215. }

结果:


 

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了创建单链表,并对单链表的数据进行增、删、改、查、数据输入、打印等操作。

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

闽ICP备14008679号