想两天了,实在不行了……

ygy4444 2011-10-26 04:10:11
struct stu * bond ( struct stu *head1, struct stu *head2 )
{
struct stu *p1, *p2, *q1, *q2, *head;
p1=p2=head1;
q1=q2=head2;
if ( head1==NULL ) head=head2;
else head=head1;
for ( ; q1 != NULL; q2=q1, q1=q1->next )
{
p1=p2=head;
while ( q1->num>p1->num && p1 != NULL )
{
p2=p1;
p1=p1->next;
}
if ( q1->num <= p1->num )
{
if ( p1==head1 ) head=head1;
else p2->next=q1;
q1->next=p1;
}
p2=q2;
}
return head;
}



如上,是我编写的链表插入排序,谭浩强297页11.0《C程序设计》第二版。
只是想知道我这个错在哪里,老谭那个一直没有去试对不对,但对比后发现基本上相差无异,可就是没反应,自己已经看头晕了,请大家帮帮忙,分析一下错误,以及该错误可能涉及到以后什么层面等。

在此谢过!!!
...全文
124 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangzheng11 2011-10-27
  • 打赏
  • 举报
回复
你的main函数呢
ygy4444 2011-10-27
  • 打赏
  • 举报
回复
多谢,找出问题所在了,出在外层循环上,指针都没有在内循环前移动,所以最后都指向内循环第一次不满足内循环条件时P1的值上面了……(我就说设置断点调试的时候四个指针怎么全指向了同一个位置/lh)。
多谢各位!
ygy4444 2011-10-27
  • 打赏
  • 举报
回复
是我误导你了?其实我是想HEAD2向HEAD1上面合并,检查了下我原先的程序,应该是循环逻辑的问题,正在修改ing.....
HFred 2011-10-26
  • 打赏
  • 举报
回复
建议lz再理一下逻辑,不要for、while掺和,导致自己都不懂,可以两层for循环试一试,还有就是注意if else大括号的问题,

struct stu * bond ( struct stu *head1, struct stu *head2 )
{
...
if ( q1->num <= p1->num )
{
if ( p1==head1 )
{
head=head1;
}
else // 链表插入应该是这样的,注意看你最外层的for循环逻辑,当你找到一个节点插入后,下一次for循环q1变成什么了
{
p2->next=q1;
q1->next=p1;
}
}
p2=q2;
}
return head;
}

看你的意思是head1向head2上合,但循环没能保证*p1, *p2, *q1, *q2始终指向自己该指向的列表
ygy4444 2011-10-26
  • 打赏
  • 举报
回复
错了,FREE HAWK做法改掉,还是一样的,开始我就是用这个的,还是没反应……
ygy4444 2011-10-26
  • 打赏
  • 举报
回复
1个,如果直接RETURN掉的话第二个链表后边的结点就没法排列了吧?
2、谭浩强书上确实是已经排序过的链表,所以他的代码是那样的,说对了……
3、按FREE HAWK说的改了,结果是显示第二个链表的内容……

抓狂#*$()@((_%_$&($*&#)(@#%
hawkoffree 2011-10-26
  • 打赏
  • 举报
回复
struct stu * bond ( struct stu *head1, struct stu *head2 )
{
struct stu *p1, *p2, *q1, *q2, *head;
p1=p2=head1;
q1=q2=head2;
if ( head1==NULL ) head=head2;
else head=head1;
for ( ; q1 != NULL; q2=q1, q1=q1->next )
{
p1=p2=head;
while ( q1->num>p1->num && p1 != NULL )
{
p2=p1;
p1=p1->next;
}
if ( q1->num <= p1->num )
{
//if ( p1==head1 ) head=head1;//这里有问题
if ( p1==head ) head=q1;//head始终指向新链表头
else p2->next=q1;
q1->next=p1;
}
p2=q2;
}
return head;
}



ouyh12345 2011-10-26
  • 打赏
  • 举报
回复
for ( ; q1 != NULL; q2=q1, q1=q1->next )
{
p1=p2=head;
如果已经排过序了,不用每次都从头开始遍历
ouyh12345 2011-10-26
  • 打赏
  • 举报
回复
if ( head1==NULL ) head=head2;
这里应该直接return掉
ygy4444 2011-10-26
  • 打赏
  • 举报
回复
int main ()
{
struct stu * creat ( void );
void print ( struct stu *head );
struct stu * bond ( struct stu *head1, struct stu *head2 );
struct stu *head1, *head2, *head;
printf("Creat the first list please:\n");
head1=creat ();
printf("The list you inputed is :\n");
print ( head1 );
printf("Creat the second list please:\n");
head2=creat ();
printf("The second list you inputed is:\n");
print( head2 );
head=bond ( head1, head2 );
printf ( "Now the list is :\n");
print ( head );
system("pause");
return 0;
}



这是main,其它函数都没问题……
DX_deepblue 2011-10-26
  • 打赏
  • 举报
回复
没反应,LZ的main函数是怎写的?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