c语言链表详解课程设计链表问题

课程性质与定位
课程性质:C语言程序设计是一门非常重要的本科生计算机公共基础课程,该课程在全校各专业的本科教学计划中占有重要地位和作用。其重要性不仅仅体现在一般意义上的编程能力,更体现在引导学生实现问题求解思维方式的转换——培养学生的计算思维能力。同时,C语言程序设计还是一门实践性很强的课程,培养学生的实践能力是其核心目标,但仅靠教师讲授是不能让学生学好这门课程的,还必须通过大量的实践环节来...
课程负责人
苏小红,女,博士,哈尔滨工业大学计算机科学与技术学院航天软件工程研究中心教授,博士生导师,中国计算机学会高级会员,计算机科学与技术国家实验教学示范中心副主任,计算机语言基础教研室主任,校教学带头人,校级教学名师奖和宝钢优秀教师奖获得者,年教育部高等学校计算机专业教学指导委员会东北地区专家工作组成员,电子工业出版社特聘专家。曾先后被评为校“三育人”先进工作者、校优秀教师、校优秀共产党员、黑龙江省高校师德先进个人,黑龙江省优秀教师。现为国家级精品课、国家精品资源共享课程“C语言程序设计”和黑龙江省省级精品课...&
C语言程序设计(第3版)
ISBN:978-7-04-
主编:苏小红,王宇颖,孙志岗
高等教育出版社
C语言大学实用教程(第3版)
ISBN:978-7-121-16514-6
主编:苏小红,孙志岗,陈惠鹏
电子工业出版社
C 语言程序设计学习指导(第2版)
ISBN:978-7-04-
主编:苏小红,车万翔,王甜甜
高等教育出版社
C语言程序设计学习指导(第3版)
ISBN:978-7-121-16513-9
主编:苏小红,孙志岗
电子工业出版社
C语言大学教程(第六版)
ISBN:978-7-121-15221-4
主编:Paul Deitel,Harvey Deitel著,苏小红等译
电子工业出版社
双语版C程序设计
ISBN:978-7-121-19043-8
主编:Paul Kelley, 苏小红
电子工业出版社
还有谁在学这门课:
主办单位:高等教育出版社有限公司&&&&&&&&京ICP备号-2&&&&&&京公网安备-2
中国大学精品开放课程适用于《中华人民共和国著作权法》
高等教育出版社享有中国大学精品开放课程信息网络传播的专有使用权 未经书面允许,请勿转播数据结构程序设计――C语言学生管理(动态链表)
寒假回家也没闲着呀,花了4天晚上的时间完成了数据结构的课程设计。以我的观点来看,这个东西大一就应该做了,无非就是结构体,链表,增,删,查,改。坑爹是的,有三个不同的txt文件存放数据,有一种外键的感觉。总体来说仿佛回到了大一写黑框框程序的日子了,又巩固了C语言。不能说是浪费时间,收获也不小,隐藏BUG还在探索当中。代码写的不算漂亮,肯定可以优化。
【运行截图】
1.有三个文件Student.txt,Course.txt,SC.txt分别存放学生基本,课程,学生成绩,程序运行时从这三个文件中读取数据,程序关闭时更新这三个文件。
2.对学生进行查找,删除,增添,修改等操作。
3.查询时采用多样查询。
4.添加时数据的检测。
【设计图】
* 课程设计:C语言版学生管理
* 作者:王小康
* 平台:windows
#define LEN_COURSE
sizeof(Course)
#define LEN_STUDENT sizeof(Student)
typedef struct Course {
/*课程编号*/
char name[20];
/*课程名称*/
/*课程学分*/
/*课程成绩*/
/*课程指针,1.记录课程时所用,2.用于学生结构中*/
typedef struct Student {
char num[10];
char name[16];
char sex[10];
char dept[20];
Course *headC
/*学生所修的课程信息*/
/*学生指针,指向下一个学生*/
/*全局变量,程序启动时加载三个文件夹,这两个变量作为储存数据的实体*/
Student *student = NULL;
Course *course = NULL;
/*读取Student.txt文件中内容创建学生链表*/
Student* Creat_Student()
Student *p1,*p2;
p2 = (Student*)malloc(LEN_STUDENT);
head = p2;
if((fp = fopen("Student.txt","r")) == NULL)
printf("◎学生文件打开错误,请将Student.txt放置与程序同一目录下!!!\n");
for(int i = 0; inum,p1->name,p1->sex,&p1->age,p1->dept);
p1->headCourse = (Course*)malloc(LEN_COURSE);
p1->headCourse->next = NULL;
p1->next = NULL;
p2->next = p1;
fclose(fp);
/*读取Couse.txt文件内容创建课程链表*/
Course* Creat_Course()
Course *p1,*p2;
p2 = (Course*)malloc(LEN_COURSE);
head = p2;
if((fp = fopen("Course.txt","r")) == NULL)
printf("◎课程信息文件打开错误,请将Course.txt放置与程序同一目录下!!!\n");
for(int i = 0; iid,p1->name,&p1->credit);
p1->next = NULL;
p2->next = p1;
fclose(fp);
/*读取SC.txt完善学生信息*/
void Read_SC()
Student* FindStudentByNum(char s[]);
Course* FindCourseById(int n);
Student* stu =NULL;
Course* cou = NULL;
char s_num[10];
//储存Snum
//储存Grade
if((fp = fopen("SC.txt","r")) == NULL)
printf("◎课程信息文件打开错误,请将Course.txt放置与程序同一目录下!!!\n");
for(int i = 0; iheadC
//指针移动到最后一个结点
while (p->next != NULL)
p->next = (Course*)malloc(LEN_COURSE);
Course *q = p->
q->id = cou->
strcpy(q->name,cou->name);
q->credit = cou->
q->grade =
q->next = NULL;
fclose(fp);
/*根据学号查找学生,返回指向该学生的指针*/
Student* FindStudentByNum(char s[])
Student* p =
Student* temp = NULL;
while (p!=NULL)
if(strcmp(p->num,s) == 0)
/*根据ID查找课程,返回指向该课程的指针*/
Course* FindCourseById(int n)
Course* p =
Course* temp = NULL;
while (p!=NULL)
if(n == p->id)
/*根据Name查找课程,返回指向该课程的指针*/
Course* FindCourseByName(char name[])
Course* p =
Course* temp = NULL;
while (p!=NULL)
if(strcmp(name,p->name) == 0)
/*辅助功能判断这个学生是否存在*/
bool IsStudent(char num[])
Student *p = student->
bool flag =
while (p != NULL)
if(strcmp(p->num,num) == 0)
/*【1-1】添加基本数据*/
int Add_Inform()
Student *newStu = NULL;
Student *p =
char stu_num[10];
char stu_name[16];
char stu_sex[10];
char stu_dept[20];
printf("\n---------◎请输入学生基本信息--------\n");
printf("学号
printf("-------------------------------------\n");
scanf("%s%s%s%d%s",stu_num,stu_name,stu_sex,&stu_age,stu_dept);
if(strcpy(stu_sex,"男") != 0 && strcpy(stu_sex,"女"))
printf("◎性别不可乱填!!!\n");
if(!IsStudent(stu_num))
newStu = (Student*)malloc(LEN_STUDENT);
strcpy(newStu->num,stu_num);
strcpy(newStu->name,stu_name);
strcpy(newStu->sex,stu_sex);
newStu->age = stu_
strcpy(newStu->dept,stu_dept);
newStu->headCourse = (Course*)malloc(LEN_COURSE);
newStu->headCourse->next = NULL;
newStu->next = NULL;
for(p=p-> p->next!=NULL; p=p->next);
p->next = newS
printf("\n◎学生信息已成功添加◎\n");
printf("\n◎该学号学生已存在请检查学号重新填写◎\n");
/*【1-2】添加成绩*/
int Add_Grade()
Student *p1 = student->
char stu_num[10];
printf("\n◎请输入您要添加成绩的学号信息:");
scanf("%s",stu_num);
while(p1 != NULL)
if(strcmp(p1->num,stu_num) == 0)
char cou_name[20];
for(pc = p1->headC pc->next!=NULL; pc=pc->next);
printf("\n----◎请输入课程成绩----\n");
printf("课程名称
printf("--------------------------\n");
scanf("%s%d",cou_name,&cou_grade);
if(cou_grade > 100 || cou_grade id = pc1->
strcpy(newCou->name,cou_name);
newCou->credit = pc1->
newCou->grade = cou_
newCou->next = NULL;
pc->next = newC
printf("\n◎学生成绩已成功添加◎\n");
printf("\n◎需要添加的课程在课程数据库中不存在,请先添加这一课程◎\n");
printf("数据库中不存在您要添加学生的信息 ~~~");
printf("\n\n");
/*【1-3】添加可选课程*/
int Add_Class()
Course *pc =
char cou_name[20];
printf("\n----◎请输入课程信息----\n");
printf("编号
printf("------------------------\n");
scanf("%d%s%d",&cou_id,cou_name,&cou_credit);
if(FindCourseById==NULL || FindCourseByName==NULL)
for(; pc->next!=NULL; pc=pc->next);
Course *newCou = (Course*)malloc(LEN_COURSE);
newCou->id = cou_
strcpy(newCou->name,cou_name);
newCou->credit = cou_
newCou->next = NULL;
pc->next = newC
printf("\n◎可选课程已成功添加◎\n");
printf("\n◎数据库中该课程已存在\n\n");
/*【2-1】全量查询*/
void Print_Inquire_All()
void menu_print_out();
Student *p1 = student->
menu_print_out();
while (p1!=NULL)
printf("%s\t%s\t%s\t%d\t%s
",p1->num,p1->name,p1->sex,p1->age,p1->dept);
Course *q = p1->headCourse->
while (q!=NULL)
printf("%s: %d
",q->name,q->grade);
if(q == NULL)
printf("\n");
/*【2-2】按学号查询*/
int Print_Inquire_Num()
void menu_print_out();
Student *p1 = student->
char stu_num[20];
printf("◎请输入您需要查询的学号:");
scanf("%s",stu_num);
while (p1!=NULL)
if(strcmp(p1->num,stu_num) == 0)
menu_print_out();
printf("%s\t%s\t%s\t%d\t%s
",p1->num,p1->name,p1->sex,p1->age,p1->dept);
Course *q = p1->headCourse->
while (q!=NULL)
printf("%s: %d
",q->name,q->grade);
if(q == NULL)
printf("\n\n");
printf("\n◎数据库中不存在您要查询的数据 ~~~");
printf("\n\n");
/*【2-3】按姓名查询*/
int Print_Inquire_Name()
void menu_print_out();
Student *p1 = student->
char stu_name[20];
printf("◎请输入您需要查询的姓名:");
scanf("%s",stu_name);
while (p1!=NULL)
if(strcmp(p1->name,stu_name) == 0)
menu_print_out();
printf("%s\t%s\t%s\t%d\t%s
",p1->num,p1->name,p1->sex,p1->age,p1->dept);
Course *q = p1->headCourse->
while (q!=NULL)
printf("%s: %d
",q->name,q->grade);
if(q == NULL)
printf("\n\n");
printf("\n◎数据库中不存在您要查询的数据 ~~~");
printf("\n\n");
/*【2-4】模糊查询*/
int Print_Inquire_Fuzze()
//TODO:根据关键字查询
void menu_print_out();
Student *p1 = student->
char find[20];
int m = 0;
printf("◎请输入您需要查询的关键字:");
scanf("%s",find);
while (p1 != NULL)
if(strstr(p1->num,find) != 0 || strstr(p1->name,find) != 0 || strstr(p1->sex,find) != 0
|| strstr(p1->dept,find) != 0)
menu_print_out();
printf("%s\t%s\t%s\t%d\t%s
",p1->num,p1->name,p1->sex,p1->age,p1->dept);
Course *q = p1->headCourse->
while (q!=NULL)
printf("%s: %d
",q->name,q->grade);
if(q == NULL)
printf("\n\n");
if(m == 0)
printf("\n◎数据库中不存在您要查询的数据 ~~~");
printf("\n\n");
/*【2-5】全部课程*/
int Print_Course_All()
void course_print_out();
Course *pc = course->
course_print_out();
while (pc != NULL)
printf("%d\t%s\t%d\n",pc->id,pc->name,pc->credit);
/*【3-1】修改数据-删除*/
int Delete()
Student *p1, *p2, *
char stu_num[10];
printf("\n◎请输入您要删除的学号信息:");
scanf("%s",stu_num);
while (p2 != NULL)
if(strcmp(p2->num,stu_num) == 0)
p1->next = p2->
Course *pc1, *
pc1 = p2->headC
while (pc1 != NULL)
temp = pc1;
pc1 = pc1->
free(temp);
printf("\n\n◎已成功删除指定数据◎\n");
printf("数据库中不存在您要修改的数据 ~~~");
printf("\n\n");
/*【3-2】修改数据-修改基本信息*/
int Ament_N_S_A()
Student *p1 = student->
char stu_num[10];
printf("\n◎请输入您要修改的学号信息:");
scanf("%s",stu_num);
while (p1 != NULL)
if(strcmp(p1->num,stu_num) == 0)
printf("------------------\n");
printf("姓名
printf("------------------\n");
scanf("%s%s%d",p1->name,p1->sex,&p1->age);
printf("\n\n◎已成功修改指定学生基本信息◎\n");
printf("数据库中不存在您要修改的数据 ~~~");
printf("\n\n");
/*【3-3】修改数据-修改成绩*/
int Ament_Grade()
Student *p1 = student->
char stu_num[10];
printf("\n◎请输入您要修改的学号信息:");
scanf("%s",stu_num);
while (p1 != NULL)
if(strcmp(p1->num,stu_num) == 0)
printf("可以修改的成绩:
Course *cou[10];
Course *pc1 = p1->headCourse->
int i = 0, length = 0;
while (pc1 != NULL)
cou[i] = pc1;
printf("%s
",pc1->name);
pc1 = pc1->
printf("\n");
printf("请输入各科新成绩: ");
for(i = 0; i grade);
printf("\n\n◎已成功修改指定学生成绩◎\n");
printf("数据库中不存在您要修改的数据 ~~~");
printf("\n\n");
/*输出提示框*/
void menu_print_out()
printf("\n--------------------------------------------------------------------------------\n");
printf("学号
各科成绩....\n");
printf("--------------------------------------------------------------------------------\n");
void course_print_out()
printf("\n---------------------------------\n");
printf("编号
printf("---------------------------------\n");
/*主菜单*/
void menu(void)
void ReadBack();
void menu_add(void);
void menu_inquire(void);
void menu_amend(void);
qTTTTTTTTr
printf("qTTTTTTg学生管理V1.0dTTTTTTr\n");
tTTTTTTTTs
【1】添加数据
【3】修改数据
【2】查询数据
【4】退出系统
printf("tTTTTTTTTTTTTTTTTTTTTTTs\n");
printf("◎请输入功能前的序号进入相应的工具:【
int a = 0;
a = getchar();
while(a!='1'&&a!='2'&&a!='3'&&a!='4')
printf("error! please input the right number!\n");
putchar('\a');
getchar();
printf("◎请重新输入功能前的序号进入相应的工具:【
a = getchar();
menu_add();
menu_inquire();
menu_amend();
ReadBack();
getchar();
/*二级菜单之添加数据*/
void menu_add(void)
system("cls");
getchar();
qTTTTTTTTr
printf("qTTTTTTg
添加数据方式
dTTTTTTTr\n");
tTTTTTTTTs
【1】增添学生
【3】增添可选课程 U\n");
【2】增添成绩
【4】返回菜单
printf("tTTTTTTTTTTTTTTTTTTTTTTTs\n");
printf("◎请输入功能前的序号进入相应的工具:【
int a = 0;
a = getchar();
while(a!='1'&&a!='2'&&a!='3'&&a!='4')
printf("error! please input the right number!\n");
putchar('\a');
getchar();
printf("◎请重新输入功能前的序号进入相应的工具:【
a = getchar();
system("cls");
Add_Inform();
system("pause");
system("cls");
menu_add();
system("cls");
Add_Grade();
system("pause");
system("cls");
menu_add();
system("cls");
Add_Class();
system("pause");
system("cls");
menu_add();
system("cls");
getchar();
/*二级菜单之查询数据*/
void menu_inquire(void)
system("cls");
getchar();
system("cls");
qTTTTTTTTr
printf("qTTTTTTg
查询数据方式
dTTTTTTr\n");
tTTTTTTTTs
【1】全量查询
【4】模糊查询
【2】学号查询
【5】全部课程
【3】姓名查询
【6】返回菜单
printf("tTTTTTTTTTTTTTTTTTTTTTTs\n");
printf("◎请输入功能前的序号进入相应的工具:【
int a = 0;
a = getchar();
while(a!='1'&&a!='2'&&a!='3'&&a!='3'&&a!='4'&&a!='5'&&a!='6')
printf("error! please input the right number!\n");
putchar('\a');
getchar();
printf("◎请重新输入功能前的序号进入相应的工具:【
a = getchar();
system("cls");
Print_Inquire_All();
system("pause");
getchar();
system("cls");
Print_Inquire_Num();
system("pause");
getchar();
system("cls");
Print_Inquire_Name();
system("pause");
getchar();
system("cls");
Print_Inquire_Fuzze();
system("pause");
getchar();;
system("cls");
Print_Course_All();
system("pause");
getchar();
system("cls");
getchar();
/*二级菜单之修改数据*/
void menu_amend(void)
system("cls");
getchar();
system("cls");
qTTTTTTTTr
printf("qTTTTTTg
修改数据方式
dTTTTTTr\n");
tTTTTTTTTs
【1】删除学生
【3】修改成绩
【2】修改学生
【4】返回菜单
printf("tTTTTTTTTTTTTTTTTTTTTTTs\n");
printf("◎请输入功能前的序号进入相应的工具:【
int a = 0;
a = getchar();
while(a!='1'&&a!='2'&&a!='3'&&a!='4')
printf("error! please input the right number!\n");
putchar('\a');
getchar();
printf("◎请重新输入功能前的序号进入相应的工具:【
a = getchar();
char flag[2];
printf("\n◎真的要进行删除吗?y/n :");
scanf("%s",flag);
if(strcmp(flag,"y") == 0)
system("cls");
system("pause");
getchar();
system("cls");
Ament_N_S_A();
system("pause");
getchar();
system("cls");
Ament_Grade();
system("pause");
getchar();
system("cls");
getchar();
/*退出程序时将数据写回Student.txt,Course.txt,SC.txt进行更新*/
void ReadBack()
FILE *stu = fopen("Student.txt","w");
FILE *cou = fopen("Course.txt","w");
FILE *sc = fopen("SC.txt","w");
Student *sp = student->
Course *cp = course->
fprintf(stu,"Sno
fprintf(cou,"Cid
Ccredit");
fprintf(sc,"Sno
while (sp != NULL)
fprintf(stu,"\n%s
%s",sp->num,sp->name,sp->sex,sp->age,sp->dept);
Course *cp1 = sp->headCourse->
while (cp1 != NULL)
fprintf(sc,"\n%s
%d",sp->num,cp1->id,cp1->grade);
cp1 = cp1->
while (cp != NULL)
fprintf(cou,"\n%d
%d",cp->id,cp->name,cp->credit);
fclose(stu);
fclose(cou);
fclose(sc);
/*初始化函数*/
void Lunch()
student = Creat_Student();
course = Creat_Course();
Read_SC();
void main()
SetConsoleTitle(L"C语言学生信息管理系统");
总体上算是把大一的内容运用了一边,大一基本上也就是写写100行左右的算法,没写过这个长的程序。还是要吐槽一下出题的老师,干嘛要用三个文件。不会是为下学期学数据库做准备吧。还有,程序的算法非常直白,这也是导致写这么多的原因。最后最后,2014,大二下学期,还是要继续努力,码农之路还很长。。。。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 c语言链表详解 的文章

 

随机推荐