为什么链表的排序出错 第一行数据不参与排序?

hzc543806053 2011-06-05 04:19:38
/* Note:Your choice is C IDE 同学通讯录*/
#include "stdio.h"
#include<stdlib.h>
#include<string.h>

struct stu
{
long num; //学号
char name[20]; //姓名
char sex; //性别
long phone; //电话号码
struct stu *next;
};

struct stu *creat_list() // 建立链表
{
struct stu *head,*q,*p;
int i;
for(i=0;i<3;i++)
{
q=(struct stu *)malloc(sizeof(struct stu));
printf("请输入第%d个待处理数据:\n学号 姓名 性别 电话 (中间空格隔开)\n",i+1);
scanf("%ld %s %c %ld",&q->num,&q->name,&q->sex,&q->phone);

if(i==0)
p=head=q;
else
{
p->next=q;
p=q;
}

}
p->next=NULL;
return head;
}

void print(struct stu *head) //输出链表
{
struct stu *p;
int i;
p=head;
printf("序号\t学号\t\t姓名\t\t性别\t\t电话\n");
for(i=0;p!=NULL;i++)
{
printf("%d\t%ld\t\t%s\t\t%c\t\t%ld\n",i+1,p->num,p->name,p->sex,p->phone);
p=p->next;
}
}

struct stu *paixu(struct stu *head) //链表的排序
{
struct stu *pra,*pa,*prb,*pb;
pra=head;
pa=pra->next;
while(pa!=NULL)
{
prb=pa;
pb=prb->next;
while(pb!=NULL)
{
if(pb->num<pa->num)
{
prb->next=pb->next;
pb->next=pa;
pra->next=pb;
pa=pb;
pb=prb->next;
continue;
}
prb=pb;
pb=pb->next;
}
pra=pa;
pa=pa->next;
}
return head;
}

main()
{
struct stu *student;

student=creat_list();
printf("输出链表\n");
print(student);


student=paixu(student);
printf("排序结果\n");
print(student);
}

1》链表的冒泡排序,结点的交换,为什么排序时 第一行数据不参与排序??要如何更改呢?

2》输入电话号码时, 因为电话号码是11位数的,在类型为long 时 ,输入11位数
时是不是溢出了,而输出不是想要的结果,又该如何改呢?
谢谢各位大牛了!
...全文
249 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnYidan 2011-06-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q191201771 的回复:]
在paixu函数中

pra=head;
pa=pra->next;

你是从pa开始比较
已经跳过了head
[/Quote]

其实开头的问题,自己跟踪一下是很容易的
蓝染忽右介 2011-06-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q191201771 的回复:]
在paixu函数中

pra=head;
pa=pra->next;

你是从pa开始比较
已经跳过了head
[/Quote]
++
就想叫yoko 2011-06-05
  • 打赏
  • 举报
回复
在paixu函数中

pra=head;
pa=pra->next;

你是从pa开始比较
已经跳过了head
ryfdizuo 2011-06-05
  • 打赏
  • 举报
回复
struct stu *paixu(struct stu *head) //链表的排序
{
struct stu *pra,*pa,*prb,*pb;
pra=head;
pa=pra->next;
while(pa!=NULL)
{
prb=pa;
pb=prb->next;
while(pb!=NULL)
{
if(pb->num<pa->num) //第一次排序,pa指向第二个元素,pb指向第三个元素。
{
prb->next=pb->next;
pb->next=pa;
pra->next=pb;
pa=pb;
pb=prb->next;
continue;
}
prb=pb;
pb=pb->next;
}
pra=pa;
pa=pa->next;
}
return head;
}

第二个可以用__int64
ryfdizuo 2011-06-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hzc543806053 的回复:]

哎 还是搞不懂那 排序为什么第一行不参与排序 ,哪位高手指点一下 ,小弟万分感谢!
[/Quote]
加我546952720
hzc543806053 2011-06-05
  • 打赏
  • 举报
回复
哎 还是搞不懂那 排序为什么第一行不参与排序 ,哪位高手指点一下 ,小弟万分感谢!
ryfdizuo 2011-06-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hzc543806053 的回复:]

那具体修改是怎样的呢?
[/Quote]
百度单链表 插入排序
最好是自己调试解决。
hzc543806053 2011-06-05
  • 打赏
  • 举报
回复
那具体修改是怎样的呢?

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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