我的c程序关于链表方面的,编译时没问题,可是运行时没有错误,请大虾指教一下!多谢!
我觉得好象是链表排序的错误!!
运行时候出现windows 运行错误!!
请看一下!!!
多谢!!
#include <stdlib.h>
#include <stdio.h>
#define LEN sizeof(struct student)
struct student
{
int num;
char name[20];
int grade1;
int grade2;
float avggrade;
struct student *next;
};
int n;
struct student *create(void)
{
struct student *head;
struct student *p1,*p2;
n = 0;
p1 = p2 = (struct student *)malloc(LEN);
scanf("%d%s%d%d",&p1->num,p1->name,&p1->grade1,&p1->grade2);
p1->avggrade = (p1->grade1+p1->grade2)/2;
head = NULL;
while(p1->num!=0)
{
if(n==0)
head = p1;
p2 = p1;
p1 = (struct student *)malloc(LEN);
scanf("%d%s%d%d",&p1->num,p1->name,&p1->grade1,&p1->grade2);
p2->next = p1;
p1->avggrade = (p1->grade1+p1->grade2)/2;
n = n+1;
}
p2->next = NULL;
return head;
}
void print(struct student *head)
{
struct student *temp;
temp = head;
if(temp!=NULL)
{
while(temp!=NULL)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
}
//链表排序
struct student *makeSequence(struct student *head)
{
struct student stus[n];
struct student temp;
int i,j;
for(i=0;i<n-1;i++)
{
stus[i] = *head;
head = head->next;
}
stus[n-1] = *head;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stus[i].avggrade<stus[j].avggrade)
{
temp = stus[i];
stus[i] = stus[j];
stus[j] = temp;
}
}
}
head = &stus[0];
for(i=0;i<n-1;i++)
{
stus[i].next = &stus[i+1];
}
stus[n-1].next = NULL;
return head;
}
//插入新节点
struct student *insertNode(struct student *head,struct student *stu)
{
struct student *p1,*p2;
p1 = head;
if(head==NULL)
head = stu;
else
{
while(stu->num>p1->num&&p1->next!=NULL)
{
p2 = p1;
p1 = p1->next;
}
if(stu->num>p1->num)
{
if(p1==head)
head = stu;
else
p2->next = stu;
stu->next = p1;
}
else
{
p1->next = stu;
stu->next = NULL;
}
}
n++;
return head;
}
int main(void)
{
struct student *head;
struct student *stu;
head = create();
print(head);
printf("%d\n",n);
head = makeSequence(head);
printf("print the sequence data\n");
print(head);
/*scanf("%d%s%d%d",&stu->num,stu->name,&stu->grade1,&stu->grade2);
stu->avggrade = (stu->grade1+stu->grade2)/2;
head = insertNode(head,stu);
print(head);*/
system("pause");
}
问题点数:50、回复次数:5Top
1 楼caicheng(菜菜)回复于 2004-09-02 10:47:01 得分 10
仔细检查,肯定是逻辑错误
编译的时候是不会查出逻辑错误的
大多数是因为你指针指到不该指的地方了
你应该拿一支笔,好好的在纸上画出来Top
2 楼blh(当你不割肉时,你的损失只是个数字,当你割肉时,你的损失就是你的肉)回复于 2004-09-02 11:37:43 得分 20
struct student *makeSequence(struct student *head)
{
struct student stus[n];
struct student temp;
int i,j;
for(i=0;i<n-1;i++)
{
stus[i] = *head;
head = head->next;
}
stus[n-1] = *head;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stus[i].avggrade<stus[j].avggrade)
{
temp = stus[i];
stus[i] = stus[j];
stus[j] = temp;
}
}
}
head = &stus[0];// ??? local varilble shall change to invalid when function returned.
for(i=0;i<n-1;i++)
{
stus[i].next = &stus[i+1];
}
stus[n-1].next = NULL;
return head;
}
try the following:
struct student *makeSequence(struct student *head)
{
struct student *stus[n];
struct student *temp;
int i,j;
for(i=0;i<n-1;i++)
{
stus[i] = head;
head = head->next;
}
stus[n-1] = head;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stus[i]->avggrade<stus[j]->avggrade)
{
*temp = *stus[i];
*stus[i] = *stus[j];
*stus[j] = *temp;
}
}
}
head = stus[0];
for(i=0;i<n-1;i++)
{
stus[i]->next = stus[i+1];
}
stus[n-1]->next = NULL;
return head;
}
Top
3 楼FreeFice(庄鱼)回复于 2004-09-02 11:43:19 得分 10
链表排序的这一部分,你打算做什么呢?
for(i=0;i<n-1;i++)
{
stus[i] = *head;
head = head->next;
}
链表的排序没有必要由结构数组代替,可以直接运用的
strudent *p,*q,*t;
if(p->next.avggrade < q->next.avggrade){
t=p->next;
p->next = q->next;
q->next = t;}
scanf("%d%s%d%d",&p1->num,p1->name,&p1->grade1,&p1->grade2);
scanf("%d%s%d%d",&(p1->num),&(p1->name),&(p1->grade1),&(p1->grade2));
我更习惯这种加了括号的方式
p2->next = NULL;
return head;
我觉得改成:p1->next = NULL; return head;更合适
你看
if(temp!=NULL)这个条件判断能不能去掉Top
4 楼whyglinux(山青水秀)回复于 2004-09-02 11:48:35 得分 10
在你的链表排序程序中, struct student stus[n]; 中的stus 数组是一个局部数组,这个函数执行完毕后就不存在了。你应该为它动态分配内存:
struct student* stus = (struct student*)malloc(n*sizeof(struct student));
另外,你的排序应该在原链表的基础进行,不应该象上面那样再拷贝一份,这样做效率太差。
还有,你程序中动态分配的内存都没有释放。Top
5 楼caicheng(菜菜)回复于 2004-09-02 17:20:40 得分 0
惭愧,就我最懒惰,只给出建议Top




