首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

编了个链表的成绩管理系统 能通过编译 运行时出错了解决方法

2012-02-11 
编了个链表的成绩管理系统 能通过编译 运行时出错了C/C++ code// 学生成绩管理系统.cpp : Defines the ent

编了个链表的成绩管理系统 能通过编译 运行时出错了

C/C++ code
// 学生成绩管理系统.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdlib.h"#define N 2typedef struct node{    char *name;  //学生的姓名    int num;   //学生的学号    int score;  //学生的分数    struct node *next;}student;int i;//新建函数student * initial(student * stu){    student *p,*q;    p=(student *)malloc(sizeof(student));    //stu->next=p;    stu=p;        for(i=1;i<=N;i++)    {        q=(student *)malloc(sizeof(student));        printf("第%d个学生的信息:姓名  学号 分数\n",i);        scanf("%c%d%d",&q->name,&q->num,&q->score);        printf("\n");        p=q;        p->next=(student *)malloc(sizeof(student));          p=p->next;        p->next=NULL;        free(q);    }    free(p);    return stu;}//输出函数void print(student * stu){       /*student *p;    p=stu->next;        for(i=1;(i<=4)&&(p->next);i++,p=p->next)    {        p=(student *)malloc(sizeof(student));        printf("第%d个学生的信息:姓名%5c  学号%5d 分数%5d\n",i,p->name,p->num,p->score);        p->next=(student *)malloc(sizeof(student));        free(p);    }    */    int i=1;    while(stu->next!=NULL)    {        printf("第%d个学生的信息:姓名%s  学号%5d 分数%5d\n",i++,stu->name,stu->num,stu->score);        stu=stu->next;    }}//查找函数void find(student * stu){    int n;    printf("按学号查找!\n");    student *p;    p=stu->next;    p=(student *)malloc(sizeof(student));    printf("查找的学号:");    scanf("%d",&n);    for(;p->next;p=p->next)    {        if(p->num==n)        {               printf("查找成功\n");            printf("此学生的信息:姓名%5c  学号%5d 分数%5d\n",p->name,p->num,p->score);        }        p->next=(student *)malloc(sizeof(student));    }    if(p==NULL)        printf("无此学生!!!\n");    free(p);}//插入函数student * insert(student * stu){    student *p,*q;    p=stu->next;    p=q=(student *)malloc(sizeof(student));    printf("输入插入学生的信息 姓名 学号 分数\n");    scanf("%c%d%d",&q->name,&q->num,&q->score);    for(;p->next;p=p->next);    p->next=q;    p=p->next;    q->next=NULL;    return stu;}//删除函数student *del(student * stu){    student *p,*q,*r;    int n;    p=stu->next;    p=q=r=(student *)malloc(sizeof(student));    printf("输入删除学生的姓名\n");    scanf("%c%d%d",&n);    for(;p->next;p=p->next)    {        if(p->num==n)        {               printf("此学生的信息:姓名%5c  学号%5d 分数%5d\n",p->name,p->num,p->score);            r=q->next;            q->next=r->next;        }        q=p;    }    if(p==NULL)        printf("无此学生!!!\n");    return stu;}int main(int argc, char* argv[]){    student *stu;    stu=(student*)malloc(sizeof(student));    stu->next=NULL;    int choice,flag=1;    do{            printf("1:输入 姓名 学号 分数 名次\n 2:输出\n 3:查找\n 4:插入\n 5:删除\n");        scanf("%d",&choice);        switch(choice){                   case 1:stu=initial(stu);               break;                   case 2:print(stu);               break;                   case 3:find(stu);               break;                   case 4:stu=insert(stu);                break;                   case 5:stu=del(stu);               break;                    }        fflush(stdin);        printf("是否继续 1:是    0:否\n");        scanf("%d",&flag);    }while(flag);    printf("Hello World!\n");    return 0;}


本人小菜心血来潮 编了个链表的成绩管理系统
能通过编译
运行时出错了
很想知道 错在哪里
以便以后能够注意
很急,真的很急
我会很感激的

------解决方案--------------------


//#include "stdafx.h"换成
#include<iostream>试试
[解决办法]

探讨

//#include "stdafx.h"换成
#include<iostream>试试

