| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 359 人关注过本帖
标题:求助!大神能帮我在单链表里添加一个逆置功能么
只看楼主 加入收藏
脸色明媚
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-12-11
收藏
 问题点数:0 回复次数:2 
求助!大神能帮我在单链表里添加一个逆置功能么
程序如下面:/*单链表的创建及 增删改查*/  
 #include <iostream>  
 using namespace std;   
 struct  ChainNode  //结构体构造链表的指针域和数据域  
 {  
   int data;              //节点数据   
   ChainNode *link;       //节点指针   
 };  
 //////////////创建n个节点 并返回链表头指针///////////   
ChainNode* CreatNode(int n)  
 {  
    int ncount = 0;  //计数节点个数  
    ChainNode *pNew,*pCur;    //新建节点和当前节点  
    ChainNode *head = NULL;   //保存第一个节点指针的附属节点 及头指针开始为空  
     if (n<1)   //没有节点 返回头节点   
     {  
        return head;   
     }         
    pNew = new ChainNode;    //创建新节点并输入整形数据
    cout<<"请输入数据:";  
    cin>>pNew->data;  
    while (1)  //将节点添加到链表
      {   
        if (NULL == head) //添加第一个节点   
          {  
            head = pNew;   //头指针指向第一个节点   
          }   
        else       //添加后面的节点   
          {  
            pCur->link = pNew;    //当前指针指向新建节点   
          }   
          pCur = pNew;     //当前节点有移动到新建节点  
          ncount++;        //节点数量加1  
        if (ncount>=n)  //创建完要求的节点后,退出   
              {
            break;
            }
        pNew = new  ChainNode;  //再次创建节点,完成n个节点
        cout<<"请输入数据:";      
         cin>>pNew->data;  
      }         
    pCur->link = NULL;    //最后的节点指向空      
    return head;    //返回头指针      
 }      
 //////////////输出链表头节点///////////////////////   
 void OutList(ChainNode *head) //参数为头指针 从头指针开始   
{  
  cout<<"链表元素输出如下:"<<endl;  
  ChainNode *pCur = head;     //建立一个新节点指向头节点  
   while (pCur != NULL) //没有指向空节点,则链表没结束 输出链表元素
   {  
       cout<<pCur->data<<" ";  
       pCur = pCur->link;     //当前节点指向下一个节点 可以遍历链表   
   }   
    cout<<endl;  
 }      
