BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


奥运快报: 
奥运热点:
 

算法填空:A,B为升序的带头结点的单链表,将B合并到A中。
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
liuboo
圣骑士




UID:69332
注册:2003-7-11
最后登录: 2008-07-11
帖子:138
精华:0

可用积分:345 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:804 (稍有积蓄)
推广积分:0 (白手起家)

来自:北京市
状态:...离线...

[个人空间] [短信] [博客]


顶部
1楼 发表于 2008-6-26 10:18 
算法填空:A,B为升序的带头结点的单链表,将B合并到A中。

链表:A ->1->2->3
链表:B ->3->4->5
合并A和B,并把B中重复的结点释放。

结果:A->1->2->3->4->5。



typedef struct node {
        int data;
        struct node *next;
        }linknode, *link;
       

void union(link A, link B)
{
        link q,p,p1,u;
       
        q=B->next;
        free(B);
        p1=A->next;
       
        while(_________________)
        {
                p=p1;
               
                while(_____________)
                {
                        p=p->next;
                }
               
                if(___________)
                {
                        u=q->next;
                        ___________;
                        ___________;
                        q=u;
                }
                else
                {
                        u=q;
                        ________;
                        free(u);
                }
        }
}

那么,至此为止#32楼的coding3215的答案好象是唯一的解,解题的思路是:
BEGIN
1。循环B链表。
2。查找B中是否有A的重复节点
2.1如有,则释放B的重复节点。
2.2.1如无重复,则找到插入位置的前节点
2.2.2插入节点。
END

填空答案为:
1。q
2。 p && q->data != p->data
3。!p
4。for (p = A; p->next && p->next->data < q->data; p = p->next);
5。 q->next = p->next, p->next = q;
6。q = q->next;
还有没有其它的方法呢?从程序的其它语句中来看,主要是把人的思路引导到这个结果上来,但还是有点忐忑第四和第五个空儿。

还有可能有多的答案吗?

[ 本帖最后由 liuboo 于 2008-6-27 16:22 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
coding3125 (Stainbow)
侠客



UID:339155
注册:2005-11-20
最后登录: 2008-09-04
帖子:49
精华:0

可用积分:548 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0 (白手起家)
推广积分:0 (白手起家)

状态:...离线...

[个人空间] [短信] [博客]


顶部
2楼 发表于 2008-6-26 10:21 
q=p->next;

???

有问题吧……
未初始化的指针就敢用啊



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

面包会有的
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
liuboo
圣骑士




UID:69332
注册:2003-7-11
最后登录: 2008-07-11
帖子:138
精华:0

可用积分:345 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:804 (稍有积蓄)
推广积分:0 (白手起家)

来自:北京市
状态:...离线...

[个人空间] [短信] [博客]


顶部
3楼 发表于 2008-6-26 10:34 
这个算法想了很久也没有想通。这儿的两个while的循环如何确定呢? 第二个while要是什么做条件,才要移动p=p->next?
接下来的if又是以什么条件来判断呢?

我理解的大概意思是,要将B中的结点接到A中,把B中重复的结点释放。可是照着这么想,那六个空却无法填上正确的语句~~


想不明白这个算法~~

还望高人指点一二,谢谢?



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
wangsheng0415
圣骑士




UID:715660
注册:2008-6-8
最后登录: 2008-09-04
帖子:92
精华:0

可用积分:140 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0 (白手起家)
推广积分:0 (白手起家)

状态:...离线...

[个人空间] [短信] [博客]


顶部
4楼 发表于 2008-6-26 10:36 
是q=B->next;吧



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
liuboo
圣骑士




UID:69332
注册:2003-7-11
最后登录: 2008-07-11
帖子:138
精华:0

可用积分:345 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:804 (稍有积蓄)
推广积分:0 (白手起家)

来自:北京市
状态:...离线...

[个人空间] [短信] [博客]


顶部
5楼 发表于 2008-6-26 10:41 
对,是q=B->next.

大家帮忙想想吧~我真的是想不出来结果了?(怀疑智商了。。。。。)


那两个while和一个if到底的逻辑是什么?

[ 本帖最后由 liuboo 于 2008-6-26 10:43 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
liuboo
圣骑士




UID:69332
注册:2003-7-11
最后登录: 2008-07-11
帖子:138
精华:0

可用积分:345 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:804 (稍有积蓄)
推广积分:0 (白手起家)

来自:北京市
状态:...离线...

[个人空间] [短信] [博客]


顶部
6楼 发表于 2008-6-26 10:58 
no one can help it?



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
Cyberman.Wu
精灵王




UID:690278
注册:2008-4-11
最后登录: 2008-09-05
帖子:374
精华:0

可用积分:456 (白手起家)
信誉积分:0
专家积分:5 (本版:0)
空间积分:0 (白手起家)
推广积分:0 (白手起家)

状态:...在线...

[个人空间] [短信] [博客]


顶部
7楼 发表于 2008-6-26 12:52 
哪来的题目?小到函数也要有一个明确的规格吧,这里显然没说清楚:
1. 合并以后是什么样的,把B的节点全部导到A中,而B为空,还是反之?
2. 是不是链表中不能出现相同的节点?排序并不隐含这一条件。

从代码看释放了B,我们假设是由A带出的,那么代码中存在一个基本的问题:如果B->next的值小于A->next,上述代码能修改A->next吗?p1是A->next的值,而不是这自身。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
liuboo
圣骑士




UID:69332
注册:2003-7-11
最后登录: 2008-07-11
帖子:138
精华:0

可用积分:345 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:804 (稍有积蓄)
推广积分:0 (白手起家)

来自:北京市
状态:...离线...

[个人空间] [短信] [博客]


顶部
8楼 发表于 2008-6-26 13:36 
链表:A ->1->2->3
链表:B ->3->4->5
合并A和B,并把B中重复的结点释放。

结果:A->1->2->3->4->5。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-09-05
帖子:3553
精华:4

可用积分:6229 (富足长乐)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2 (白手起家)
推广积分:0 (白手起家)

状态:...在线...

[个人空间] [短信] [博客]


顶部
9楼 发表于 2008-6-26 14:14 
很多笔试都出这个题



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
coding3125 (Stainbow)
侠客



UID:339155
注册:2005-11-20
最后登录: 2008-09-04
帖子:49
精华:0

可用积分:548 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0 (白手起家)
推广积分:0 (白手起家)

状态:...离线...

[个人空间] [短信] [博客]


顶部
10楼 发表于 2008-6-26 14:28 
回复 #1 liuboo 的帖子

void union(link A, link B)
{
        link q,p,p1,u;
      
        q=B->next;
        free(B);
        p1=A->next;
      
        while(q)
        {
                p=p1;
               
                while( p && q->data != p->data )//查找B中是否有A的重复节点
                {
                        p=p->next;
                }
               
                if(!p)  //没有找到重复节点,连接到A表的相应位置
                {
                        u=q->next;
                        //找到插入位置的前节点
                        for (p = A; p->next && p->next->data < q->data; p = p->next);
                        //插入到合适的位置
                        q->next = p->next, p->next = q;                                                                          
                        q=u;
                }
                else//找到重复节点,删除之
                {
                        u=q;
                        q = q->next;
                        free(u);
                }
        }
}

[ 本帖最后由 coding3125 于 2008-6-27 11:27 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

面包会有的
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 9.830936 second(s), 4 queries , Gzip enabled