找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3807|回复: 0
打印 上一主题 下一主题
收起左侧

C++语言 线性表的插入和删除

[复制链接]
跳转到指定楼层
楼主
ID:71259 发表于 2014-12-30 01:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 daming 于 2014-12-30 02:14 编辑


  1. #include<iostream.h>

  2. struct node
  3. {
  4. int data;
  5. node *next;
  6. };

  7. //建立一条升序链表 (尾插法:最后建立的结点是表头,故应降序输入)
  8. node *creat_sort()
  9. {
  10. node *p1,*head=NULL;
  11. int a;
  12. cout<<"建立一条有序链表,请输入数据,以-1结束:\n";
  13. cin>>a;
  14. while(a!=-1){
  15.   p1=new node;
  16.   p1->data=a;
  17.   p1->next=head;
  18.   head=p1;
  19.   cin>>a;
  20. }
  21. return head;
  22. }

  23. //输出链表上各个结点的值
  24. void print(const node *head)
  25. {
  26. const node *p;
  27. p=head;
  28. cout<<"链表上各个结点的数据为:\n";
  29. while(p!=NULL){
  30.   cout<<p->data<<'\t';
  31.   p=p->next;
  32. }
  33. cout<<endl;
  34. }

  35. //删除链表上具有指定值的一个结点
  36. node *delete_one_node(node *head,int num)
  37. {
  38. node *p1,*p2;
  39. if(head==NULL){
  40.   cout<<"链表为空,无结点可删!\n";
  41.   return NULL;
  42. }
  43. if(head->data==num){
  44.   p1=head;
  45.   head=head->next;
  46.   delete p1;
  47.   cout<<"删除了一个结点!\n";
  48. }
  49. else{
  50.   p2=p1=head;
  51.   while(p2->data!=num&&p2->next!=NULL){
  52.    p1=p2;
  53.    p2=p2->next;
  54.   }
  55.   if(p2->data==num){
  56.    p1->next=p2->next;
  57.    delete p2;
  58.    cout<<"删除了一个结点!\n";
  59.   }
  60.   else
  61.    cout<<num<<"链表上没有找到要删除的结点!\n";
  62. }
  63. return head;
  64. }

  65. //释放链表的结点空间
  66. void deletechain(node *h)
  67. {
  68. node *p1;
  69. while(h){
  70.   p1=h;
  71.   h=h->next;
  72.   delete p1;
  73. }
  74. cout<<"已释放链表的结点空间!\n";
  75. }

  76. //求链表的结点数
  77. int count(node *head)
  78. {
  79. int n;
  80. node *p;
  81. p=head;
  82. n=0;
  83. while(p!=NULL){
  84.   n=n+1;
  85.   p=p->next;
  86. }
  87. return n;
  88. }
  89. ////查找第k个结点
  90. node *find(node *head,int k)
  91. {
  92. int i;
  93. node *p;
  94. i=1;
  95. p=head;
  96. while(i<k){
  97.   i++;
  98.   p=p->next;
  99. }
  100. return p;
  101. }
  102. //删除链表上第K个结点
  103. node *delete_k_node(node *head,int k)
  104. {
  105. int j=1;
  106. node *p,*p1;
  107. if(head==NULL){
  108.   cout<<"链表为空,无结点可删!\n";
  109.   return NULL;
  110. }
  111. p=head;
  112. if(k==1){
  113.   p=head;
  114.   head=head->next;
  115.   delete p;
  116.   cout<<"删除了第一个结点!\n";
  117. }
  118. else{
  119.   p=find(head,k-1); //查找第k-1个结点,并由p指向该结点
  120.   if(p->next!=NULL){
  121.    p1=p->next;
  122.    p->next=p1->next;
  123.    delete p1;
  124.    cout<<"删除了第"<<k<<"个结点!\n";
  125.   }
  126. }
  127. return head;
  128. }

  129. //插入一个结点,不改变链表上的升序关系
  130. node *insert(node *head,int num)
  131. {
  132. node *p1,*p2,*p3;
  133. p1=head;
  134. p2=head->next;
  135. while(!(((p1->data)<=num)&&((p2->data)>=num))){
  136.   p1=p1->next;
  137.   p2=p2->next;
  138. }
  139. p3=new node;
  140. p3->data=num;
  141. p1->next=p3;
  142. p3->next=p2;
  143. return head;
  144. }

  145. //测试函数
  146. void main()
  147. {
  148. node *head;
  149. int num;
  150. head=creat_sort();
  151. print(head);
  152. cout<<"结点数:"<<count(head)<<endl;
  153. cout<<"输入要删除结点上的序号!\n";
  154. cin>>num;
  155. head=delete_k_node(head,num);
  156. print(head);
  157. cout<<"输入要删除结点上的整数!\n";
  158. cin>>num;
  159. head=delete_one_node(head,num);
  160. print(head);
  161. cout<<"输入要插入的整数!\n";
  162. cin>>num;
  163. head=insert(head,num);
  164. print(head);
  165. deletechain(head);
  166. }

  167. /**********************************************

  168. 建立一条有序链表,请输入数据,以-1结束:
  169. 9 8 6 5 4 3 2 1 -1
  170. 链表上各个结点的数据为:
  171. 1       2       3       4       5       6       8       9
  172. 结点数:8
  173. 输入要删除结点上的序号!
  174. 1
  175. 删除了第一个结点!
  176. 链表上各个结点的数据为:
  177. 2       3       4       5       6       8       9
  178. 输入要删除结点上的整数!
  179. 2
  180. 删除了一个结点!
  181. 链表上各个结点的数据为:
  182. 3       4       5       6       8       9
  183. 输入要插入的整数!
  184. 7
  185. 链表上各个结点的数据为:
  186. 3       4       5       6       7       8       9
  187. 已释放链表的结点空间!
  188. Press any key to continue
  189. **************************************/
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表