C语言课程设计.docx
- 文档编号:9051478
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:17
- 大小:51.27KB
C语言课程设计.docx
《C语言课程设计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
C语言课程设计
C语言课程设计
——学生成绩简单管理程序二
姓名:
学号:
学院:
一、程序功能
用单向链表结构实现简单的学生成绩管理功能,具有链表建立、链表输出、结点有序插入、结点删除、数据查询等功能。
程序执行过程为:
循环显示主菜单,用户在GiveyourChoice:
处输入选项,即按照功能列表输入0~9中的任意一个数字,按回车后,执行相应的功能。
按照前面“菜单设计练习”的要求建立右图所示主菜单结构。
各菜单功能如下:
(1)Create()含函数(建立有序单项链表)
从键盘上输入一个学生的姓名和成绩,以姓名为序建立有序链表。
插入一条记录后,显示提示确认是否输入下一条记录,如确定,继续输入,否则,退出输入功能。
(2)DisplayAllRecord(显示所有结点记录)
按顺序显示链表中所有记录,每屏显示10条记录。
每显示10条,按
(3)InsertaRecord(插入一条结点记录)
在以姓名为序排列的链表中插入一条记录,插入后,链表仍有序。
输出插入成功的信息。
(4)DeleteaRecord(按姓名查找,删除一条结点记录)
输入待删除记录的姓名,显示提示信息,让用户再次确定是否要删除。
确定后,将该姓名的记录删除。
(5)Query(查找并显示一个结点记录)
输入姓名,查找该记录,并显示该同学的成绩‘
(6)AddRecordsfromTextFile(从正文文件中添加数据到链表中)
用户可事前建立一个正文文件data.txt,存放多个待加入的记录。
提示输入正文文件的文件名,然后从该文件中一次性加入多条学生记录,文件data.txt格式如下:
2
WangXiao95
LiuLin87
(7)WritetoaTextFile
将链表中的全部记录写入文件records.txt,要求文件格式和文件data.txt相同。
(8)ReverseList
将链表中的所有结点逆序存放。
(9)DeletetheSameRecord
删除相同姓名的记录。
(0)Quit(退出学生成绩管理程序)
释放链表存储空间。
二、题目分析
(1)建立有序单向链表
参照课本中函数structnode*create_sort(),循环输入学生姓名成绩,反复调用插入结点函数Student*Insert(),将新建结点插入到链表中,使链表保持有序。
返回链表头指针
(2)显示所有结点记录
参照课本中函数voidprint(),依次访问链表的各个结点并输出。
题目要求每屏显示10条记录,则每循环输出十条记录使用一次system(“pause”)。
(3)插入一条结点记录
参照课本中函数structnode*insert(),要求插入一个新结点,链表的值仍然按名字保持升序。
在函数中输入要插入的结点信息,然后调用Student*Insert()函数插入结点。
返回链表头指针。
(4)按姓名查找,删除一条结点记录
在函数中输入要删除的结点信息,调用Student*Delete()函数删除该结点。
返回链表头指针。
(5)查找并显示一个结点记录
在函数中输入要查找的结点信息,调用Student*Query()函数查找并返回该结点指针,在函数中输出结点信息。
(6)从正文文件中添加数据到链表中
循环从正文文件中读取数据,再调用Student*Insert()函数将其有序插入到链表中,返回链表头指针。
(7)将链表中的全部记录写入文件records.txt
依次从链表中读取文件并写入文件record.txt.
(8)将链表中的所有结点逆序存放
依次摘取原链表的首结点,链入新链表的首部,知道原链表为空。
(9)删除相同姓名的记录
因为链表时有序存放的,故只需依次判断每相邻两个结点是否相同即可,调用Student*Delete()函数删除其中一条记录。
(0)推出学生成绩管理程序
释放链表存储空间,推出程序。
三、感想心得
课本的例题对于理解知识点很有帮助,C语言很繁,在处理问题时需要细心对待每一步,想要熟练的掌握各方面的知识就得不断的练习,很多问题的解决来源于不断的尝试。
同时还应多跟同学老师交流,在解决问题的同时共同进步。
四、源程序
#include
#include
#include
#include
#include
structstud
{
charname[20];/*姓名*/
floatscore;/*分数*/
structstud*next;/*指向下一结点的指针*/
};
typedefstructstudStudent;
intmenu_select()/*菜单函数*/
{
charc;
do{
system("cls");/*清屏*/
printf("1.CreatList\n");
printf("2.DisplayAllRecord\n");
printf("3.InsertaRecord\n");
printf("4.DeleteaRecord\n");
printf("5.Query\n");
printf("6.AddRecordsfromaTextFile\n");
printf("7.WritetoaTextFile\n");
printf("8.ReverseList\n");
printf("9.DeletetheSameRecord\n");
printf("0.Quit\n");
printf("Giveyourchoice(0-9):
");
c=getchar();/*输入序号*/
}while(c<'0'||c>'9');
return(c-'0');
}/*循环显示主菜单*/
Student*Insert(Student*head,Student*p)/*有序插入函数*/
{
Student*p1,*p2;
if(head==NULL)/*若插入前是空链表*/
{
head=p;p->next=NULL;
returnhead;/*返回头指针*/
}
p1=p2=head;
while(strcmp(p1->name,p->name)<0&&p1->next!
=NULL)
{
p2=p1;p1=p1->next;
}
if(strcmp(p1->name,p->name)>=0)
{
p->next=p1;
if(head==p1)head=p;/*插在首结点前*/
elsep2->next=p;/*插在链表中间*/
}
else
{
p1->next=p;/*插在尾结点之后*/
p->next=NULL;
}
returnhead;/*返回头指针*/
}
Student*Create()/*建立有序单向链表*/
{
intx;
Student*head=NULL,*p;
do
{
p=(Student*)malloc(sizeof(Student));/*循环申请地址空间*/
printf("Pleaseinputthenameandscore:
\n");
scanf("%s%f",p->name,&p->score);/*循环输入结点信息*/
head=Insert(head,p);/*反复调用Insert函数插入新结点*/
printf("Doyouwanttogoon:
(1/0)?
\n");/*判断是否继续输入*/
scanf("%d",&x);
}while(x);
returnhead;/*返回头指针*/
}
Student*Insert_a_record(Student*head)/*插入一个结点*/
{
Student*p;
p=(Student*)malloc(sizeof(Student));/*申请地址空间*/
printf("Pleaseinputthenameandscore:
\n");
scanf("%s%f",p->name,&p->score);/*输入要插入的结点信息*/
head=Insert(head,p);/*调用Insert函数插入结点*/
printf("Insertsuccessfully!
\n");
returnhead;/*返回头指针*/
}
voidDisplay(Student*head)/*显示所有结点记录*/
{
inti=0;
Student*p;
p=head;
while(p!
=NULL)
{
printf("%s\t%f\n",p->name,p->score);/*循环输出结点信息*/
p=p->next;
i++;
if(i%10==0&&i!
=0)
system("pause");/*每屏显示10条*/
}
}
Student*Delete(Student*head,chars[])/*删除结点*/
{
Student*p1,*p2;
if(head==NULL)/*如果链表为空*/
{
printf("Listisnull.\n");
returnNULL;
}
p1=head;
while(strcmp(p1->name,s)!
=0&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}/*查找要删除的结点*/
if(strcmp(p1->name,s)==0)
{
if(p1==head)/*要删除的是首结点时*/
head=p1->next;
elsep2->next=p1->next;/*要删除的时其他结点时*/
free(p1);/*释放地址空间*/
returnhead;/*返回头指针*/
}
printf("Student%sisnotfound.\n",s);/*没有找到要删除的结点*/
returnhead;/*返回头指针*/
}
Student*Delete_a_record(Student*head)/*删除一条记录*/
{
intx;
chars[20];
printf("Pleaseinputthename:
\n");
scanf("%s",s);/*输入要删除的学生名字*/
printf("Areyousuretodelete?
(1/0)\n",s);/*确认是否删除*/
scanf("%d",&x);
if(x)
head=Delete(head,s);/*调用删除结点函数*/
returnhead;/*返回头指针*/
}
Student*Query(Student*head,chars[])/*查找某条记录*/
{
Student*p;
p=head;
while(p!
=NULL)
{
if(strcmp(p->name,s)==0)
returnp;/*找到了则返回该结点地址*/
p=p->next;/*依次查找每条结点信息*/
}
returnNULL;/*没找到则返回空指针*/
}
voidQuery_a_record(Student*head)/*查找一条记录*/
{
intx=0;
chars[20];
Student*p;
printf("Pleaseinputthename:
\n");
scanf("%s",s);/*输入要查找的学生名字*/
p=Query(head,s);/*调用函数查找*/
if(p!
=NULL){printf("%s\t%f\n",p->name,p->score);x=1;}/*找到了则输出该结点信息*/
while(p!
=NULL)
{
p=Query(p->next,s);
printf(“%d\t%f\n”,p->name,p->score);x=1;}/*继续向后查找*/
if(x==0)printf("Student%sisnotfound!
\n",s);/*没找到的情况*/
}
Student*AddfromText(Student*head)/*从正文文件中添加数据到链表中*/
{
inty;
charfilename[20];
FILE*fp;
Student*s;
printf("Pleaseinputthenameoffile:
\n");
scanf("%s",filename);/*输入正文文件名*/
fp=fopen(filename,"r");/*以只读方式打开文件*/
if(fp==NULL)
{
printf("Can'topenthefile!
\n");
exit
(1);
}/*判断是否成功打开文件*/
fscanf(fp,"%d",&y);/*读取第一行*/
while(!
feof(fp))/*判断是否到文件结尾处*/
{
s=(Student*)malloc(sizeof(Student));/*循环申请地址空间*/
fscanf(fp,"%s%f",s->name,&s->score);/*依次读取文件到新结点中*/
s->next=NULL;
head=Insert(head,s);/*调用插入函数将新结点插入链表中*/
}
fclose(fp);/*关闭文件*/
returnhead;/*返回头指针*/
}
voidWritetoText(Student*head,charfilename[])/*将链表中的全部记录写入文件*/
{
FILE*fp;
if((fp=fopen(filename,"w"))==NULL)
/*判断文件打开是否成功*/
{
printf("Can'topenthefile!
\n");
exit
(1);
}
while(head!
=NULL)
{
fprintf(fp,"%s\t%f\n",head->name,head->score);
head=head->next;
}/*将结点信息依次写入文件中*/
fclose(fp);/*关闭文件*/
}
voidQuit(Student*head)/*推出学生成绩管理程序*/
{
Student*p;
while(head!
=NULL)
{
p=head;
head=head->next;
free(p);
}/*依次释放地址空间*/
}
Student*Reverse(Student*head)/*将链表中的所有结点逆序存放*/
{
Student*newhead=NULL,*p;
while(head!
=NULL)
{
p=head;head=head->next;
p->next=newhead;
newhead=p;
}/*依次摘取原链表的首结点,链入新结点的首部*/
returnnewhead;/*返回新链表的头指针*/
}
Student*DeleteSame(Student*head)/*删除相同姓名的记录*/
{
intx=0;
Student*p1,*p2;
p1=p2=head;
while(p1->next!
=NULL)
{
p1=p2->next;
if(strcmp(p1->name,p2->name)==0)/*两条记录同名时*/
{head=Delete(head,p1->name);x=1;}/*调用结点删除函数删除后一条记录*/
p2=p2->next;/*结点后移查找其他的同名记录*/
}
If(x==0)printf(“Nosame!
\n”);/*找不到同名记录时*/
returnhead;/*返回头指针*/
}
main()/*主函数*/
{
chars[20];
Student*head=NULL;/*定义头指针并使其指向空*/
for(;;)
{
switch(menu_select())/*调用菜单函数*/
{
case1:
head=Create();/*调用Create函数*/
system("pause");
break;
case2:
Display(head);/*调用Delete函数*/
system("pause");
break;
case3:
head=Insert_a_record(head);/*调用Insert_a_record函数*/
system("pause");
break;
case4:
head=Delete_a_record(head);/*调用Delete_a_record函数*/
system("pause");
break;
case5:
Query_a_record(head);/*调用Query函数*/
system("pause");
break;
case6:
head=AddfromText(head);/*调用AddfromText函数*/
system("pause");
break;
case7:
WritetoText(head,"records.txt");/*调用WritetoText函数*/
system("pause");
break;
case8:
head=Reverse(head);/*调用Reversehanshu*/
system("pause");
break;
case9:
head=DeleteSame(head);/*调用DeleteSame函数*/
system("pause");
break;
case0:
Quit(head);/*调用Query函数*/
printf("Goodbye!
\n");system("pause");
exit(0);
}
}
}
五、函数调用关系图
创建链表输入的数据
liutao
84
lingming
96
liufei
88
shenjun
80
songlin
78
lijun
72
longfei
84
luoli
79
yujie
78
liumei
81
wanglin
84
hanli
92
插入的数据:
huru89;liyu91
删除的数据:
songlin
查找的数据:
longfei
正文文件中的数据:
2
Wangxiao95
Liulin87
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计