求救
admin 发表于 2010-04-21 | 来源:互联网 | 阅读:

刚学了数据结构,试着变了一个程序,功能如下"建立学生成绩单链表,实现对它的记录的遍历、插入和删除",自己编的程序很悲剧,最后居然数据溢出,请教各位大侠,帮帮指点迷津,其中可能会出现一些低级错误,不要嘲笑!
#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");
}

才1个评论
  1. aw3fae 说:

    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");
    }

我要评论

评论功能因故关闭!

请加入我们的QQ群一起参与讨论:群号59400482(500人超级群)


返回首页 | 关于我们 | 联系我们 | 广告合作 | 网站地图 | 友情链接 | 版权声明