[解决办法]
没细看,你的name是一个字符串指针,但是没有分配空间
[解决办法]
创建链表有问题,没细看,看到链表的创建有问题,既然给p了空间,到后面p的指针就不应该改变了吧
student * initial(student * stu)
{
student *p,*q;
p=(student *)malloc(sizeof(student));//stu=(student *)malloc(sizeof(student));stu=NULL;
stu->next=p;
stu=p;


[解决办法]
C/C++ code
#include "stdafx.h"#include "stdlib.h"#define N 2typedef struct node{    char name[20];  //学生的姓名    int num;   //学生的学号    int score;  //学生的分数    struct node *next;}student;int i;//新建函数student * initial(){    student *p, *t;    p = NULL;        t = NULL;    for(i=1;i<=N;i++)    {        printf("第%d个学生的信息:姓名  学号 分数\n",i);        t=(student *)malloc(sizeof(student));        memset(t, sizeof(student), 1);        scanf("%s %d %d",&t->name,&t->num,&t->score);        //        if(p)         {            t->next = p;            p = t;        }        else        {            p = t;            t->next = NULL;        }    }    return p;}//输出函数void print(student * stu){    int i=1;    while(stu)    {        printf("第%d个学生的信息:姓名%s  学号%5d 分数%5d\n",i++,stu->name,stu->num,stu->score);        stu = stu->next;    }}//查找函数void find(student * stu){    int n;    printf("按学号查找!\n");    student *p;    p=stu->next;    p=(student *)malloc(sizeof(student));    printf("查找的学号:");    scanf("%d",&n);    for(;p->next;p=p->next)    {        if(p->num==n)        {               printf("查找成功\n");            printf("此学生的信息:姓名%5c  学号%5d 分数%5d\n",p->name,p->num,p->score);        }        p->next=(student *)malloc(sizeof(student));    }    if(p==NULL)        printf("无此学生!!!\n");    free(p);}//插入函数student * insert(student * stu){    student *p,*q;    p=stu->next;    p=q=(student *)malloc(sizeof(student));    printf("输入插入学生的信息 姓名 学号 分数\n");    scanf("%c%d%d",&q->name,&q->num,&q->score);    for(;p->next;p=p->next);    p->next=q;    p=p->next;    q->next=NULL;    return stu;}//删除函数student *del(student * stu){    student *p,*q,*r;    int n;    p=stu->next;    p=q=r=(student *)malloc(sizeof(student));    printf("输入删除学生的姓名\n");    scanf("%c%d%d",&n);    for(;p->next;p=p->next)    {        if(p->num==n)        {               printf("此学生的信息:姓名%5c  学号%5d 分数%5d\n",p->name,p->num,p->score);            r=q->next;            q->next=r->next;        }        q=p;    }    if(p==NULL)        printf("无此学生!!!\n");    return stu;}int main(int argc, char* argv[]){    student *stu;    stu = NULL;    int choice,flag=1;    do{        printf("\n1:输入 姓名 学号 分数 名次\n 2:输出\n 3:查找\n 4:插入\n 5:删除\n");        scanf("%d",&choice);        switch(choice)        {           case 1:stu = initial();               break;                   case 2:print(stu);               break;                   case 3:find(stu);               break;                   case 4:stu=insert(stu);                break;                   case 5:stu=del(stu);               break;        }        fflush(stdin);        printf("是否继续 1:是    0:否\n");        scanf("%d",&flag);    }while(flag);    printf("Hello World!\n");    return 0;} 


[解决办法]
主要是输入格式控制,以及动态分配内存方面的问题.

C/C++ code
// 学生成绩管理系统.cpp : Defines the entry point for the console application.//#include "stdlib.h"#include "stdio.h"#define N 2typedef struct node{    //char *name;  //学生的姓名    char name[100];    int num;   //学生的学号    int score;  //学生的分数    struct node *next;}student;int i;//新建函数student * initial(student *stu){    student *p, *q;    p=(student *)malloc(sizeof(student));    p->next = NULL;    //stu->next=p;    stu=p;        for(i=1;i<=N;i++)    {        q=(student *)malloc(sizeof(student));        q->next = NULL;        printf("第%d个学生的信息:姓名  学号 分数\n",i);                /*scanf("%c%d%d",&q->name,&q->num,&q->score);*/        scanf("%s%d%d",q->name,&q->num,&q->score);               /*printf("\n");        p=q;        p->next=(student *)malloc(sizeof(student));          p=p->next;        p->next=NULL;        free(q);        */        p->next = q;        p = q;    }   // free(p);    return stu;}//输出函数void print(student * stu){       student *p;    p=stu->next;    /*    for(i=1;(i<=4)&&(p->next);i++,p=p->next)    {        p=(student *)malloc(sizeof(student));        printf("第%d个学生的信息:姓名%5c  学号%5d 分数%5d\n",i,p->name,p->num,p->score);        p->next=(student *)malloc(sizeof(student));        free(p);    }    */    int i=1;        while(p!=NULL)    {        printf("第%d个学生的信息:姓名%s  学号%5d 分数%5d\n",i++,p->name,p->num,p->score);        p=p->next;    }}//查找函数void find(student * stu){    int n;    printf("按学号查找!\n");    student *p;    p=stu->next;    //p=(student *)malloc(sizeof(student));    printf("查找的学号:");    scanf("%d",&n);    //for(;p->next;p=p->next)    for(;p!=NULL;p=p->next)    {        if(p->num==n)        {               printf("查找成功\n");            printf("此学生的信息:姓名%5s  学号%5d 分数%5d\n",p->name,p->num,p->score);            return;        }        //p->next=(student *)malloc(sizeof(student));    }    if(p==NULL)        printf("无此学生!!!\n");    //free(p);}//插入函数student * insert(student * stu){    student *p,*q;    p=stu->next;    q=(student *)malloc(sizeof(student));    printf("输入插入学生的信息 姓名 学号 分数\n");   // scanf("%c%d%d",&q->name,&q->num,&q->score);    scanf("%s%d%d",q->name,&q->num,&q->score);    for(;p->next!=NULL;p=p->next);    p->next=q;    //p=p->next;    q->next=NULL;    return stu;}//删除函数student *del(student * stu){    student *p,*q,*r;    int n;    r = stu;    p=stu->next;    //p=q=r=(student *)malloc(sizeof(student));    printf("输入删除学生的学号\n");    //scanf("%c%d%d",&n);    scanf("%d",&n);    for(;p!=NULL;r=p,p=p->next)    {        if(p->num==n)        {               printf("此学生的信息:姓名%5s  学号%5d 分数%5d\n",p->name,p->num,p->score);            r->next = p->next;            free(p);            break;            //r=q->next;            //q->next=r->next;        }        //q=p;    }    if(p==NULL)        printf("无此学生!!!\n");    return stu;}int main(int argc, char* argv[]){    student *stu = NULL;    //stu=(student*)malloc(sizeof(student));    //stu->next=NULL;    int choice,flag=1;    do{            printf("1:输入 姓名 学号 分数 名次\n 2:输出\n 3:查找\n 4:插入\n 5:删除\n");        scanf("%d",&choice);        switch(choice){           case 1:stu=initial(stu);               break;                   case 2:print(stu);               break;                   case 3:find(stu);               break;                   case 4:stu=insert(stu);                break;                   case 5:stu=del(stu);               break;                    }        fflush(stdin);        printf("是否继续 1:是    0:否\n");        scanf("%d",&flag);    }while(flag);    printf("Hello World!\n");    return 0;} 


[解决办法]
上面的程序修改了几处地方:

1。 根节点: 我发现初学链表的人都喜欢malloc一块内存给根节点,希望自己琢磨一下, 其实不需要的,只需要一个指针。

2. 改动了 initial 函数, 这里输入数据, 里面重要的改动就是name,直接用数组而不是用指针,这可能是你错的地方,因为你根本没有分配内存给name,就用他来接收输入。 

3. 改动了print() 输出, 程序没有排序,后输入的先输出。


其他函数没有改动,你自己改吧!


[解决办法]

探讨
主要是输入格式控制,以及动态分配内存方面的问题.

C/C++ code

// 学生成绩管理系统.cpp : Defines the entry point for the console application.
//
#include "stdlib.h"
#include "stdio.h"

#define N 2

typedef struct node
{
……

热点排行