工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1796|回复: 10

请高手帮我看看错在哪里啦 !谢谢谢谢!

[复制链接]
发表于 2009-4-10 21:58 | 显示全部楼层 |阅读模式
题目::假设有两个按元素值递增有序排列的线性表
A和B,均以单链表作存储结构,请编写算法将A表和B表
归并成一个按元素值递减有序(即非递增有序,允许表
中含有值相同的元素)排列的线性表C, 并要求利用原
表(即A表和B表)的结点空间构造C表。
实现下列函数:
void Union(LinkList &lc, LinkList la, LinkList lb);
/* 依题意,利用la和lb原表的结点空间构造lc表 */
单链表类型定义如下:
typedef struct LNode{
    ElemType      data;
    struct LNode *next;
} LNode, *LinkList;


我的程序:
void Union(LinkList &lc, LinkList &la, LinkList &lb)
{   struct LNode *pa,*pb,*p;
    pa=la->next; //用ha的头结点作为hc的头结点
    pb=lb->next;
    la->next=NULL;
    lc=la;
    while(pa||pb)
      { if(pa->data<=pb->data||pa)
          {p=pa;
           pa=pa->next;
           p->next=lc->next;
           lc->next=p;
          }
        else
          {p=pb;
           pb=pb->next;
           p->next=lc->next;
           lc->next=p;
          }
      }
           
}
但是结果不对 我改了很久很多次都运行结果不对  我现在还弄不懂出错在哪里 麻烦大家啦!
发表于 2009-4-10 22:04 | 显示全部楼层
呵呵呵~~~~~
不懂得路过,顺便帮你顶起啦~
回复

使用道具 举报

发表于 2009-4-10 23:24 | 显示全部楼层
LZ,咋你将la->next = NULL;了?
回复

使用道具 举报

 楼主| 发表于 2009-4-11 00:51 | 显示全部楼层
o 不这样做的话就不能从一开始把  lc->next=p; 而且la->已经赋给pa  应该没关系吧
回复

使用道具 举报

发表于 2009-4-11 09:40 | 显示全部楼层
可以先将链表反序之后在链接。[/b]

  1. #include <iostream.h>
  2. #include<stdlib.h>

  3. struct LinkList
  4. {
  5.     int m_value;
  6.     LinkList *next;
  7. };
  8. void Union(LinkList *lc, LinkList *la, LinkList *lb);

  9. int main()
  10. {
  11.     LinkList arraya[5], arrayb[5];
  12.         for(int i = 0; i < 5; i++)
  13.         {
  14.                 arraya[i].m_value = i;
  15.                 arrayb[i].m_value = i + 1;
  16.                 if (i == 4)
  17.                 {
  18.                         arraya[i].next = NULL;
  19.                         arrayb[i].next = NULL;
  20.                 }
  21.                 else
  22.                 {
  23.                         arraya[i].next = &arraya[i+1];
  24.                         arrayb[i].next = &arrayb[i+1];
  25.                 }
  26.         }



  27.     LinkList *la = arraya;
  28.     LinkList *lb = arrayb;
  29.         LinkList *tmp;
  30.         LinkList *head = (LinkList*)malloc(sizeof(LinkList));
  31.         head->m_value = 100;
  32.         head->next = NULL;
  33.         Union(head, la, lb);
  34.    
  35.     free(head);
  36.        
  37.     return 0;
  38. }


  39. void Union(LinkList *lc, LinkList *la, LinkList *lb)
  40. {
  41.         struct LinkList *p, *q;
  42.         struct LinkList *head;

  43.         //由于链表la和链表lb是递增的,而要求lc是递减的,所以需要先
  44.         //将la和lb反序才能符合要求
  45.          
  46.         //将la链表反转
  47.         if(la->next == NULL || la->next->next == NULL)
  48.                 ;
  49.         else
  50.         {
  51.                 p = la->next;
  52.                 q = p->next;
  53.                 p->next = la;
  54.                 la->next = NULL;
  55.                 while (q != NULL)
  56.             {
  57.                 la = p;
  58.                 p = q;
  59.                 q = q->next;
  60.                 p->next = la;
  61.             }
  62.             la = p;
  63.         }
  64.        
  65.        
  66.        
  67.         //将lb链表反转
  68.         if(lb->next == NULL || lb->next->next == NULL)
  69.         ;
  70.         else
  71.         {
  72.                 p = lb->next;
  73.                 q = p->next;
  74.                 p->next = lb;
  75.                 lb->next = NULL;
  76.                 while (q != NULL)
  77.             {
  78.                 lb = p;
  79.                 p= q;
  80.                 q = q->next;
  81.                 p->next = lb;
  82.             }
  83.             lb = p;
  84.    
  85.         }

  86.         //逐个对比
  87.         head = lc;
  88.         while(la && lb)
  89.         {
  90.                 if(la->m_value >= lb->m_value)
  91.                 {
  92.                         lc->next = la;
  93.                         la = la->next;       
  94.                 }
  95.                 else
  96.                 {
  97.                         lc->next = lb;
  98.                         lb = lb->next;
  99.                 }
  100.                 lc = lc->next;       
  101.         }
  102.         //接上剩余的链表元素
  103.         if(la)
  104.                 lc->next = la;
  105.         if(lb)
  106.                 lc->next = lb;

  107.         lc = head->next;
  108.         //this is only for test
  109.         while (lc != NULL)
  110.     {
  111.         cout<<"lc->m_value:"<<lc->m_value<<endl;
  112.         lc = lc->next;
  113.     }
  114. }
复制代码

评分

2

查看全部评分

回复

使用道具 举报

发表于 2009-4-11 11:02 | 显示全部楼层
la->next = NULL; 破坏了原表数据了

刚开始做这种题时最好能用笔在纸上把你的算法一步一步地画一画(当然如果你熟练了就不必要多此一举了)
回复

使用道具 举报

发表于 2009-4-11 20:26 | 显示全部楼层
lz的想法不够全面哦,你没有将pa和pb为空的情况考虑好,我用你的想法重新写了一点,就成功了,
回复

使用道具 举报

发表于 2009-4-11 20:27 | 显示全部楼层
void Union(LinkList &lc, LinkList &la, LinkList &lb)
{   struct LNode *pa,*pb,*p;
    pa=la->next; //用la的头结点作为lc的头结点
     pb=lb->next;
    la->next=NULL;
    lc=la;
    while(pa||pb)
      { if(pa==0)
          {p=pb;
           pb=pb->next;
           p->next=lc->next;
           lc->next=p;
          }
       else if(pb==0)
          {p=pa;
           pa=pa->next;
           p->next=lc->next;
           lc->next=p;
          }
        else if(pa->data<=pb->data&&pa)
          {p=pa;
           pa=pa->next;
           p->next=lc->next;
           lc->next=p;
          }
        else
          {p=pb;
           pb=pb->next;
           p->next=lc->next;
           lc->next=p;
          }
      }
           
}
回复

使用道具 举报

发表于 2009-4-11 20:30 | 显示全部楼层
你可以将你的if和else的括号内容又编写为一个函数,那么你的主函数就看起来可读性高了。你学的课程应该跟我的一样。这是 数据结构 2.24 4级的难度题,。。。
回复

使用道具 举报

 楼主| 发表于 2009-4-12 13:14 | 显示全部楼层
谢谢 谢谢大家!
回复

使用道具 举报

发表于 2009-6-27 17:35 | 显示全部楼层
好像很多公司笔试的时候出过这类型的题~!
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-15 21:02

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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