CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

AAAA级问题,老师最后通牒:链表的合并和数据排序

楼主luora()2005-06-04 19:07:35 在 C/C++ / 新手乐园 提问

下面是我老师交给的作业,使属于课件设计类,我把代码已经编好,可是怎么也实现不了预期功能  
  望各位仁兄,救救我吧?  
   基本功能要求:  
  (1) 建立两个链表A和B,链表元素个数分别为m和n个。  
  (2) 假设元素分别为(x1,x2,…xm),和(y1,y2,   …yn)。把它们合并成一个线形表C,使得:  
  当m>=n时,C=x1,y1,x2,y2,…xn,yn,…,xm  
  当n>m时,C=y1,x1,y2,x2,…ym,xm,…,yn  
  输出线形表C  
  (3) 用直接插入排序法对C进行升序排序,生成链表D,并输出链表D。  
  测试数据:  
  (1)   A表(30,41,15,12,56,80)  
  B表(23,56,78,23,12,33,79,90,55)  
  (2)   A表(30,41,15,12,56,80,23,12,34)  
  B表(23,56,78,23,12)  
   
   
   以下是我编的代码:  
  ///////linlist.h  
  #include       <iostream.h>  
    #include   <stdlib.h>  
    #include   "datatype.h"  
    template   <class   T>   class   linlist;  
    template<class   T>   class   listnode  
  {  
          friend   class   linlist<T>;  
          private:  
                          listnode<T>   *next;  
          public:  
                          T   data;  
   
                          listnode(listnode<T>   *ptrnext=NULL);  
                          listnode(const   T&   item,listnode<T>   *ptrnext=null);  
                          ~listnode(){};  
  };  
   
    template   <class   T>  
  listnode<T>::listnode(listnode<T>   *ptrnext):next(ptrnext)  
  {}  
  template   <class   T>  
  listnode<T>::listnode(const   T   &item,listnode<T>   *ptrnext)  
  {  
    data=item;  
    next=ptrnext;  
  }  
  template<class   T>   class   linlist  
  {  
          private:  
                    listnode<T>   *head;  
               
                    listnode<T>   *currptr;             //当前接点指针;  
          public:      
    int   size;  
                    linlist(void);  
                    ~linlist(void);  
                     
                    int   listsize(void)   const;  
                    int   listempty(void)   const;  
                    listnode<T>   *index(int   pos);                           //返回指向第pos个接点的指针;  
   
                    void   insert(const   T&   item,int   pos);  
                    T   Delete(int   pos);  
                    T   getdata(int   pos);  
                    void   clearlist(void);  
                     
                    listnode<T>   *reset(int   pos=0);                           //currptr指向接点pos并返回currptr;  
                    listnode<T>   *next(void);  
                    int   endoflist(void)   const;  
  };  
   
   
  template   <class   T>  
  linlist<T>::linlist()  
  {  
    head=new   listnode<T>();  
    size=0;  
  }  
  template<class   T>  
  linlist<T>::~linlist(void)  
  {  
    clearlist();  
    delete   head;  
    head=NULL;  
  }  
  template   <class   T>  
  int   linlist<T>::listsize   (void)   const  
  {  
  return   size;  
   
  }  
   
  template<class   T>  
  int   linlist<T>::listempty(void)   const  
  {  
    if(size<=0)   return   1;  
    else   return   0;  
  }  
  template<class   T>  
  listnode<T>   *linlist<T>::index(int   pos)  
  {  
    if(pos<-1   ||pos>size)  
    {  
      cerr<<"参数越界出错!"<<endl;  
      exit(1);  
       
    }  
    if(pos==-1)   return   head;  
    listnode<T>   *p=head->next;  
    int   i=0;  
    while(p!=NULL&&   i<pos)         //寻找第pos个接点  
    {  
      p=p->next;  
      i++;  
    }  
    return   p;  
  }  
   
  template<class   T>  
  void   linlist<T>::insert(const   T   &item,int   pos)  
  {  
    listnode<T>   *p=index(pos-1);  
    listnode<T>   *newnode=new   listnode<T>(item,p->next);  
    p->next=newnode;  
    size++;  
     
  }  
  template<class   T>  
  T   linlist<T>::Delete(int   pos)  
  {  
  if(size=0)  
  {  
  cerr<<"链表已经空,没有可删除的元素   "<<endl;  
  exit(1);  
  }  
    listnode<T>   *q,*p=index(pos-1);  
    q=p->next;  
    p->next=p->next->next;  
    T   data=q->data;  
    delete   q;  
    seze--;  
    return   data;  
     
  }  
  template<class   T>  
  T   linlist<T>::getdata(int   pos)  
  {  
    listnode<T>   *p=index(pos);  
    return   p->data;  
  }  
  template<class   T>  
  void   linlist<T>::clearlist(void)  
  {  
    listnode<T>   *p,*q;  
    p=head->next;           //此处P为第一个接点  
    while(p!=NULL)  
    {  
      q=p;  
      p=p->next;  
      delete   q;     //从第一个接点往下删除  
    }  
    size=0;  
  }  
  template<class   T>  
  listnode<T>   *linlist<T>::reset(int   pos)  
  {  
    if(head==NULL)   return   NULL;  
    if(pos<-1   ||pos>size)  
    {  
      cerr<<"参数错误"<<endl;  
      exit(1);  
    }  
    if(pos==-1)   return   head;  
    if(pos==0)   currptr=head->next;  
    else  
    {  
      currptr=head->next;  
      listnode<T>   prevptr=head;  
      for(int   i=0;i<pos;i++)  
      {  
        prevptr=currptr;  
        currptr=currptr->next;  
      }  
    }  
    return   currptr;  
     
  }  
  template<class   T>  
  listnode<T>   *linlist<T>::next(void)  
  {  
    if(currptr!=NULL)currptr=currptr->next;  
    return   currptr;  
     
  }  
  template<class   T>  
  int   linlist<T>::endoflist(void)   const  
  {  
    if(currptr==NULL)   return   1;  
    else   return   0;  
  }  
   
  //***********附加部分1***************  
   
   
   
  void   links(linlist<int>   A1,linlist<int>   A2,linlist<int>   A3)  
  {  
  int   m,n,i,j;  
   
  m=A1.listsize();  
  n=A2.listsize();  
        //上面是把A1和A2的大小付给m   and   n;  
  if(m>=n)  
  {  
  cout<<"单链表A的大小是:"<<"   ";  
          cout<<m<<endl;  
    cout<<"数据是:"<<"   ";  
    for(i=0;i<m;i++)  
    cout<<A1.getdata(i)<<"   ";  
    cout<<endl;  
                          cout<<"单链表B的大小是:"<<"     ";  
                          cout<<n<<endl;  
          cout<<"数据是:"<<"";  
          for(i=0;i<n;i++)  
          cout<<A2.getdata(i)<<"   ";  
          cout<<endl;  
          //以下是实现两个链表合并的过程;  
                          cout<<"以下是实现两个链表合并后的数据"<<endl;  
                  for(i=0;i<m;i++)  
                  A3.insert(A1.getdata(i),i);  
  for(j=0;j<n;j++)  
  A3.insert(A2.getdata(j),m+j);  
  for(i=0;i<m+n;i++)  
  cout<<A3.getdata(i)<<"   ";//现在已经实现了两个链表的合并  
   
  }  
  if(m<n)  
  {  
  cout<<"单链表A的大小是:";  
          cout<<A1.listsize()<<"     ";  
  cout<<"数据是:"<<endl;  
    for(i=0;i<m;i++)                                           //1  
    cout<<A1.getdata(i)<<""<<endl;  
                          cout<<"单链表B的大小是:";  
          cout<<A2.listsize()<<"       "<<endl;;  
                          cout<<"数据是:"<<endl;  
          for(i=0;i<n;i++)                                             //2  
          cout<<A2.getdata(i)<<""<<endl;  
                          cout<<"以下是实现两个链表合并后的数据"<<endl;  
                          for(i=0;i<n;i++)                                             //3  
                  A3.insert(A2.getdata(i),i);  
                  for(i=0;i<m;i++)                                             //4  
          cout<<A3.getdata(i)<<   "   ,";  
  for(j=0;j<m;j++)                                             //5  
  A3.insert(A1.getdata(j),m+j);  
  for(j=0;j<n;j++)                                               //6  
  cout<<A3.getdata(m+j)<<"   ,";//现在已经实现了两个链表的合并  
  }  
  }  
  //*******************附加部分2---数据排序******************************************  
  //关键码实现部分  
   
    //用直接插入发对a[]   ---[n-1]排序  
    void   insertsort(int   a[],int   n)  
  {  
          int   i,j;  
          int   temp;  
          for(i=0;i<n;i++)  
          {  
                  temp=a[i+1];  
                  j=i;  
                  while(j>-1&&   temp<a[j])  
                  {  
                          a[j+1]=a[j];  
                          j--;  
                  }  
                  a[j+1]=temp;  
          }  
  }  
   
   
  ///////////main.cpp  
  #include   "linlist.h"  
   
  void   main(void)  
  {  
          welcome();  
          cout<<endl;  
  int   i   ,n=100000,num=1,m=1;  
  int   end;  
   
  //*****************以下为连表的连接***********************8  
  linlist<int>   A,B,C,D;  
   
  cout<<"请输入您的第一个连表数据,按空格键分开数据,按数字“10000”结束连表:"<<endl;  
   
   
  for   (i=0;   i<n   &&   num!=10000;i++)  
        {  
   
                          if(num   !=10000)  
                          {  
   
                          cin>>num;  
                          A.insert(num,i);  
                                }  
                                if(num=10000)  
                                A.insert(NULL,i);  
   
              }  
   
    cout<<"请输入您的第二个连表数据,按空格键分开数据,按数字“100000”结束连表:"<<endl;  
   
   
  for   (i=0;   i<n   &&   num!=100000;i++)  
        {  
   
   
                          cin>>num;  
                          B.insert(num,i);  
   
              }  
   
   
   
                  links(A,B,C);  
                  cout<<endl;  
                   
                   
    //·········下面是第二种扩充————排序············  
   
          //cout<<"请输入你选定的数据,我们将给于排序"<<endl;  
  int   w=C.listsize();  
  //int   a[0]=C.getdata(0);  
        //   for(i=0;i<15;i++)  
          //cin>>a[i];  
          //cout<<"您输入的15个数据是:"<<endl;  
          //for(i=0;i<w;i++)  
  //a[i]=C.getdata(i);  
          //cout<<endl;  
          //cout<<"下面是排序后的数据:"<<endl;  
            int   array[w];  
            for(i=0;i<w;i++)  
            array[i]=C.getdata(i);  
   
          insertsort(array,w);  
          for(   i=0;i<w;i++)  
          cout<<array[i]<<",";  
   
   
   
  }  
   
  问题点数:20、回复次数:2Top