/*  实现节点数据 插入(增),删除,搜索节点数据(查)*/
//////////// 获取链表节点的长度  //////////////////////////////  
 int GetList_Length(ChainNode *head)   
{  
   int listLen=0;   //用于保存链表的长度  
   ChainNode *pCur = head;  //当前指针指向头指针 PCur用于遍历链表     
    while (NULL != pCur)      //未到最后节点 统计节点个数
    {  
       listLen++;  
      pCur =  pCur->link;    //当前节点指向下一个节点 可以遍历链表  
    }           
    return listLen;     //返回链表节点的个数   
}   
 ////////////在链表最后添加n个节点///////////  
 ChainNode* AddNode(ChainNode* head, int n)  
 {  
   int len = GetList_Length(head);   //获取链表开始时的总长度   
   ChainNode *pNew,*pCur;            //新添加节点和当前节点  
   pCur = head;   
  // 如果当前节点为空,则提示  不为空则在有的链表节点后插入n个节点   
  //并将当前最后一个节点的指针指向新添加第一个节点, 最后一个添加的节点指向空                     
   if  (NULL == pCur->link)  
    {
         cout<<"当前链表为空!添加失败"<<endl;   
    }   
   else
    {   
       while (NULL != pCur->link) //找到最后一个节点
       {
                pCur = pCur->link;  
       }   
        pNew = new  ChainNode; //  新建一个节点
        cout<<"请输入数据:";  
        cin>>pNew->data;  
        int ncount = 0;   //插入n个节点 ncount 计数  
        while (1)  
         {  
            pCur->link = pNew;    //当前指针指向新建节点   
            pCur = pNew;     //当前节点有移动到新建节点  
            ncount++;        //节点数量加1  
           if (ncount>=n)  //创建完要求的节点后,退出   
           {  
                 break;  
           }     
             pNew = new  ChainNode;  //再次创建节点,完成n个节点
             cout<<"请输入数据:";  
             cin>>pNew->data;  
         }  
          pCur->link = NULL;      //最后的节点指向空
    }
     return head;    //返回头指针     
 }   
   
 ////////////在链表中插入1节点/////////////////  
 ChainNode* InsertNode(ChainNode* head, unsigned num)//在第num个节点之前插入一个节点  
 {  
   int len = GetList_Length(head);   //获取链表开始时的总长度  
     if (num<1 || num>len)     //不存在第num个元素,溢出返回头head   
     {  
       cout<<"不存在这个节点!"<<endl;  
       return head;   
     }  
   ChainNode *pCur;       //当前节点   
   pCur = head;           //当前节点指针指向头指针   
   ChainNode* inser  = new ChainNode;  
   cout<<"输入要插入的节点的数据:";  
   cin>>inser->data;  
  //插链表的四种情况:1. 在空链表中插入  2.插入的节点是第一个节点   
 //3.链表第一个节点和最后一个节点中插入一个节点4. 最后一个节点中插入一个节点  
     if (NULL == pCur)   //在空链表中插入   
     {  
       pCur = inser;  
       inser->link = NULL;   
     }   
     if (1 == num) //及插入的节点是第一个节点 这里head 返回的第一个节点,所有插入的还是第二个节点   
     {  
       pCur = pCur->link;  
       head->link = inser;  
       inser->link =  pCur;  
     }  
     else if (num>1 && num<=len)    //在链表第一个节点和最后一个节点中插入一个节点   
     {  
       int ncount=0; //找到第num节点的前一个节点  ncount为节点计数
       ChainNode* temp; //保存第num-1个节点
       while (ncount != num-1)   
         {  
             ncount++;  
             temp = pCur;   
             pCur = pCur->link;  //移动节点   
         }   
      //在第num前一个节点插入inser 首先将第num-1个节点指向inser ,再将inser指向第num个节点   
       temp->link  = inser;  
       inser->link = pCur;  
      }     
     else if (len == num)   //在最后一个节点中插入一个节点 调用添加函数   
      {  
        AddNode(head, 1);  
      }  
     return head;    //返回头指针   
 }  
 ////////////在链表中删除1节点/////////////////  
 ChainNode* DeleteNode(ChainNode* head, unsigned num) //删除第num个节点  
 {  
   int len = GetList_Length(head);   //获取链表开始时的总长度  
      if (num<1 || num>len)     //不存在第num个元素,溢出返回头head   
      {  
        cout<<"不存在这个节点!"<<endl;  
        return head;   
      }  
      ChainNode *pCur;       //新添加节点和当前节点   
      pCur = head;           //当前节点指针指向头指针   
     //这里只考虑删除链表中间的元素 首先定位到第num节点的前一个节点,然后删除下一个节点  
     int ncount = 0;    //找到第num节点的前一个节点  ncount为节点计数  
     ChainNode* temp; //保存第num-1个节点 但当前节点已经指向了第num个节点   
     while (ncount != num-1)   
     {  
       ncount++;  
       temp = pCur;   
       pCur = pCur->link;  //移动节点   
     }   
     //将第num-1个节点和第num节点的后一个节点连接,再释放第num个节点  
     temp->link =  pCur->link;   
     delete  pCur;  
     return head;   
 }   
 ////////////在链表中查询节点数据/////////////////  
 ChainNode* SearchNode(ChainNode* head, int data)  //data为要查询的数据 输出所有的data   
 {  
   ChainNode *pCur;       //当前节点   
   pCur = head;           //当前节点指针指向头指针   
   bool   flag = false;   //标志是否找到   
   int len = GetList_Length(head);   //获取链表开始时的总长度   
   int ncount = 0;        //节点计数   
      while (1)  
      {  
        ncount++;   
          if (  pCur->data == data ) //找到则打印  
         {  
             cout<<data<<"存在链表的第"<<ncount<<"个节点"<<endl;  
             flag = true;   
         }   
         pCur = pCur->link;   //指针向下一个节点移动  
          if (len == ncount)  
          {  
            break;      //搜索完毕,退出   
          }     
      }  
          if (false == flag)   //如果全部搜索完毕,,没找到data 则提示

         {
            cout<<"在链表中没有找到"<<data<<endl;  
         }   
   return head;  
 }   

 int main()
 {  
     int num;  
    //创建num个节点并显示   
     cout<<"输入要创建的链表节点个数:";  
     cin>>num;  
     ChainNode *head = CreatNode(num);  
     OutList(head);   
        
     //在已有节点后增加addnum个元素  
     int addnum;  
     cout<<"输入要添加的元素个数:";  
     cin>>addnum;   
     AddNode(head,addnum);   
     OutList(head);   
        
     //在链表中第inser个位置插入一个元素   
     int inser;  
     cout<<"输入要插入节点的第几个位置:";  
     cin>>inser;   
     InsertNode(head, inser);  
     OutList(head);  
        
     //删除第delnum个节点  
     int delnum;  
     cout<<"输入要删除节点的第几个位置:";  
     cin>>delnum;   
     DeleteNode(head, delnum);   
     OutList(head);  
        
     //在链表中搜索节点元素  
     int searchnum;  
     cout<<"输入要查找的数据元素:";  
     cin>>searchnum;   
     SearchNode(head, searchnum);   
     
     system("pause");  
     return 0;  
 }
搜索更多相关主题的帖子: include 结构体 新建 
2013-12-27 18:29
脸色明媚
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-12-11
收藏
得分:0 
大神,大神,你民在啦里呀?在线等
2013-12-27 19:32
脸色明媚
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-12-11
收藏
得分:0 
ChainNode *ReverseNode(ChainNode *head)  
{  
    ChainNode *p1,*p2,*p3;  
   if(head==NULL || head->next==NULL)  
       return head;  
   p1=head;  
   p2=p1->next;  
   while(p2)  
   {  
      p3=p2->next;  
       p2->next=p1;  
       p1=p2;  
       p2=p3;  
    }  
    head->next=NULL;  
    head=p1;  
    return head;  
}  
然后在主函数中调用如下: //逆置
    int date;
    cout<<"逆置如下:";
    ReverseNode(head);
是哪里错了么?怎么实现不了该功能?
2013-12-29 19:56
快速回复:求助!大神能帮我在单链表里添加一个逆置功能么
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019180 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved