编了个链表的成绩管理系统 能通过编译 运行时出错了
// 学生成绩管理系统.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 "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;}
[解决办法]
主要是输入格式控制,以及动态分配内存方面的问题.
// 学生成绩管理系统.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() 输出, 程序没有排序,后输入的先输出。
其他函数没有改动,你自己改吧!
[解决办法]