1 楼darkstar21cn(≮天残≯无畏)(死亡进行时)回复于 2005-06-04 21:00:48 得分 10

说个想法吧:  
  (2)用2个指针一个放短链表,另一个放长链表,这么操作就简单多了  
  (3)链表要能在任意处插入的话就好办了,从c读取一个元素,放到D对应的位置,就可以了Top

2 楼MagicCarmack(MagiC++)回复于 2005-06-05 04:19:32 得分 10

第2题   大概思想如下:  
  void   merge(LinkList   A,LinkList   B,LinkList   &C)  
  {  
  &nbsp;&nbsp;p=A->next;q=B->next;C=A;  
  &nbsp;&nbsp;while(p&&q)  
  &nbsp;&nbsp;{  
  &nbsp;&nbsp;&nbsp;&nbsp;s=p->next;p->next=q;   //将B的元素插入  
  &nbsp;&nbsp;&nbsp;&nbsp;if(s)  
  &nbsp;&nbsp;&nbsp;&nbsp;{  
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=q->next;q->next=s;   //如A非空,将A的元素插入  
  &nbsp;&nbsp;&nbsp;&nbsp;}  
  &nbsp;&nbsp;&nbsp;&nbsp;p=s;q=t;  
  &nbsp;&nbsp;}//while  
  }//mergeTop

相关问题

  • 合并排序???????????????
  • 行合并及排序
  • 合并排序中合并部分的递归实现问题---在线等!
  • 线性表做合并排序问题.疑!!!!!!!!!!!!!!!!!
  • 在三个表中合并相同字段并排序(oracle查询)?????
  • 排序,排序
  • 将多个数据集合并到一个数据集后,如何进行排序
  • 设子数组a[0:k]和a[k+1:n-1]已排序好(0<=k<=n-1).试设计一个合并这两个
  • 设子数组a[0:k]和a[k+1:n-1]已排序好(0<=k<=n-1).试设计一个合并这两个
  • 排序

关键词

  • template
  • null
  • linlist
  • listnode
  • currptr
  • ptrnext
  • 接点
  • pos
  • clearlist
  • next

得分解答快速导航

  • 帖主:luora
  • darkstar21cn
  • MagicCarmack

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo