为什么个股要跟大盘走:请有C语言基础的兄弟姐妹进来看下这个程序哪地方出错了!

来源:百度文库 编辑:神马品牌网 时间:2024/04/29 10:46:22
此程序是按链表中各结点的数学成绩由大到小对链表各结点重新排列。链表的结点如下:
struct student
{
long num;/*num表示学生的学号*/
char name[10];/*学生的姓名*/
int mathscore;/*数学成绩*/
int progscore;/*程序设计成绩*/
struct student *next;/*指向下一个结点的结构体指针*/
};
我写的排序函数如下:
/*对链表按数学成绩有大到小排序*/
struct student *sortlts(struct student *head)
{
struct student *p0,*p1,*p2,*p3,*p4,*p5,*p6;
p0=p1=p3=head;p2=p1->next;

while(p0==head)
{while(p2!=NULL)
{
if(p1->mathscore<p2->mathscore)
{p1=p2;p4=p3;}/*使p4指向p1之前的结点,p1指向最大值的结点*/
p2=p2->next;p3=p3->next;/*使p2,p3各后移一位,并使p3始终指向p2的前一个结点*/
}
if(p1->next!=NULL)
{
p5=p1->next;
head=p1;
p1->next=p0;
p4->next=p5;
p6=p1;
p1=p3=p0;
p2=p1->next;
}
else{head=p1;p1->next=p0;p4->next=NULL;p6=p1;p1=p0;p3=p0;p2=p1->next;}
}
while((p0!=head)&&(p2->next!=NULL))
{
while(p2!=NULL)/*由while循环找到链表中数学成绩最高的结点*/
{
if(p1->mathscore<p2->mathscore)
{p1=p2;p4=p3;}/*使p4指向p1之前的结点,p1指向最大值的结点*/
p2=p2->next;p3=p3->next;/*使p2,p3各后移一位,并使p3始终指向p2的前一个结点*/
}
if(p1->next!=NULL)
{p5=p1->next;/*使p5指向p1后面的结点*/
p6->next=p1;
p1->next=p0;
p4->next=p5;
p6=p1;
p1=p3=p0;
p2=p1->next;}
else{p6->next=p1;p1->next=p0;p4->next=NULL;p6=p1;p1=p0;p3=p0;p2=p1->next;}
}
while((p0!=head)&&(p2->next=NULL))
{
if(p1->mathscore<p2->mathscore)
{
p6->next=p2;p2->next=p0;p0->next=NULL;
}
}
return(head);
}

我的思路是用选择排序法排列。
先悬赏10分,搞定后保证追加40分!时间紧急,5小时后我将关闭此问题。

while((p0!=head)&&(p2->next=NULL))
这句判断有问题,应该是p2->next == NULL ,不是一个等号
我用下列主函数测试通过了:
void main(void)
{
struct student a,b,c, *d;

a.num=1;
a.mathscore=60; /*数学成绩*/
a.progscore=60; /*程序设计成绩*/
a.next=&b; /*指向下一个结点的结构体指针*/

b.num=2;
b.mathscore=70; /*数学成绩*/
b.progscore=70; /*程序设计成绩*/
b.next=&c; /*指向下一个结点的结构体指针*/

c.num=3;
c.mathscore=80; /*数学成绩*/
c.progscore=80; /*程序设计成绩*/
c.next=0; /*指向下一个结点的结构体指针*/

d=sortlts(&c);

while(1);

}

记得兑现你的承诺!