链表的操作---带菜单

来源:互联网 发布:淘宝商品视频广告制作 编辑:程序博客网 时间:2024/05/29 13:04
#include <iostream>using namespace std;enum operation{create_List=1,print_List,insert_Node,delete_Node,delete_List,quit};//枚举类型,用于菜单选择结果   struct  node  //结点结构{ int data ;   node * next; };  operation  Menu(); //菜单函数node * CreateList( );  //建立链表函数声明void  PrintList( node *); //输出链表中结点信息函数声明node * InsertNode(node *,node *); //在链表中插入结点函数声明node * DeleteNode(node *,int); //在链表中删除结点函数声明 node * deleteList(node *head); //删除整个链表void Create();  //对应操作菜单--创建链表的操作void Print( );  //对应操作菜单--遍历链表的操作void Insert( ); //对应操作菜单--插入链表结点的操作void Delete( ); //对应操作菜单--删除链表结点的操作void DeleteAll(); //对应操作菜单--删除整个链表的操作int n=0; //全局整型变量存放链表中结点个数node * head=NULL ;  //全局指针变量存放链表头结点地址-头指针int main(){     operation menu_choice;  //存放菜单选择项  do   //循环现实直到用户退出程序  {   menu_choice=Menu(); //菜单显示及用户选择   switch(menu_choice) //用户选择功能匹配   {      case create_List: cout<<"1 创建链表"<<endl<<endl;                Create( );    break;  case  print_List: cout<<"2 遍历链表"<<endl<<endl;                       Print();   break;      case  insert_Node: cout<<"3 插入链表结点"<<endl<<endl;                       Insert();    break;  case  delete_Node: cout<<"4 删除链表结点"<<endl<<endl;                       Delete();    break;      case  delete_List: cout<<"5 删除整个链表"<<endl<<endl;                       DeleteAll();    break;  case quit :   default:   cout<<"退出链表操作,结束程序"<<endl;        return 0;   }        }while(menu_choice!=quit);    return 0;}/*创建链表*/node * CreateList( )  //建立链表函数,要求输入的结点数据不能是降序的   { node * s, * p ; // s指向新结点,p指向链表中最后的结点     int predata;  //用来标识当前链表中最后一个结点的数据值  s = new node ;   //动态建立第一个新结点     cout<<"请输入一个整数值作为新结点的数据信息,输入0时建立链表结束"<<endl;    cout<<"注意:新结点的数据要保证大于或等于前一个结点的数据"<<endl<<endl;  cout<<"第"<<n+1<<"个结点"<<endl;    cin >> s->data ;  //输入新结点数据     predata=s->data;  head = NULL ;   //头指针初始值为NULL     if( s->data==0)  //第一个结点数据就为0,建立一个空链表     {        cout<<"您建立的空链表"<<endl;        delete  s ;  //释放数据为0的结点     }    else //建立非空链表     {        while ( s->data != 0 )  //通过判断新结点数据来进行循环         { if ( head == NULL )    head = s ; //头指针赋值           else    p->next = s ;  //将新结点插入已有链表的最后           p = s ; // p指向链表中最后的结点            n=n+1; //结点个数增1           s = new node ; //动态建立一个新结点           cout<<"请输入一个整数值作为新结点的数据信息,输入0时建立链表结束"<<endl;          cout<<"第"<<n+1<<"个结点"<<endl;          cin >> s->data ; //输入新结点数据 while(s->data<predata&&s->data!=0) //因为题目要求升序输入数据,如果发现新结点的数据小于当前链表中的最后一个结点的数据,要求重新输入{   cout<<"重新输入新结点数据,保证链表中结点数据是升序!"<<endl;   cin>>s->data;}if(s->data == 0 )  //如果输入的新结点数据为0,则退出当前循环break;predata=s->data;      }        p -> next = NULL ; //设置链表尾部为空         delete  s ;  //释放数据为0的结点         cout<<endl<<"链表建立完成...";        cout<<"建立的链表中共有"<<n<<"个节点"<<endl<<endl;    }    return ( head ) ; //返回头指针    }    /*遍历链表*/void  PrintList( node * head)  //输出链表中结点信息函数,链表遍历{    node *p=head;     int i=1; cout<<endl<<"遍历链表..."<<endl;    if (head!=NULL)  //如果链表非空,即链表中有结点        do             //循环输出接点数据,直到移动到链表尾,即最后一个结点{     cout<<"第"<<i++<<"个结点数据为:"<<p->data<<endl;                p=p->next;        }while(p!=NULL) ;else{  cout<<"链表是空链表!"<<endl;} cout<<"链表中共有"<<n<<"个节点"<<endl;}/*插入结点*/  node * InsertNode(node *head,node * s)  //插入结点的函数,head为链表头指针,s指向要插入的新结点{node *p,*q;                          p=head;   //使p指向链表中的第一个结点       if(head==NULL)      //原来的链表是空表 { head=s;           //使head指向的新结点作为头结点   s->next=NULL;      }           else  //原来的链表不是空表 {while((s->data>p->data) && (p->next!=NULL)) //用循环定位要插入的结点位置p,使s插入到p之前的位置{q=p;  //q记录下当前的p,即q指向p的前一个结点 p=p->next;   //p后移一个结点}      if(s->data<=p->data)  //要插入的结点数据比最后一个结点数据小  {  if(head==p) //判断是否插入链表中的第一个结点之前  { head=s;  //插到原来第一个结点之前       s->next=p; }     else //插到q指向的结点之后,p指向的结点之前  { q->next=s;s->next=p;           }      }   else   //要插入的结点数据比最后一个结点数据还大  {  p->next=s;    // 插到链表最后的结点之后,作为链表的尾结点     s->next=NULL;  }  }    n=n+1;          //结点数加1    cout<<"成功完成一个新结点插入..."<<endl;   return (head);}               /*删除结点*/node *DeleteNode(node *head,int delData)   //删除数据为delDate的结点的函数   {node *p,*q;    p=head;          //使p指向第一个结点    if (head==NULL)     //是空表    { cout<<"该链表是空链表,不能进行结点删除!"<<endl;      return(head);   }   //先找到要删除的结点                           while(delData!=p->data && p->next!=NULL) //p指向的不是所要找的结点且后面还有结点    { q=p;  //q用来记录p前一个结点      p=p->next;   }         //p后移一个结点     if(delData==p->data)      //找到了要删除的结点     { do{if(p==head)  //如果要删除的是头结点   { head=p->next;   //若p指向的是首结点,把第二个结点地址赋予head        n=n-1;  delete p;  p=head; }    else { q->next=p->next;  //否则将下一结点地址赋给前一结点地址       n=n-1;  delete p;  //释放被删除结点空间   p=q->next;}}while(p!=NULL&&p->data==delData);  //判断与被删除结点相邻的结点是否还是要被删除的结点 cout<<"成功删除数据为"<<delData<<"的结点"<<endl;       }   else        cout<<"要删除的数据为"<<delData<<"的结点在链表中没有找到"<<endl;     //找不到该结点    return(head);  }  /*删除整个链表*/node * deleteList(node *head) //删除整个链表{   node *p,*s;  p=head;  if(head==NULL)  cout<<"链表本身就为空链表";  else  {  while(p->next!=NULL)  {     s=p; p=p->next; delete s; n--;  }    delete p;  n--;      head=NULL;  }  cout<<"整个链表删除成功!"<<endl;  return head;}/*菜单函数*/operation  Menu(){  int choice;   cout<<endl<<endl;   cout<<"链表操作菜单"<<endl;   cout<<"1 创建链表"<<endl;   cout<<"2 遍历链表"<<endl;   cout<<"3 插入链表结点"<<endl;   cout<<"4 删除链表结点"<<endl;   cout<<"5 删除整个链表"<<endl;   cout<<"6 退出"<<endl;   cout<<endl<<endl<<"请输入功能序号";   cin>>choice;   return operation(choice);}/*对应操作菜单--创建链表的操作*/void Create(){    if(head==NULL) //如果链表中已有结点,不允许重新建立{  head=CreateList( ); }else{  cout<<"已创建过链表,不允许再次创建"<<endl;  cout<<"如果想重新创建,先删除原先链表"<<endl;  }}/*对应操作菜单--遍历链表的操作*/void Print( ){   PrintList(head);}/*对应操作菜单--插入链表结点的操作*/void Insert( ){    char IsGo;  //是否继续操作标志  IsGo='y';  cout<<endl<<"开始进行结点插入操作"<<endl;    node *stu;     while(IsGo=='y'||IsGo=='Y')    {   stu=new node;    //创建要插入的新结点      cout<<endl<<"输入要插入的新结点数据:";       cin>>stu->data;      //输入要插入的新结点数据    head=InsertNode(head,stu);    //调用插入函数,返回链表头指针  cout<<"是否继续插入新结点? (继续插入请按y或Y,退出请按其它键)";  cin>>IsGo;      }  cout<<endl<<"结点插入操作结束"<<endl;}/*对应操作菜单--删除链表结点的操作*/void Delete( ){   char IsGo;  //是否继续操作标志   int del_num;//要删除的结点的数据   IsGo='y';   cout<<endl<<"开始进行结点插入操作"<<endl;     while(IsGo=='y'||IsGo=='Y')   {   cout<<endl<<"输入要删除的节点的数据:";  //输入要插入的结点   cin>>del_num;  //输入要删除的结点的数据   head=DeleteNode(head,del_num);    //删除后链表的头地址       cout<<"是否继续删除结点? (继续插入请按y或Y,退出请按其它键)";   cin>>IsGo;       }     cout<<endl<<"结点删除操作结束"<<endl;}/*对应操作菜单--删除整个链表的操作*/void DeleteAll(){  head=deleteList(head);}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 幼儿大班《打雷了怎么办》的教案 小孩上课不听讲到处乱跑怎么办 小孩子经常咬人好动怎么办 6个月宝宝好动怎么办 新生调皮被幼儿园退学怎么办 孩子在幼儿园太调皮怎么办 幼儿上课注意力不集中怎么办 幼儿上课一半要离开怎么办 八个月宝宝消化不良拉肚子怎么办 8个月的宝宝拉肚子怎么办 孕8个月拉稀怎么办 孩子调皮好动爱说话怎么办 宝宝8个月不会爬怎么办 怀孕8个月不想要了怎么办 8个月宝宝发烧怎么办 八个月的小孩发烧怎么办 孩子8个月发烧38怎么办 8个宝宝发烧38度怎么办 怀孕八个月不想要怎么办 怀孕八个月不想要了怎么办 八个月宝宝拉肚子拉水怎么办 八个月的宝宝拉肚子怎么办 八个月发烧38度怎么办 孩子特别调皮好动该怎么办 孩子有好动症该怎么办 在幼儿园好动的孩子该怎么办 18个月宝宝上火怎么办 打孩子越打上瘾怎么办 八个月不想要了怎么办 胎儿心脏畸形肺动脉瓣闭锁怎么办 小孩爱动怎么办补什么 初中孩子下午上课总犯困怎么办 孩子上课精神不集中怎么办 孩子玩兴奋了就打人怎么办 婴儿兴奋白天不睡觉怎么办 小孩读书精神不集中怎么办 小孩上课精神不集中怎么办 小孩学习精神不集中怎么办 孩子暑假天天看电视不出门怎么办 七个月宝宝缺铁怎么办 天天运动为什么还便秘怎么办