声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2119|回复: 0

[C/C++] 单链表常用运算问题(基于VC)

[复制链接]
发表于 2006-8-30 08:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
针对单链表的常用运算:创建、查找、删除、插入、浏览、求链表的长度。两个version主要是针对查找、删除中存在的两种情况,即满足条件的所有结点的运算和程序控制语句中满足条件的第一个结点的运算。
(一) 满足所有条件的所有结点的运算
  1. #include "iostream.h"
  2. typedef struct node
  3. { int data;
  4. struct node *next;
  5. }List;
  6. List *Create();                      //创建链表
  7. int Len(List *h);                    //链表的长度
  8. void Locate(List *h,int x);            //查找所有数据域为x的结点
  9. void Insert(List *h,int n,int x);         //在第n位插入结点x
  10. void Del(List *h,int x);               //删除所有数据域为x的结点
  11. void Browse(List *h);                //浏览链表

  12. void main()
  13. {   List *head;
  14.   int Length,z,n;
  15.   head=Create();
  16.   Length=Len(head);
  17.   cout<<"链表的长度为:"<<Length<<"\n";
  18.   cout<<"请输入您要插入的位置:";
  19.   cin>>n;
  20.   cout<<"请输入您要插入的数:";
  21.   cin>>z;
  22.   Insert(head,n,z);
  23.   Browse(head);
  24.   cout<<"请输入您要查找的数:";
  25.   cin>>z;
  26.   Locate(head,z);
  27.   Browse(head);
  28.   cout<<"请输入您要删除的数:";
  29.   cin>>z;
  30.   Del(head,z);
  31.   Browse(head);
  32. }

  33. List *Create()
  34. { List *h,*s,*r;
  35. int x,tag;
  36. cout<<"请输入结束标志:";
  37. cin>>tag;
  38.     h=new List;
  39. h->data=NULL;
  40. r=h;
  41. cout<<"请输入数据:";
  42. cin>>x;
  43. while(x!=tag)
  44. {
  45.   s=new List;
  46.   s->data=x;
  47.         r->next=s;
  48.   r=s;
  49.   cout<<"请输入数据:";
  50.   cin>>x;
  51. }
  52. r->next=NULL;
  53. return h;
  54. }

  55. int Len(List *h)
  56. { List *s;
  57. int l=0;
  58.     s=h;
  59. while(s->next!=NULL)
  60. {
  61.   s=s->next;
  62.   l++;
  63. }
  64. return l;
  65. }

  66. void Locate(List *h,int x)             //查找所有结点x,并找出它们所在的位置
  67. {    List *p;
  68.    int n=-1,flag=0;                  //由于"p=h",故"n=-1"
  69.    p=h;                                                              
  70.    for(;p!=NULL;p=p->next)   
  71.    {
  72.     n++;
  73.     if(p->data==x)
  74.     {
  75.      cout<<"在第"<<n<<"个位置有结点"<<x<<"\n";
  76.            flag=1;                       //说明链表中有结点x
  77.     }
  78.    }
  79.    if(flag==0)
  80.     cout<<"链表中不存在结点"<<x<<"\n";
  81. }

  82. void Insert(List *h,int n,int x)
  83. { List *s,*p;
  84. int m=0;
  85. s=new List;
  86. if(s==NULL)                     //如果没有空间分配给p,说明链表已满
  87.   cout<<"链表已满。\n";
  88. else
  89. {   
  90.   p=h;
  91.   while(p->next!=NULL&&m!=n)
  92.   {
  93.    p=p->next;
  94.    m++;
  95.   }
  96.   if(p->next==NULL)
  97.    cout<<"插入不合法!\n";
  98.   else
  99.   {
  100.    s->data=x;
  101.    s->next=p->next;
  102.    p->next=s;
  103.   }
  104.     }
  105. }

  106. void Del(List *h,int x)                  //删除所有结点x
  107. {   List *q;
  108.   int flag=0;
  109.   while(h->next)
  110.   {
  111.    if(h->next->data==x)
  112.    {
  113.     flag=1;                    //说明链表中有结点x
  114.     q=h->next;
  115.     h->next=q->next;
  116.     delete q;
  117.    }
  118.    else
  119.     h=h->next;
  120.   }
  121.   if(flag==0)
  122.          cout<<"链表中不存在结点"<<x<<"\n";
  123. }

  124. void Browse(List *h)
  125. { List *q;
  126. q=h->next;
  127. while(q!=NULL)
  128. {
  129.         cout<<"数据域为:"<<q->data<<"\n";
  130.   q=q->next;
  131. }
  132. }
