C语言链表学生管理系统.docx
《C语言链表学生管理系统.docx》由会员分享,可在线阅读,更多相关《C语言链表学生管理系统.docx(19页珍藏版)》请在冰点文库上搜索。
C语言链表学生管理系统
信息科学与技术学院
本科二年级
数
据
结
构
报
告
专业:
班级:
姓名:
2011年11月26日
数据结构作业
一、作业题目:
学生数据管理系统
二、实验目的:
学习使用C语言链表,编写学生数据管理系统,使我们更好的掌握链表的应用方法,如:
利用链表的建立,删除,查询,插入来实现对学生数据的建立,删除,查询,和插入。
通过该作业,我们可以更好的了解和掌握C语言的基础知识,同时对链表结构有了进一步的应用。
三、开发环境:
本系统基于MicrosoftVisualStudio2010开发平台,使用了C语言的相关知识来实现了对学生数据的建立,删除,查询,和插入等功能。
四、需求分析及相关函数的实现:
本次实验要求是利用C语言链表开发一个学生数据管理系统,在该系统中实现对学生数据的建立,删除,查询,和插入等功能。
首先根据实验要求,需要以下几个函数来实现:
structschool*creat(int);/*创建链表*/
voidoutput(structschool*);/*显示数据*/
structschool*insert(structschool*,structschool*);/*插入数据*/
structschool*del(structschool*,long);/*删除数据*/
structschool*sort(structschool*);/*排序*/
voidsearch(structschool*,int);/*查找*/
1.创建链表函数的实现:
基于该系统为学生数据管理系统,学生相关信息一般包括:
姓名,性别,学号,成绩,专业,因此,建立学生链表结构如下:
name为姓名,sex为性别,num为学号,goal为成绩,project为专业。
structschool/*建立链表结构*/
{
charname[15];
charsex[15];
intnum;
intgoal;
charproject[30];
LIB*next;
};
基于上述结构,可通过下列函数实现对不同学号的学生进行存储数据从而实现学生数据链表的建立。
通常情况下,不允许学生的学号相同,因此fun()函数实现的功能是防止建立的学生数据中存在学号相同的学生,而create()实现的是对输入的学生数据进行存储。
LIB*fun(LIB*q,LIB*head,inti)
{LIB*l;intj;
l=head;
for(j=0;j
{if((l->num)==(q->num))
{printf("该学号已存在,请重新输入:
\n");
q=(LIB*)malloc(LEN);
printf("输入姓名,性别,学号,成绩,专业:
\n");
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
q=fun(q,head,i);
}
l=l->next;
}
returnq;
}
LIB*creat(intn)/*建立学生链表*/
{
LIB*head,*q,*p2,*l;
inti;
head=p2=q=(LIB*)malloc(LEN);
printf("输入姓名,性别,学号,成绩,专业:
\n");
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
for(i=1;i{q=(LIB*)malloc(LEN);
printf("输入姓名,性别,学号,成绩,专业:
\n");
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
q=fun(q,head,i);
p2->next=q;
p2=q;
}
p2->next=0;
returnhead;
}
2.显示学生数据函数的实现:
从头指针开始逐个实现学生数据的显示。
voidoutput(LIB*p)/*显示数据*/
{
LIB*head=p;
if(p==0)printf("\nlistnull\n");
else
while(p!
=0)
{
printf("姓名:
%s;\t性别:
%s;\t学号:
%d;\t成绩:
%d;\t专业:
%s;\n",p->name,p->sex,p->num,p->goal,p->project);
p=p->next;
}
p=head;
}
3.学生数据插入函数的实现
把每次新加入的学生数据都添加到原始链表的尾部。
并对链表进行存储。
其中p为原始链表,o为新增的学生数据。
LIB*insert(LIB*p,LIB*o)/*插入成员*/
{LIB*head=p,*q;
if(p==0)
{
head=o;
o->next=0;
}
else{while(p!
=0)
{if((p->num)==(o->num)){printf("该学号的学生已经存在。
\n");returnhead;}
q=p;p=p->next;
}
q->next=o;o->next=0;
}
returnhead;
}
4.删除数据的函数实现:
该函数中*p为原始数据链表,o为需要删除的学生的学号。
通过对该学生学号的查找来实现链表中学生数据的对应,并对查找到得数据进行删除处理。
如果链表中没有找到需要查找的数据,就输出"*********没有与该学号对应的学生:
"。
LIB*del(LIB*p,into)/*删除数据*/
{
LIB*head=p,*q;
if(p==0)printf("\n该链表为空链表\n");
elseif(o==(p->num))
{head=p->next;free(p);
}elsewhile(p!
=0)
{q=p;p=p->next;if(p==0){printf("*********没有与该学号对应的学生:
******\n");break;}if(o==(p->num))
{q->next=p->next;free(p);break;
}
5.学生数据按学号从小到大的排序函数的实现:
该函数是通过冒泡排序的方法实现了对学生数据按照学号从小到大的顺序进行排序。
LIB*insert1(LIB*p,LIB*o)/*排序*/
{LIB*head=p,*q;if(p==0){head=o;o->next=0;}
elseif((o->num)<(p->num))
{head=o;o->next=p;}else{while((o->num)>(p->num))
{q=p;p=p->next;}if(p->next==0)
{p->next=o;o->next=0;}
else{q->next=o;o->next=p;}
}returnhead;}
LIB*sort(LIB*head)
{LIB*p,*q;if(head==0)returnhead;p=head;head=0;
while(p!
=0)
{q=p;p=p->next;head=insert1(head,q);}
returnhead;}
}returnhead;
}
6.查找函数的实现:
该函数中p为原始数据链表,o为要查找的学生的学号。
按照学号对链表进行对应查找,最后将查找到得数据显示出。
如果链表中没有找到需要查找的数据,就输出"*********没有与该学号对应的学生:
"。
voidsearch(LIB*p,into)
{LIB*head=p;if(p==0)printf("\n******该链表为空链表******\n");
elseif(o==(p->num))
{printf("*******你所查找的学生信息如下:
\n姓名:
%s;\t性别:
%s;\t学号:
%d;\t成绩:
%d;\t专业:
%s;\n",p->name,p->sex,p->num,p->goal,p->project);}
elsewhile(p!
=0){p=p->next;if(p==0){printf("*********没有与该学号对应的学生:
******\n");break;}if(o==(p->num))
{printf("*******你所查找的学生信息如下:
\n姓名:
%s;\t性别:
%s;\t学号:
%d;\t成绩:
%d;\t专业:
%s;\n",p->name,p->sex,p->num,p->goal,p->project);break;}}p=head;}
7.主函数的实现:
intmain()
{
LIB*p=0,*h=0,*q;
intm,a,num,d;
charn[15];
do
{
printf("建立人员管理链表--->1;\n打印人员信息链表--->2;\n插入人员信息--->3;\n按学号删除记录--->4;\n按学号排序--->5;\n查找--->6;\n退出--->0;\n");
printf("请输入你的选择:
");
scanf("%d",&m);
switch(m)
{
case1:
printf("请输入人员总数:
");
scanf("%d",&a);
h=p=creat(a);
break;
case2:
p=h;
output(p);
break;
case3:
p=h;
printf("输入姓名,性别,学号,成绩,专业:
\n");
q=(LIB*)malloc(LEN);
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
h=p=insert(p,q);
break;
case4:
p=h;
printf("请输入你想删除的学生学号:
");
scanf("%d",&num);
h=p=del(p,num);
break;
case5:
p=h;
h=p=sort(p);
break;
case6:
p=h;
printf("请输入你想查找的学生学号:
");
scanf("%d",&d);
search(p,d);
break;
default:
break;
}
}while(m);
}
五、详细设计:
/*文件list.h*/
#ifndefLIST_H
#defineLIST_H
structschool*creat(int);
voidoutput(structschool*);
structschool*insert(structschool*,structschool*);
structschool*del(structschool*,long);
structschool*sort(structschool*);
voidsearch(structschool*,int);
#endif
/*文件list.cpp*/
#include
#include
#include"string.h"
#defineLENsizeof(LIB)
typedefstructschoolLIB;
structschool/*建立链表结构*/
{
charname[15];
charsex[15];
intnum;
intgoal;
charproject[30];
LIB*next;
};
LIB*fun(LIB*q,LIB*head,inti)
{LIB*l;intj;
l=head;
for(j=0;j
{if((l->num)==(q->num))
{printf("*****该学号已存在,请重新输入:
********\n");
q=(LIB*)malloc(LEN);
printf("输入姓名,性别,学号,成绩,专业:
\n");
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
q=fun(q,head,i);
}
l=l->next;
}
returnq;
}
LIB*creat(intn)/*建立学生链表*/
{
LIB*head,*q,*p2,*l;
inti;
head=p2=q=(LIB*)malloc(LEN);
printf("输入姓名,性别,学号,成绩,专业:
\n");
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
for(i=1;i{q=(LIB*)malloc(LEN);
printf("输入姓名,性别,学号,成绩,专业:
\n");
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
q=fun(q,head,i);
p2->next=q;
p2=q;
}
p2->next=0;
returnhead;
}
voidoutput(LIB*p)/*显示数据*/
{
LIB*head=p;
if(p==0)printf("\nlistnull\n");
else
while(p!
=0)
{
printf("姓名:
%s;\t性别:
%s;\t学号:
%d;\t成绩:
%d;\t专业:
%s;\n",p->name,p->sex,p->num,p->goal,p->project);
p=p->next;
}
p=head;
}
LIB*insert(LIB*p,LIB*o)/*插入成员*/
{LIB*head=p,*q;
if(p==0)
{
head=o;
o->next=0;
}
else{while(p!
=0)
{if((p->num)==(o->num)){printf("*******该学号的学生已经存在。
*******\n");returnhead;}
q=p;p=p->next;
}
q->next=o;o->next=0;
}
returnhead;
}
LIB*del(LIB*p,into)/*删除数据*/
{
LIB*head=p,*q;
if(p==0)
printf("\n*******该链表为空链表******\n");
elseif(o==(p->num))
{
head=p->next;
free(p);
}
else
while(p!
=0)
{
q=p;
p=p->next;
if(p==0){printf("*********没有与该学号对应的学生:
******\n");break;}
if(o==(p->num))
{
q->next=p->next;
free(p);
break;
}
}
returnhead;
}
LIB*insert1(LIB*p,LIB*o)/*排序*/
{
LIB*head=p,*q;
if(p==0)
{
head=o;
o->next=0;
}
elseif((o->num)<(p->num))
{
head=o;
o->next=p;
}
else
{
while((o->num)>(p->num))
{
q=p;
p=p->next;
}
if(p->next==0)
{
p->next=o;
o->next=0;
}
else
{
q->next=o;
o->next=p;
}
}
returnhead;
}
LIB*sort(LIB*head)
{
LIB*p,*q;
if(head==0)returnhead;
p=head;
head=0;
while(p!
=0)
{
q=p;
p=p->next;
head=insert1(head,q);
}
returnhead;
}
voidsearch(LIB*p,into)
{LIB*head=p;
if(p==0)
printf("\n******该链表为空链表******\n");
elseif(o==(p->num))
{
printf("*******你所查找的学生信息如下:
\n姓名:
%s;\t性别:
%s;\t学号:
%d;\t成绩:
%d;\t专业:
%s;\n",p->name,p->sex,p->num,p->goal,p->project);
}
else
while(p!
=0)
{
p=p->next;
if(p==0){printf("*********没有与该学号对应的学生:
******\n");break;}
if(o==(p->num))
{
printf("*******你所查找的学生信息如下:
\n姓名:
%s;\t性别:
%s;\t学号:
%d;\t成绩:
%d;\t专业:
%s;\n",p->name,p->sex,p->num,p->goal,p->project);
break;
}
}
p=head;
}
intmain()
{
LIB*p=0,*h=0,*q;
intm,a,num,d;
charn[15];
do
{
printf("建立人员管理链表--->1;\n打印人员信息链表--->2;\n插入人员信息--->3;\n按学号删除记录--->4;\n按学号排序--->5;\n查找--->6;\n退出--->0;\n");
printf("请输入你的选择:
");
scanf("%d",&m);
switch(m)
{
case1:
printf("请输入人员总数:
");
scanf("%d",&a);
h=p=creat(a);
break;
case2:
p=h;
output(p);
break;
case3:
p=h;
printf("输入姓名,性别,学号,成绩,专业:
\n");
q=(LIB*)malloc(LEN);
scanf("%s%s%d%d%s",q->name,q->sex,&q->num,&q->goal,q->project);
h=p=insert(p,q);
break;
case4:
p=h;
printf("请输入你想删除的学生学号:
");
scanf("%d",&num);
h=p=del(p,num);
break;
case5:
p=h;
h=p=sort(p);
break;
case6:
p=h;
printf("请输入你想查找的学生学号:
");
scanf("%d",&d);
search(p,d);
break;
default:
break;
}
}while(m);}