CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

【DS专题活动】第五期(10月27日~11月2日)解答

楼主plainsong(短歌)()2003-11-03 13:59:26 在 专题开发/技术/项目 / 数据结构与算法 提问

B组解答:  
  //第一题,完成者:tristsesame  
  /***************************************************************************  
  函数:IsValidList  
  功能:验证顺序表的合法性  
  参数:顺序表指针  
  返回值:int  
        非0值:合法  
        0:非法  
  *******************************************************************************/  
  int   IsValidList(SqList*   AList)  
  {  
      return   AList   !=   NUll   &&  
                    AList->length   >=   0   &&  
                    AList->listsize   >=   AList->length   &&  
                    AList->elem   !=   NULL;  
  }  
  /**********************************************************  
  函数:SeqList_Reverse  
  功能:顺序表置逆  
  参数:  
              SqList   sqlist,顺序表,必须是有效顺序表。  
  ***********************************************************/  
  void   SeqList_Reverse(SqList   sqlist)  
  {  
          ElemType   temp;  
          int   i,j;  
          assert(IsValidList(&sqlist));  
          for(i   =   0,j   =   sqlist->length   -   1;i   <   j;   i++,j--)  
          {  
          temp   =   sqlist->elem[i];  
          sqlist->elem[i]   =   sqlist->elem[j];  
          sqlist->elem[j]   =   temp;  
          }  
  }  
   
  //第二题,完成者:xiaoyige886  
  /**********************************************************  
  函数:Reverse  
  功能:单链表置逆  
  参数:  
              LinkList   L,单链表节点指针,无头节点的单链表首节点。  
  返回值:  
     LinkList,逆转后的单链表首节点指针。  
  ***********************************************************/  
  LinkList   Reverse(LinkList   L)  
  {  
        LinkList   p,s;  
        p   =   L;    
        L   =   NULL;//L设置为NULL,作为末尾    
        while(p   !=   NULL)  
        {                                                                    
            s   =   p;                                                      
            p   =   p->next;                                        
            s->next   =   L;//向第一结点前插入      
            L   =   s;      
        }  
        return   L;  
  }  
   
  //第二题,完成者:xiaoyige886  
  /**********************************************************  
  函数:Union  
  功能:交叉合并单链表  
  参数:  
              LinkList   m,LinkList   n,将合并的两个  
              单链表节点指针,无头节点的单链表首节点。  
  返回值:  
     LinkList,合并后的单链表首节点指针。  
  说明:  
   线性表A=(a1,a2,...,am),B=(b1,b2,...,bn),按下列规则合并A、B为    
        线性表C,即使得:  
            C=(a1,b1,...,am,bm,bm+1,...,bn)     当m<=n时;  
            C=(a1,b1,...,an,bn,an+1,...,am)     当m>n时;  
        线性表A,B和C均以单链表作存储结构,且C表利用A表和B表的存储空间  
  ***********************************************************/  
  LinkList   Union(LinkList   m,   LinkList   n)  
  {        
          LinkList   pm   =   m;  
          LinkList   pn   =   n;  
          LinkList   s,t;  
           
          while(pm   &&   pn)  
          {  
                  s   =   pm->next;  
                  pm->next   =   pn;//把n链的第(2*k-1)个元素插入m链第(2*k-1)之后    
                   
                  if(s)  
                  {  
                        t   =   pn->next;  
                        pn->next   =   s;//把m链的第(2*k)个元素插入n链第(2*k)之后    
                  }  
   
                  pn   =   t;  
                  pm   =   s;  
           
          }  
          if   (m   ==   NULL)  
              m   =   n;  
          return   m;  
  }  
  问题点数:0、回复次数:12Top

1 楼tristsesame(小小的芝麻)回复于 2003-11-03 14:50:53 得分 0

第三题的回答有点小问题:  
  当pm->next为NULL时,  
  pm->next   =   pn会出错.  
   
                  if(s)  
                  {  
                        t   =   pn->next;  
                        pn->next   =   s;//把m链的第(2*k)个元素插入n链第(2*k)之后    
                  }  
  当s   ==   NULL时  
  pn   =   t;也会出错  
  Top

2 楼plainsong(短歌)()回复于 2003-11-03 15:41:23 得分 0

不会出错的,你仔细想一想。Top

3 楼tristsesame(小小的芝麻)回复于 2003-11-03 18:05:17 得分 0