复制代码


(二)程序控制语句中满足条件的第一个结点的运算。
  1. #include "iostream.h"
  2. typedef struct node
  3. { int data;
  4. struct node *next;
  5. }List;
  6. List *Create();                           //创建链表
  7. int Len(List *h);                         /链表的长度
  8. void Locate(List *h,int x);                 //查找数据域为x的结点
  9. void Insert(List *h,int n,int x);              //在第n位插入结点x
  10. void Del(List *h,int x);                    //删除数据域为x的结点
  11. void Browse(List *h);                     //浏览链表

  12. void main()
  13. {   List *head;
  14.   int Length,z,n;
  15.   head=Create();
  16.   Length=Len(head);
  17.   cout<<"链表的长度为:"<<Length<<"\n";
  18.   cout<<"请输入您要插入的位置:";
  19.   cin>>n;
  20.   cout<<"请输入您要插入的数:";
  21.   cin>>z;
  22.   Insert(head,n,z);
  23.   Browse(head);
  24.   cout<<"请输入您要查找的数:";
  25.   cin>>z;
  26.   Locate(head,z);
  27.   Browse(head);
  28.   cout<<"请输入您要删除的数:";
  29.   cin>>z;
  30.   Del(head,z);
  31.   Browse(head);
  32. }

  33. List *Create()
  34. { List *h,*s,*r;
  35. int x,tag;
  36. cout<<"请输入结束标志:";
  37. cin>>tag;
  38.     h=new List;
  39. h->data=NULL;
  40. r=h;
  41. cout<<"请输入数据:";
  42. cin>>x;
  43. while(x!=tag)
  44. {
  45.   s=new List;
  46.   s->data=x;
  47.         r->next=s;
  48.   r=s;
  49.   cout<<"请输入数据:";
  50.   cin>>x;
  51. }
  52. r->next=NULL;
  53. return h;
  54. }

  55. int Len(List *h)
  56. { List *s;
  57. int l=0;
  58.     s=h;
  59. while(s->next!=NULL)
  60. {
  61.   s=s->next;
  62.   l++;
  63. }
  64. return l;
  65. }

  66. void Locate(List *h,int x)         
  67. {    List *p;
  68.    int n=-1,flag=0;                            //由于"p=h",故"n=-1"
  69.    p=h;                                                              
  70.    for(;p!=NULL;p=p->next)  
  71.    {
  72.     n++;
  73.        if(p->data==x)
  74.        {
  75.      cout<<"在第"<<n<<"个位置有结点"<<x<<"\n";
  76.      flag=1;
  77.     }
  78.    }
  79.    if(flag==0)
  80.     cout<<"链表中没有结点"<<x<<"\n";
  81. }

  82. void Insert(List *h,int n,int x)
  83. { List *s,*p;
  84. int m=0;
  85. s=new List;
  86. if(s==NULL)                            //如果没有空间分配给p,说明链表已满
  87.   cout<<"链表已满。\n";
  88. else
  89. {   
  90.   p=h;
  91.   while(p->next!=NULL&&m!=n)
  92.   {
  93.    p=p->next;
  94.    m++;
  95.   }
  96.   if(p->next==NULL)
  97.    cout<<"插入不合法!\n";
  98.   else
  99.   {
  100.    s->data=x;
  101.    s->next=p->next;
  102.    p->next=s;
  103.   }
  104.     }
  105. }

  106. void Del(List *h,int x)               
  107. {     List *p,*q;
  108. int flag=0;
  109. q=h;                                 
  110. while(q->next!=NULL&&q->data!=x)      
  111. {   
  112.   p=q;
  113.      q=q->next;
  114. }
  115. if(x==q->data)
  116. {
  117.   p->next=q->next;
  118.      delete q;
  119.   cout<<"删除完成!\n";
  120. }
  121. else
  122.   cout<<"链表中没有结点"<<x<<"\n";
  123. }

  124. void Browse(List *h)
  125. { List *q;
  126. q=h->next;
  127. while(q!=NULL)
  128. {
  129.         cout<<"数据域为:"<<q->data<<"\n";
  130.   q=q->next;
  131. }
  132. }
复制代码
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-12 19:30 , Processed in 0.058711 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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