刚学了数据结构,试着变了一个程序,功能如下"建立学生成绩单链表,实现对它的记录的遍历、插入和删除",自己编的程序很悲剧,最后居然数据溢出,请教各位大侠,帮帮指点迷津,其中可能会出现一些低级错误,不要嘲笑!
#include<stdio.h>
#include<string.h>
#include<conio.h>
struct student
{
int num;
int mark;
struct student * next;
};#include<malloc.h>
InitList(struct student *H)
{
H=(struct student*)malloc(sizeof(struct student));
H->next=NULL;
}
struct student *Create(struct student *H)
{
struct student *s,*r;
int n;
float m;
r=H;
for(;n!=0;scanf("%d %f",&n,&m))
{s=(struct student*)malloc(sizeof(struct student));
s->num=n;
s->mark=m;
r->next=s;
r=s;}
return H;
}
struct student *insert(struct student* H,int i, float e)
{
struct student *p,*s;
int k;
p=H;
for(;p!=NULL&&k<i-1;k++)
p=p->next;
s=(struct student*)malloc(sizeof(struct student));
s->num=i;
s->mark=e;
s->next=p->next;
p->next=s;
return H;
}
struct student *del(struct student *H,int i)
{
struct student *p,*r;
int k;char wrong,Error;
p=H;
for(;p->next!=NULL&&k<i-1;k++)
p=p->next;
if(!(p->next))
{printf("wrong");return Error;}
r=p->next;
p->next=p->next->next;
free(r);
return H;}
void display(struct student *H)
{struct student*p;
p=H;
for(;p->next!=NULL;)
{printf("%d %f",p->num,p->mark);}
void main()
{
struct student *H;
int m,p;
float n;
H=Create(H);
display(H);
scanf("%d %f",&m,&n);
H=insert(H,m,n);
scanf("%d",&p);
H=del(H,p);
printf("The End");
}

C/C++ code
#include<stdio.h>
#include<string.h>
#include<conio.h>
struct student
{
int num;
int mark;
struct student * next;
};//#include<malloc.h>多了个头文件
InitList(struct student *H)//这里类型是?少了吧?而且我没发现调用它的地方
{
H=(struct student*)malloc(sizeof(struct student));
H->next=NULL;
}
struct student *Create(struct student *H)
{
struct student *s,*r;
int n;
float m;
r=H;
for(;n!=0;scanf("%d %f",&n,&m))
{s=(struct student*)malloc(sizeof(struct student));
s->num=n;
s->mark=m;
r->next=s;//这里明显逻辑错误,r = H,就是r 指向头了,然后给他下一个结点赋值
r=s;//这里给头赋值,意思就是头和下一个结点的值都是一样的,我知道你是想把r->s连起来后让r指向s这个结点,但是你方法是错的
//这里应该是 r = s; r = r->next;
}
//r->next = NULL;
return H;
}
struct student *insert(struct student* H,int i, float e)
{
struct student *p,*s;
int k;
p=H;
for(;p!=NULL&&k<i-1;k++)
p=p->next;
s=(struct student*)malloc(sizeof(struct student));
s->num=i;
s->mark=e;
s->next=p->next;//这句不要
p->next=s;//这个链表的尾你还没赋值为NULL。
return H;
}
struct student *del(struct student *H,int i)
{
struct student *p,*r;
int k;char wrong,Error;
p=H;
for(;p->next!=NULL&&k<i-1;k++)//用while很简单的吧
p=p->next;
if(!(p->next))
{printf("wrong");return Error;}
r=p->next;
p->next=p->next->next;
free(r);
return H;////这里你把表删了对吧。。那返回的H不就是空么,有必要?为什么不是void函数呢?
}
//p = H;
//while( H )
//{
// H = H->next;具体怎么回事,你可以画个火车头很容易的
// free( p );
// p = H;
//}//这样就删除了。
void display(struct student *H)
{struct student*p;
p=H;
for(;p->next!=NULL;)
{printf("%d %f",p->num,p->mark);}
void main()
{
struct student *H;
int m,p;
float n;
H=Create(H);
display(H);
scanf("%d %f",&m,&n);
H=insert(H,m,n);
scanf("%d",&p);
H=del(H,p);
printf("The End");
}