呵呵  
  我前面的说错了  
  pm->next   =   pn;没有错,我糊涂了。  
   
  但是之前  
  若循环第一次运行是s为NULL  
  那么t没有定义初值.  
  pn   =   t;会出错  
  Top

4 楼plainsong(短歌)()回复于 2003-11-03 18:10:20 得分 0

仍然没有问题:  
  这时执行了pn   =   t和pm=s。  
  而s==NULL,所以pm==NULL,循环不会在继续。虽然这时pn中的值未定义,但它不会再被使用,所以也没有问题。Top

5 楼xiaoyige886(素还真)回复于 2003-11-03 21:45:01 得分 0

upTop

6 楼ZhangYv(迎着朝阳,走向地狱)回复于 2003-11-03 22:25:11 得分 0

// 写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表  
  // (a[1],a[2],...,a[n])逆置为(a[n],a[n-1],...,a[1])。  
  void   Reverse(   SqList   &list   )  
  {  
  ElemType   temp;  
  int   n   =   list.nLen   /   2;  
  int   nLastPos   =   list.nLen   -   1;  
   
  for   (int   i   =   0;   i   <   n;   ++i)  
  {  
  temp   =   list.pElem[i];  
  list.pElem[i]   =   list.pElem[nLastPos];  
  list.pElem[nLastPos--]   =   temp;  
  }  
  }  
   
  2、实现单链表的就地逆置。  
  void   TransElem(LinkList   &L){  
          Lnode   *p,   *q,   *r   =   L;  
          if   (!L->next)  
              return;  
          p   =   r->next;  
          q   =   p->next;  
          p->next   =   NULL;  
          while   (q){  
                  r   =   p;     //3个节点都步进1格  
                  p   =   q;  
                  q   =   q->next;  
                  p->next   =   r;  
          }  
          L->next   =   p;  
  }  
   
  3、线性表A=(a1,a2,...,am),B=(b1,b2,...,bn),按下列规则合并A、B为    
        线性表C,即使得:  
            C=(a1,b1,...,am,bm,bm+1,...,bn)     当m<=n时;  
            C=(a1,b1,...,an,bn,an+1,...,am)     当m>n时;  
        线性表A,B和C均以单链表作存储结构,且C表利用A表和B表的存储空间(注  
        意:单链表的长度m,n未显示存储)  
  LinkList   *Union(LinkList   *LA,LinkList   *LB){  
          LNode   *p,*q,*r;  
          p=LA;  
          q=LB;  
          r=LB->next;  
          while   (p->next   &&   q->next){  
                  p=p->next;  
                  q->next=r->next;  
                  r->next=p->next;  
                  p->next=r;  
                  p=p->next;  
                  r=LB->next;  
          }  
          return   LA;  
  }  
  Top

7 楼ZhangYv(迎着朝阳,走向地狱)回复于 2003-11-03 22:27:44 得分 0

我上面第二题转置链表是带表头节点的!Top

8 楼plainsong(短歌)()回复于 2003-11-03 22:41:49 得分 0

是否有头节点都没有关系,我在上期第二题的解答中就说过了,无头链表的算法也可以用有头链表的算法来实现,反之亦然。  
  Top

9 楼fanever(我的老婆是Sorbet)回复于 2003-11-04 14:15:17 得分 0

copy回去看先Top

10 楼playcs(playcs)回复于 2003-11-04 16:49:08 得分 0

好,学习一下Top

11 楼ZhangYv(迎着朝阳,走向地狱)回复于 2003-11-05 08:07:48 得分 0

无头链表的算法是不可以用有头链表的算法来实现的.Top

12 楼plainsong(短歌)()回复于 2003-11-05 14:15:06 得分 0

void   TransElem(LinkList   &L);//Head-list   edition  
   
  void   TransElem2(LinkList   &   L)//Non-head-list   edition  
  {  
      LNode   Head;  
      LinkList   PHead;  
      Head->next   =   L;  
      PHead   =   &Head;  
      TransElem(PHead);//Implemented   by   head-list   edition  
      L   =   Head->next;  
  }Top

相关问题

  • 谁来解答
  • 急需解答
  • 解答纠错!
  • 请masterz解答
  • 寻求解答
  • 急盼解答
  • 极盼解答~~~~
  • 请解答
  • 急求解答!!!!!!!
  • 如何解答???

关键词

  • 节点
  • 算法
  • 指针
  • 函数
  • pm
  • linklist
  • sqlist
  • pn
  • 线性
  • 单链表首

得分解答快速导航

  • 帖主:plainsong

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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