超好的学生成绩管理系统实验报告顺序表链表
学生管理系统(链表版)

福建工程学院计算机与信息科学系实验报告代码:#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include<conio.h>#define Null 0struct student{int num;char name[20];float chinese,math,english,ave,sum;struct student *next;};void print (){printf(" |------------------------------------------------|\n");printf(" | 欢迎光临学生成绩管理系统|\n");printf(" |------------------------------------------------|\n");printf(" | 1 ==> 创建学生数据|\n");printf(" | 2 ==> 载入学生数据|\n");printf(" | 3 ==> 添加学生数据|\n");printf(" | 4 ==> 查询学生数据|\n");printf(" | 5 ==> 删除学生数据|\n");printf(" | 6 ==> 统计班级人数|\n");printf(" | 7 ==> 排序|\n");printf(" | 0 ==> 退出学生管理系统|\n");printf(" |------------------------------------------------|\n");}struct student *init (int n){int i;struct student *head,*p,*s;for (i=1;i<=n;i++){if (i==1){printf("请输入第%d个学生信息:\n",i);p=(struct student *)malloc (sizeof(struct student));printf("学号\n");scanf("%d",&p->num);printf("姓名\n");scanf("%s",&p->name);printf("语文\n");scanf("%f",&p->chinese);printf("数学\n");scanf("%f",&p->math);printf("英语\n");scanf("%f",&p->english);p->sum=p->chinese+p->math+p->english;p->ave=p->sum/3;head=p;if (n==1) p->next=Null;}else{printf("请输入第%d个学生信息:\n",i);s=(struct student *)malloc (sizeof(struct student));printf("学号\n");scanf("%d",&s->num);printf("姓名\n");scanf("%s",&s->name);printf("语文\n");scanf("%f",&s->chinese);printf("数学\n");scanf("%f",&s->math);printf("英语\n");scanf("%f",&s->english);s->sum=s->chinese+s->math+s->english;s->ave=s->sum/3;p->next=s;p=s;s->next=Null;}}return head;}void insert (struct student *head){struct student *p,*pi;int xuehao;printf ("请问要在哪个学生后面插入数据(输入学号):");scanf("%d",&xuehao);pi=(struct student *)malloc (sizeof(struct student));p=head;printf("学号\n");scanf("%d",&pi->num);printf("姓名\n");scanf("%s",&pi->name);printf("语文\n");scanf("%f",&pi->chinese);printf("数学\n");scanf("%f",&pi->math);printf("英语\n");scanf("%f",&pi->english);pi->sum=pi->chinese+pi->math+pi->english;pi->ave=pi->sum/3;if (head==Null){head=pi;pi->next=Null;}else{while ((p->num!=xuehao)&&(p->next!=Null)){p=p->next;}if (p->next!=Null){pi->next=p->next;p->next=pi;}else{p->next=pi;pi->next=Null;}}}void search (struct student *head){int no;struct student *p;p=head;int n=0;printf("1 按学号查找\n");printf("2 按分数段查找\n");scanf("%d",&n);switch(n){case 1:printf("请输入要查找同学的学号:");scanf("%d",&no);while(p!=Null){if(p->num==no){printf("------------------学生成绩表-----------------------\n");printf("===================================================\n");printf("%-5s%-8s%-8s%-8s%-8s%-8s%-8s\n","学号","姓名","语文","数学","英语","总分","平均分");printf("===================================================\n"); printf("%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->chinese,p->ma th,p->english,p->sum,p->ave);printf("===================================================\n");break;}p=p->next;}break;case 2:{float a,b;int choose;char c;for(;;){printf("\t|---------------------------------------|\n");printf("\t| 分数段查询|\n");printf("\t|---------------------------------------|\n");printf("\t| 1 ==> 按总分成绩查询|\n");printf("\t| 2 ==> 按语文成绩查询|\n");printf("\t| 3 ==> 按数学成绩查询|\n");printf("\t| 4 ==> 按英语成绩查询|\n");printf("\t| 0 ==> 返回上一级菜单|\n");printf("\t|---------------------------------------|\n");printf("请输入你要执行的操作:");scanf("%d",&choose);while(getchar()!='\n');switch(choose){case 1:{p=head;printf("请输入所要查找的分数段:\n");printf("请输入第一个分数:\n");scanf("%f",&a);printf("请输入第二个分数:\n");scanf("%f",&b);printf("%-5s%-8s%-8s%-8s%-8s%-8s%-8s\n","学号","姓名","语文","数学","英语","总分","平均分");while(p!=Null){if (p->sum>=a&&p->sum<=b){printf("%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->chinese,p->ma th,p->english,p->sum,p->ave);}p=p->next;}}break;case 2:{p=head;printf("请输入所要查找的分数段:\n");printf("请输入第一个分数:\n");scanf("%f",&a);printf("请输入第二个分数:\n");scanf("%f",&b);printf("%-5s%-8s%-8s%-8s%-8s%-8s%-8s\n","学号","姓名","语文","数学","英语","总分","平均分");while(p!=Null){if (p->chinese>=a&&p->chinese<=b){printf("%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->chinese,p->ma th,p->english,p->sum,p->ave);}p=p->next;}}break;case 3:{p=head;printf("请输入所要查找的分数段:\n");printf("请输入第一个分数:\n");scanf("%f",&a);printf("请输入第二个分数:\n");scanf("%f",&b);printf("%-5s%-8s%-8s%-8s%-8s%-8s%-8s\n","学号","姓名","语文","数学","英语","总分","平均分");while(p!=Null){if (p->math>=a&&p->math<=b){printf("%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->chinese,p->ma th,p->english,p->sum,p->ave);}p=p->next;}}break;case 4:{p=head;printf("请输入所要查找的分数段:\n");printf("请输入第一个分数:\n");scanf("%f",&a);printf("请输入第二个分数:\n");scanf("%f",&b);printf("%-5s%-8s%-8s%-8s%-8s%-8s%-8s\n","学号","姓名","语文","数学","英语","总分","平均分");while(p!=Null){if (p->english>=a&&p->english<=b){printf("%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->chinese,p->ma th,p->english,p->sum,p->ave);}p=p->next;}}break;case 0: return ;default: printf("\n\n您的输入有误!请重新输入:\n\n");break;}}}}}struct student *del (struct student *head,int n){struct student *p,*q;p=head;if (head==Null){printf("没有学生的资料要删除!\n");return head;}while (p->num!=n&&p->next!=Null){q=p;p=p->next;}if (p->num==n){if (p==head)head=p->next;elseq->next=p->next;free (p);}elseprintf("找不到相应的学生资料!\n");return head;}void list(struct student *head){int i=0;struct student *p;p=head;printf("------------------学生成绩表-----------------------\n");printf("===================================================\n");printf("%-5s%-8s%-8s%-8s%-8s%-8s%-8s\n","学号","姓名","语文","数学","英语","总分","平均分");printf("===================================================\n");while (p!=Null){printf("%-5d%-8s%-8.1f%-8.1f%-8.1f%-8.1f%-8.1f\n",p->num,p->name,p->chinese,p->ma th,p->english,p->sum,p->ave);p=p->next;}printf("===================================================\n");printf("\n\n");}void tongji (struct student *head){int i=0;struct student *p;float chinese1=0,math1=0,english1=0;p=head;while(p!=Null){i=i+1;chinese1=chinese1+p->chinese;math1=math1+p->math;english1=english1+p->english;p=p->next;}printf("班级总人数为:%d\n",i);printf("班级语文平均分为:%4.1f\n",chinese1/i);printf("班级数学平均分为:%4.1f\n",math1/i);printf("班级英语平均分为:%4.1f\n",english1/i);printf("\n");}student *sort(student *head,int choose){student *p1,*p2=head,*pm,*px;student mid;if (!p2) return head;for(p1=p2;p1->next!=NULL;p1=p1->next){pm=p1;for(p2=p1->next;p2!=NULL;p2=p2->next)switch(choose){case 1:if (pm->num>p2->num) pm=p2;break;case 2:if (pm->sum<p2->sum) pm=p2;break;case 3:if (pm->chinese<p2->chinese) pm=p2;break;case 4:if (pm->math<p2->math) pm=p2;break;case 5:if (pm->english<p2->english) pm=p2;break;}if (pm!=p1){mid=*pm;*pm=*p1;*p1=mid;px=pm->next;pm->next=p1->next;p1->next=px;}}printf("\n排序后的成绩表为:\n");list(head);return head;}student *sort_all(student *head){int choose;for(;;){printf("\t|---------------------------------------|\n");printf("\t| 学生成绩统计排序|\n");printf("\t|---------------------------------------|\n");printf("\t| 1 ==> 按学生学号排序|\n");printf("\t| 2 ==> 按学生总分排序|\n");printf("\t| 3 ==> 按学生语文成绩排序|\n");printf("\t| 4 ==> 按学生数学成绩排序|\n");printf("\t| 5 ==> 按学生英语成绩排序|\n");printf("\t| 0 ==> 返回上一级菜单|\n");printf("\t|---------------------------------------|\n");printf("请输入你要执行的操作:");scanf("%d",&choose);while(getchar()!='\n');switch(choose){case 1:head=sort(head,choose);break;case 2:head=sort(head,choose);break;case 3:head=sort(head,choose);break;case 4:head=sort(head,choose);break;case 5:head=sort(head,choose);break;case 0:return head;default: printf("\n\n您的输入有误!请重新输入:\n\n");break;}}}void save(struct student *head){int i,j;FILE *fp;student *p;p=head;char c; //head 头指针if((fp=fopen("c:\\stu_list","wb"))==NULL){printf("Cannot open file strike any key exit!");getch();exit(0);}while(p){fwrite(p,sizeof(student),1,fp);p=p->next;}fclose(fp);}struct student* read(){int i=0,j;FILE *fp;struct student *p; //工作指针student *last,*head; //最后一项的指针head=(student*)malloc(sizeof(student));last=head;if((fp=fopen("c:\\stu_list","rb"))==NULL){printf("Cannot open file strike any key exit!");getch();exit(0);}while(!feof(fp)){p=(student*)malloc(sizeof(student));if(fread(p,sizeof(student),1,fp)==1){last->next=p;last=last->next;}}fclose(fp);return head=head->next;}int main(){FILE *fp;char ch,c;int n=0;struct student *head,*r;print();while((ch=tolower(getchar()))!='0'){switch(ch){case '1':{printf("请问有多少个学生的资料要输入?\n");scanf("%d",&n);head=init(n);list(head);save(head);break;}case '2':{head=read();list(head);break;}case '3':{insert(head);list (head);save(head);break;}case '4':{search(head);break;}case '5':{int num;printf("请输入要删除学生的学号:\n");scanf("%d",&num);head=del(head,num);list (head);save(head);break;}case '6':{tongji(head);break;}case '7':{head=read();sort_all(head);break;}default:break;}printf("\n\n\t======>按Enter键返回主菜单\n");fflush(stdin);c=getchar();system("cls");print();}}。
基于链表的学生信息管理系统实验报告

《C语言程序设计实训2》报告设计题目:基于链表的学生信息管理系统学院名称:信息科学技术学院专业:软件工程班级:x班姓名:xxx 学号xxx提交日期:2014年6月一、实验内容编写并调试程序,实现学校各专业班级学生信息的管理。
定义学生信息的链表结点类型,包括:学号、姓名、班级、专业、3门成绩。
二、实验要求(1)main函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。
(2)定义函数CreateList:按学号由小到大,建立有序的链表。
逆序输入n 个学生信息(调用n次input),学号大的先输入,建立带头结点的单链表。
(3)定义函数Output:以指向某个学生结点的指针为参数,将学生信息表格化输出。
(4)定义函数Save:将某个学生信息存入文件。
(5)定义函数Fetch:从文件中随机读取某个学生的信息。
(6)定义函数Search_num:查找指定学号的学生,返回指向该学生结点的指针。
(7)定义函数InsertList:在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。
(8)定义函数Delete_num:从链表中删除指定学号的学生。
(9)定义函数Search_major _subject_score:查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
(10)定义函数Delete_ major _subject:从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
三、算法流程图四、程序清单(关键语句和变量加注释)#include<>// 预编译命令#include<>#include<>struct student{int num;//学号char name[15];//姓名char major[10];//专业(computer,software,network)int classNo;//班级(1-2)int score[3];//3门课的成绩(0-2)struct student *next;};typedef struct student STU;//--------------------------------输入-------------------------------- STU *Input(){STU *p;if( (p=(STU*)malloc(sizeof(STU)))==NULL){ printf("头结点建立错误!\n");return p;}printf("请输入学生的学号:");scanf("%d",&p->num);printf("请输入学生的姓名:");scanf("%s",p->name);printf("请输入学生的专业:");scanf("%s",p->major);printf("请输入学生的班级:");scanf("%d",&p->classNo);printf("请输入学生的成绩0:");scanf("%d",&p->score[0]);printf("请输入学生的成绩1:");scanf("%d",&p->score[1]);printf("请输入学生的成绩2:");scanf("%d",&p->score[2]);return p;}//--------------------------------建立链表------------------------------ STU*CreateList(int n){struct student*head,*p,*w;int i=0;printf("\n请输入第%d个学生信息\n",n);p=Input();while(i<n){i++;if(i==1){head=p;//头结点有值p->next=NULL;}else{printf("\n请输入第%d个学生信息\n",n-i+1);w=Input();head=w;w->next=p;p=w;}}return head;}//-------------------------------输出------------------------------void Output(STU *p){printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\n",p->num,p->name,p->major,p->classNo,p->score[0],p->score[1],p->score[2]);}//-------------------------------输出所有---------------------------void print(STU *head){STU *p;p=head;if(head!=NULL)printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n");while(p!=NULL){Output(p);p=p->next;}}//--------------------------------储存--------------------------------void Save(STU*p){FILE*fp;char filename[20];printf("\n请输入保存文件名:\n");gets(filename);if((fp=fopen(filename,"wb"))==NULL){printf("cannot open file\n");return;}if(p==NULL)printf("链表为空");while(p!=NULL){if((fwrite(p,sizeof(STU),1,fp))!=1)printf("\nwrite file error\n");p=p->next;}fclose(fp);}//----------------------------------文件查找--------------------------------- STU Fetch(int n){FILE*fp;struct student tem;char filename[20];printf("\n请输入打开文件名:\n");gets(filename);fp=fopen(filename,"rb");fseek(fp,(long)(n*sizeof(STU)),0);fread(&tem,sizeof(STU),1,fp);//读取fclose(fp);return tem;}//-----------------------------------查找学号------------------------------- STU *Search_num(STU *head,int number){if (head==NULL)return NULL;while(head->num!=number)//跳过不符合条件的学号{if (head->next==NULL)return NULL;head=head->next;}return head;//返回的指针名为head}//---------------------------------插入链表---------------------------------------STU*InsertList(STU*head){STU*p1,*p2,*stu;p1=p2=head;stu=(STU*)malloc(sizeof(STU));//待插入的结点printf("\n请输入要插入的学生信息\n");stu=Input();if(head==NULL)//头结点为空{head=stu;stu->next=NULL;}else{while(p1->num<stu->num&&p1->next!=NULL)//跳过不符合的结点{p2=p1;p1=p2->next;}if(p1->num>stu->num)if(p1==head)//插最前面{stu->next=head;head=stu;}else{stu->next=p1;p2->next=stu;}else{p1->next=stu;//插最后面stu->next=NULL;}}return head;}//---------------------------------------学号删除-----------------------------STU *Delete_num (STU *head,int number){STU *p1,*p2;if ( head==NULL) //头结点为空return NULL;p1=head;while(p1->num!=number)//跳过不符合的点{if (p1->next==NULL)return NULL;p2=p1;p1=p1->next;}if (p1==head) //删除学号是第一个的情况head=p1->next;elsep2->next=p1->next;free(p1);return head;}//-------------------------------------查找专业课程成绩------------------------------------ STU *Search_major_subject_score(STU *head,char *major,int number,int score) {if (head==NULL)return NULL;while(head!=NULL)if ((strcmp(major,head->major)==0) && head->score[number]<score)break;elsehead=head->next;return head;}//--------------------------------------删除专业课程成绩--------------------------------------STU *Delete_major_subject(STU *head,char *major,int number,int score){STU *p=NULL;p=Search_major_subject_score(head,major,number,score);//先查找if (p==NULL)return p;elsep=Delete_num(head,p->num);//再删除return p;}//---------------------------------------------主函数------------------------------------------void main (){STU *Head = NULL;int id,num,sco;char filename[10];STU *p = NULL;STU stu;while(1){printf("***********************************************************************\n");printf("* 欢迎使用学生成绩管理系统*\n");printf("***********************************************************************\n");printf("1-建立有序的链表2-信息存盘\n");printf("3-从文件中随机读取某个学生的信息4-查找学号学生,返回该学生结点指针\n");printf("5-输入一个学生信息插入相应位置6-从链表中删除指定学号的学生\n");printf("7-查找某专业某课程成绩小于某分数的学生,返回指向该学生结点的指针\n");printf("8-删除某个专业的、某门课程的成绩小于某个分数的学生\n");printf("9-将学生信息表格化输出\n\n");printf("**********************输入相应编号运行系统*****************************\n");scanf(" %d",&id);if((id<1)||(id>9))break;switch (id){case 1:{printf("请输入学生数:");scanf(" %d",&num);Head = CreateList(num);break;}case 2:{if (Head==NULL){printf("链表未建立!\n");break;}getchar();Save(Head);break;}case 3:{printf("\n请问要读取第几位学生信息\n");scanf("%d",&id);getchar();stu=Fetch(id);printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n");Output(&stu);break;}case 4:{if (Head==NULL){printf("链表未建立!\n");break;}printf("请输入要查找的学生的学号:");scanf(" %d",&num);p = Search_num(Head,num);if (p==NULL)printf("查找失败!\n");else{printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n");Output(p);}break;}case 5:{Head=InsertList(Head);break;}case 6:{if ( Head == NULL){printf("链表未建立!\n");break;}printf("请输入要删除的学生的学号:");scanf(" %d",&num);p = Delete_num(Head,num);if ( p==NULL)printf("删除成员失败!\n");else Head = p;break;}case 7:{if (Head==NULL){printf("链表未建立!\n");break;}printf("请输入学生的专业:");scanf("%s",filename);printf("请输入成绩序号(0 <= n <=2):");scanf(" %d",&num);if (num<0||num>2){printf("成绩序号输入错误");break;}printf("请输入分数:");scanf(" %d",&sco);p=Search_major_subject_score(Head,filename,num,sco);if ( p == NULL)printf("查找失败\n");else{ printf("学号\t姓名\t专业\t班级\t成绩0\t成绩1\t成绩2\t\n");Output(p);}break;}case 8:{if (Head==NULL){printf("链表未建立!\n");break;}printf("请输入学生的专业:");scanf("%s",filename);printf("请输入成绩序号(0 <= n <=2):");scanf(" %d",&num);if (num <0 || num > 2){printf("成绩序号输入错误");break;}printf("请输入分数:");scanf(" %d",&sco);p=Delete_major_subject(Head,filename,num,sco);if (p==NULL)printf("删除失败\n");elseHead = p;break;}case 9:{if (Head==NULL){printf("链表未建立!\n");break;}print(Head);break;}default:{break;}}}}五、程序测试(输入、输出的截图及文件的内容)六、实验总结(实验过程中遇到的具体问题,如何解决,不要说空话、套话,雷同扣分)。
基于链表的学生信息管理系统实验报告

scanf("%d",&id);
if((id<1)||(id>9))
break;
break;
else
head=head->next;
returnhead;
}
//--------------------------------------删除专业课程成绩--------------------------------------
STU*Delete_major_subject(STU*head,char*major,intnumber,intscore)
printf("请输入学生的专业:");
scanf("%s",p->major);
printf("请输入学生的班级:");
scanf("%d",&p->classNo);
printf("请输入学生的成绩0:");
scanf("%d",&p->score[0]);
printf("请输入学生的成绩1:");
{
structstudent*head,*p,*w;
inti=0;
printf("\n请输入第%d个学生信息\n",n);
p=Input();
while(i<n)
{
i++;
if(i==1)
{
head=p;//头结点有值
顺序表的操作实验报告

顺序表的操作实验报告顺序表的操作实验报告一、引言顺序表是一种常见的数据结构,它在计算机科学中被广泛应用。
本实验旨在通过实际操作顺序表,探索其基本操作和性能。
二、实验目的1. 理解顺序表的基本原理和数据结构;2. 掌握顺序表的插入、删除、查找等操作;3. 分析顺序表操作的时间复杂度。
三、实验过程1. 初始化顺序表:首先,我们创建一个空的顺序表,并设定其初始长度为10。
2. 插入元素:在顺序表中插入若干个元素,观察插入操作的效果。
我们可以通过在表尾插入元素,或者在表中间插入元素来测试插入操作的性能。
3. 删除元素:从顺序表中删除指定位置的元素,并观察删除操作的效果。
我们可以选择删除表尾元素或者表中间元素来测试删除操作的性能。
4. 查找元素:在顺序表中查找指定元素,并返回其位置。
我们可以选择查找表头元素、表尾元素或者表中间元素来测试查找操作的性能。
5. 扩容操作:当顺序表的长度不足以容纳更多元素时,我们需要进行扩容操作。
在实验中,我们可以在插入元素时观察到扩容操作的效果。
四、实验结果与分析1. 初始化顺序表:成功创建了一个长度为10的空顺序表。
2. 插入元素:通过在表尾插入10个元素,我们观察到插入操作的时间复杂度为O(1)。
然而,当我们在表中间插入元素时,需要将插入位置之后的所有元素后移,时间复杂度为O(n)。
3. 删除元素:从表尾删除元素的时间复杂度为O(1),而从表中间删除元素需要将删除位置之后的所有元素前移,时间复杂度为O(n)。
4. 查找元素:在顺序表中查找元素的时间复杂度为O(n),因为需要逐个比较每个元素。
5. 扩容操作:当顺序表的长度不足以容纳更多元素时,我们需要进行扩容操作。
在实验中,我们观察到扩容操作的时间复杂度为O(n),因为需要将原有元素复制到新的更大的空间中。
五、实验总结通过本次实验,我们深入了解了顺序表的基本操作和性能。
顺序表的插入、删除和查找操作的时间复杂度与操作位置有关,需要注意选择合适的操作位置以提高效率。
学生成绩管理系统(链表版)

《C语言应用》实验报告题目学生成绩管理系统(链表版)(1)能完成学生成绩的插入、查询、修改、删除、输出等功能;(2)采用单链表存储结构实现;(3)所有数据以外部文件方式保存第2章第2章总体设计2。
1 系统的程序流程图绘制一个系统的总体程序流程图,主要展示系统从开始以后,可以经过哪些流程,最后结束。
按姓名修改某位同学的成绩按姓名修改某位同学的成绩输出链表内容输出链表内容2。
2系统的全局变量和常量系统全局变量int n;char a;头文件:#include "stdio.h"#include ”time。
h"#include "string。
h”#include ”stdlib.h"#include ”conio。
h"2。
3系统的函数介绍把系统中的每个函数的原型列出来,解释一下函数的返回值及形式参数的含义;最后,再介绍一下每个函数的功能。
void Create(int n)//创建链表void List()//输出链表内容void list()//输出链表所有内容void save()//文件保存void save1() //文件保存void read()//文件读取void read1()//文件读取void SA VE(){ //保存到可浏览文件void SA VE1() //保存到可浏览文件void sort_data_copy(Lstu *p,Lstu *s)//交换排序时的值void sort()//对初始成绩进行排序void sort1()//对所有数据进行排序void search_print(Lstu *p)//输出查找信息void search_choose()//选择按分数段查找方式void search()//查找void modify_choose(Lstu *p,int n)//选择修改方式void modify()//按姓名修改void Insert()//按序号插入void del() //按姓名删除void statistics()//成绩统计int menu() //菜单(主界面)第3章第3章详细设计按函数,写出函数的原型声明,并画出每个函数的程序流程图。
(顺序表)学生成绩管理系统

图2-0
(9)SaveFile()保存函数,对所有操作产生的变化进行文件保存
图2-1
六、调试与测试
(1)在主函数调用各个功能模块函数,对各个函数进行测试。
(2)OpenList()
在主函数中对线性表初始化并用malloc函数分配空间,随后调用文件读取函数,进行读取,若有错误操作则会显示退出程序。在此系统操作中于我而言的难点首先是如果给线性表分配空间的问题,在起初未分配完空间,连读取文本文件都是十分困难,更何谈后面的步骤,但是经过我多方面专研,并不断尝试使用malloc函数,最终完善此功能并予以实现
④删除操作:在此操作中,首先输入需要删除的学生数据,然后进行位置i的定位,选择删除,然后选择是否继续操作,并显示所有信息。
⑤更新操作:根据第二步的查找操作选择,共有5种查找方式,随后找到该条学生记录,随后任选所要更改的学生9类数据中的数据,并选择是否继续或退出程序
⑥排序操作:根据总分采用直接插入排序、选择排序、冒泡排序和编号顺序排序等排序算法对学生进行排序。
《算法与数据结构课程设计》报告
课 设题 目
学生成绩管理系统
学院
班 级
学 生 姓 名
学 号
序 号
指 导 教 师
时 间
2019.1.12
一、课程设计的目的
(1)进一步熟悉VC++或其他开发环境,熟悉用C或其他语言完成一个应用程序的设计过程,掌握有关编辑、调试和整合程序的方法和技巧。
(2)通过此设计,了解《算法与数据结构》课程中线性表、图的逻辑结构和物理结构,各种排序算法的过程和算法的实现;掌握有关线性表、图在不同存储形式下各种操作的实现,以及各种排序算法的实现;体会数据结构在解决现实问题中的作用和重要性。
数据结构顺序表链表试验报告
数据结构顺序表链表试验报告数据结构试验报告一、引言数据结构是计算机科学中非常重要的一个概念,它用于组织和存储数据,以便能够高效地进行检索和操作。
顺序表和链表是两种常见的数据结构,它们在实际应用中都有各自的优势和局限性。
本报告将对顺序表和链表进行试验比较,以评估它们在不同场景下的性能和适合性。
二、实验目的本次试验的目的是比较顺序表和链表在插入、删除和查找操作上的性能差异,并分析其时间复杂度和空间复杂度。
通过实验结果,可以对不同场景下选择合适的数据结构提供参考。
三、实验内容1. 顺序表实验a. 创建一个包含100个元素的顺序表;b. 在表尾插入一个元素;c. 在表头插入一个元素;d. 在表的中间位置插入一个元素;e. 删除表尾的一个元素;f. 删除表头的一个元素;g. 删除表的中间位置的一个元素;h. 查找一个元素;i. 遍历整个顺序表。
2. 链表实验a. 创建一个包含100个节点的链表;b. 在链表尾部插入一个节点;c. 在链表头部插入一个节点;d. 在链表的中间位置插入一个节点;e. 删除链表尾部的一个节点;f. 删除链表头部的一个节点;g. 删除链表的中间位置的一个节点;h. 查找一个节点;i. 遍历整个链表。
四、实验结果与分析1. 顺序表实验结果a. 在表尾插入一个元素的平均时间为0.1ms;b. 在表头插入一个元素的平均时间为0.2ms;c. 在表的中间位置插入一个元素的平均时间为0.5ms;d. 删除表尾的一个元素的平均时间为0.1ms;e. 删除表头的一个元素的平均时间为0.2ms;f. 删除表的中间位置的一个元素的平均时间为0.5ms;g. 查找一个元素的平均时间为1ms;h. 遍历整个顺序表的平均时间为10ms。
2. 链表实验结果a. 在链表尾部插入一个节点的平均时间为0.2ms;b. 在链表头部插入一个节点的平均时间为0.1ms;c. 在链表的中间位置插入一个节点的平均时间为0.5ms;d. 删除链表尾部的一个节点的平均时间为0.2ms;e. 删除链表头部的一个节点的平均时间为0.1ms;f. 删除链表的中间位置的一个节点的平均时间为0.5ms;g. 查找一个节点的平均时间为2ms;h. 遍历整个链表的平均时间为5ms。
顺序表,链表实验报告.总结
顺序表,链表实验报告.总结实验报告实验目的:学生管理系统(顺序表)实验要求:1.建表2.求表长3.插入4.查找5.删除6.列表7.退出源程序:#include#include#include#define MaxSize 1000typedef struct{char xh[40];char xm[40];int cj;}DataType; //学生的结构typedef struct {DataType data[MaxSize]; //定义表的数据类型int length; //数据元素分别放置在data[0]到data[length-1]当中} SqList; //表的结构void liebiao(SqList *L) //建立表格{int k,n;char q;printf("请输入,输入学生的个数:\n");fflush(stdin);scanf("%d",&n);for(k=0;k<=n-1;k++){printf("请输入学生学号\n");scanf("%s",L->data[k].xh);printf("请输入学生名字\n");scanf("%s",L->data[k].xm);printf("请输入学生成绩\n");scanf("%d",&L->data[k].cj);}L->length=n;}void qb(SqList *L) //全部输出{int k,w;for(k=0;klength;k++){w=k+1;printf("第%d位学生:",w);printf("%s %s %d\n",L->data[k].xh,L->data[k].xm,L->da ta[k].cj);}}int cr(SqList *L,DataType *xs,int i) //插入信息{int j;if(L->length==MaxSize){printf("没有!");return 0;}else if((i<0)||(i>L->length)){printf("程序溢出,不符合");return 0;}else{for(j=L->length-1;j>=i;j--){strcpy(L->data[j+1].xh,L->data[j].xh); strcpy(L->data[j+1].xm,L->data[j].xm); L->data[j+1].cj=L->data[j].cj;}strcpy(L->data[i].xh,xs->xh);strcpy(L->data[i].xm,xs->xm);L->data[i].cj=xs->cj;L->length=L->length+1;}return 0;}int cz(SqList *L) //查找信息{char xh[40];char xm[40];int cj;int i=0,u;printf(" 1、按学号查询 \n");printf(" 1、按姓名查询 \n");printf(" 1、按成绩查询 \n");printf("请选择:");fflush(stdin);scanf("%d",&u);if (u==1){printf("请输入要查找学生的学号:"); scanf("%s",xh);for(i=0;ilength;i++){if(strcmp(L->data[i].xh,xh)==0) return i;}}if (u==2){printf("请输入要查找学生的姓名:"); scanf("%s",xm);for(i=0;ilength;i++){if(strcmp(L->data[i].xm,xm)==0) return i;}}if (u==3){printf("请输入要查找学生的成绩:"); scanf("%s",cj);for(i=0;ilength;i++){if(L->data[i].cj,&cj)return i;}}return -1;//*如果没找到,返回-1}int cz2(SqList *L) //删除查找的函数{char xh[40];char xm[40];int i=0,h;printf(" 1、按学号删除 \n");printf(" 2、按姓名删除 \n");printf("请选择:");fflush(stdin);scanf("%d",&h);if (h==1){printf("请输入要删除学生的学号:");scanf("%s",xh);for(i=0;ilength;i++){if(strcmp(L->data[i].xh,xh)==0) //判断输入和已知学号一样不return i;}}else if (h==2){printf("请输入要删除学生的姓名:");scanf("%s",xm);for(i=0;ilength;i++){if(strcmp(L->data[i].xm,xm)==0) //判断输入姓名和已知姓名一样不return i;}}return -1;}void sc(SqList *L) //删除函数{int i,j;printf("请先选择您要删除的学生信息的方式:\n");scanf("%d",&j);i=cz2(L);if(i==-1){printf("没有查到要删除的学生信息");return;}for(j=i;jlength;j++) // 要删除学生以后的学生整体上调一位{L->data[j].cj=L->data[j+1].cj; //就是后一个覆盖了前一个strcpy(L->data[j].xh,L->data[j+1].xh);strcpy(L->data[j].xm,L->data[j+1].xm);}L->length--;printf("该学生信息已被删除!\n");}int bc(SqList *L){return (L->length);}int main() //主体大函数{int i,k;SqList *L; //定义顺序表的指针DataType *xs;L=(SqList *)malloc(sizeof(SqList)*MaxSize); char q;ee:rewind(stdin);{printf(" 学生管理系统 \n"); //函数的各个结构printf(" \n");printf(" \n");printf(" \n");printf(" 建立表格请输入1 \n");printf(" 求表长请输入2 \n");printf(" 插入请输入3 \n");printf(" 查找请输入4 \n");printf(" 删除请输入5 \n");printf(" 列表请输入6 \n");printf(" 退出请按0 \n");printf(" 请输入");scanf("%c",&q);}if(q=='1'){rewind(stdin);liebiao(L);goto ee;}if(q=='2'){rewind(stdin);bc(L);printf("共%d个学生\n",L->length);goto ee;}if(q=='3'){rewind(stdin);printf(" 插入 \n");printf("\t\t 请输入要添加的学生信息: \n"); xs=(DataType *)malloc(sizeof(DataType)); printf("请输入学生学号\n");scanf("%s",xs->xh);printf("请输入学生名字\n");scanf("%s",xs->xm);printf("请输入学生成绩\n");scanf("%d",&xs->cj);printf("请输入要插入的位置:\n"); rewind(stdin);scanf("%d",&i);cr(L,xs,i);goto ee;}if(q=='4'){rewind(stdin);printf(" 查找 \n");printf(" 查询学生信息 \n");i=cz(L);if(i!=-1){printf("%s %s %d\n",L->data[i].xh,L->data[i].x m,L->data[i].cj);}else{printf("信息不存");}goto ee;}if(q=='5'){rewind(stdin);printf(" 删除 \n"); printf(" 删除学生信息 \n");sc(L);goto ee;}if(q=='6'){rewind(stdin);printf(" 列表 \n");qb(L);goto ee;}if(q=='0') {printf("谢谢使用\n");}if(!(q=='1'||q=='2'||q=='3'||q=='4'||q=='5'||q=='5'||q=='0 ')) {goto ee;}system ("pause"); return 0;}主程序:输入1--6n=1 n=2n=3n=4n=5n=6退出建表求表长插入查找删除列表建表:是否输入学生个数n ,变量k k=0; k<=n-1;输入学号,姓名,成绩k=k+1 结束输入查找学号n,变量k k=0n=k是否k=k+1输出是否是否输入插入位置n 表长L 变量kn<=Lk=0n=kk=k+1strcpy(L->data[j+1].xh,L->data[j].xh);strcpy(L->data[j+1].xm,L->data[j].xm);L->data[j+1].cj=L->data[j].cj输入错误结束是否否是输入删除的位置n 变量k 表长Ln<=Lk=0n=k k=k+1strcpy(L->data[j].xh,L->data[j-1].xh);strcpy(L->data[j].xm,L->data[j-1].xm); L->data[j].cj=L->data[j-1].cj输入错误结束。
学生信息管理系统-顺序表链表(数据结构第一次作业)
学⽣信息管理系统-顺序表链表(数据结构第⼀次作业)实验⽬的:1 、掌握线性表的定义;2 、掌握线性表的基本操作,如建⽴、查找、插⼊和删除等。
实验内容:定义⼀个包含学⽣信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:(1) 根据指定学⽣个数,逐个输⼊学⽣信息;(2) 逐个显⽰学⽣表中所有学⽣的相关信息;(3) 根据姓名进⾏查找,返回此学⽣的学号和成绩;(4) 根据指定的位置可返回相应的学⽣信息(学号,姓名,成绩);(5) 给定⼀个学⽣信息,插⼊到表中指定的位置;(6) 删除指定位置的学⽣记录;(7) 统计表中学⽣个数。
参考信息:Definition of structure student :typedef struct {char no[8]; //8 位学号char name[20]; // 姓名int price; // 成绩}Student;Definition of sequential list:typedef struct {Student *elem; // 指向数据元素的基地址int length; // 线性表的当前长度}SqList ;Definition of linked list :typedef struct LNode{Student data; // 数据域struct LNode *next; // 指针域}LNode,*LinkList;实验要求:(1) 程序要添加适当的注释,程序的书写要采⽤缩进格式。
(2) 程序要具在⼀定的健壮性,即当输⼊数据⾮法时,程序也能适当地做出反应,如插⼊删除时指定的位置不对等等。
(3) 程序要做到界⾯友好,在程序运⾏时⽤户可以根据相应的提⽰信息进⾏操作。
(4) 上传源程序到课堂派。
顺序表的源程序保存为SqList.cpp,链表的源程序保存为LinkList.cpp。
顺序表的源程序:#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define OVERFLOW -2#define MAXSIZE 100typedef int Status; // 定义函数返回值类型typedef struct{char no[10]; // 学号char name[20]; // 姓名int score; // 成绩}student;typedef student ElemType;typedef struct{ElemType *elem; // 存储空间的基地址int length; // 当前长度}SqList;Status InitList(SqList *L) // 构造空的顺序表 Lif(!L->elem) exit(OVERFLOW);L->length=0;return OK;}ElemType GetElem(SqList &L,int i) // 访问顺序表,找到 i位置,返回给 e{return L.elem[i];}int Search(SqList &L,char str[]) // 根据名字查找,返回该同学在顺序表中的编号{for(int i=1;i<=L.length;i++){if(strcmp(L.elem[i].name,str)==0)return i;}return0;}Status ListInsert(SqList &L,int i,ElemType e) // 在 i位置插⼊某个学⽣的信息{if((i<1)||(i>L.length+1)) return ERROR;if(L.length==MAXSIZE) return ERROR;for(int j=L.length;j>=i;j--){L.elem[j+1]=L.elem[j];}L.elem[i]=e;++L.length;return OK;}Status ListDelete(SqList &L,int i) // 在顺序表中删除 i位置的学⽣信息{if((i<1)||(i>L.length)) return ERROR;for(int j=i;j<=L.length;j++){L.elem[j]=L.elem[j+1];}--L.length;return OK;}void Input(ElemType *e){printf("姓名:"); scanf("%s",e->name);printf("学号:"); scanf("%s",e->no);printf("成绩:"); scanf("%d",&e->score);printf("输⼊完成\n\n");}void Output(ElemType *e){printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2d\n\n",e->name,e->no,e->score); }int main(){SqList L;ElemType a,b,c,d;printf("------------10.2.34版-----------\n");puts("1. 构造顺序表");puts("2. 录⼊指定⼈数的学⽣信息");puts("3. 显⽰学⽣表中的所有信息");puts("4. 根据姓名查找该学⽣,并返回学号和成绩");puts("5. 根据某指定位置显⽰该学⽣信息");puts("6. 在指定位置插⼊学⽣信息");puts("7. 在指定位置删除学⽣信息");puts("8. 统计学⽣个数");puts("0. 退出");printf("------------------------\n");int x,choose;while(1){puts("请输⼊你要选择的功能前的序号:");scanf("%d",&choose);if(choose==0) break;switch(choose){case1:if(InitList(&L))printf("成功建⽴顺序表\n\n");printf("顺序表建⽴失败\n\n");break;case2:printf("请输⼊要录⼊学⽣的⼈数(⼩于100):"); scanf("%d",&x);for(int i=1;i<=x;i++){printf("第%d个学⽣:\n",i);Input(&L.elem[i]);}L.length=x;puts("");break;case3:for(int i=1;i<=x;i++){a=GetElem(L,i);Output(&a);}break;case4:char s[20];printf("请输⼊要查找的学⽣姓名:");scanf("%s",s);if(Search(L,s))Output(&L.elem[Search(L,s)]);elseputs("对不起,查⽆此⼈");puts("");break;case5:printf("请输⼊要查询的位置:");int id1;scanf("%d",&id1);b=GetElem(L,id1);Output(&b);break;case6:printf ("请输⼊要插⼊的位置:");int id2;scanf("%d",&id2);printf("请输⼊学⽣信息:\n");Input(&c);if(ListInsert(L,id2,c)){x++;puts("插⼊成功");puts("");}else{puts("插⼊失败");puts("");}break;case7:printf("请输⼊要删除的位置:");int id3;scanf("%d",&id3);if(ListDelete(L,id3)){x--;puts("删除成功");puts("");}else{puts("删除失败");puts("");}break;case8:printf("已录⼊的学⽣个数为:%d\n\n",L.length);break;}}printf("\n\n谢谢您的使⽤,请按任意键退出\n\n\n");system("pause");return0;}#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define OK 1#define ERROR 0#define OVERFLOW -2#include<iostream>using namespace std;typedef int Status; // 定义函数返回值类型typedef struct{char no[10]; // 学号char name[20]; // 姓名double score; // 成绩}student;typedef student ElemType;typedef struct LNode{ElemType data; // 数据域struct LNode *next; //指针域}LNode,*LinkList;Status InitList(LinkList &L) // 构造空链表 L{L=(struct LNode*)malloc(sizeof(struct LNode));L->next=NULL;return OK;}Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到 i位置的数据域,返回给 e {LinkList p;p=L->next;int j=1;while(p&&j<i){p=p->next;++j;}if(!p||j>i) return ERROR;e=p->data;return OK;}Status Search(LNode L,char str[],LinkList &p) // 根据名字查找{p=L.next;while(p){if(strcmp(p->,str)==0)return OK;p=p->next;}return ERROR;}Status ListInsert(LinkList L,int i,ElemType e) // 在 i个位置插⼊某个学⽣的信息{LinkList p,s;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1) return ERROR;s=(struct LNode*)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDelete(LinkList p,int i) // 删除 i位置的学⽣信息{int j=0;while((p->next)&&(j<i-1))++j;}if(!(p->next)||(j>i-1)) return ERROR;LinkList q;q=p->next;p->next=q->next;delete q;return OK;}void Input(ElemType *e){cout<<"姓名:";cin>>e->name;cout<<"学号:";cin>>e->no;cout<<"成绩:";cin>>e->score;cout<<"完成输⼊\n\n";}void Output(ElemType *e){printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n",e->name,e->no,e->score); }int main(){LNode L;LinkList p;ElemType a,b,c,d;cout<<"------------10.2.34版 -----------\n";cout<<"1. 构造顺序表\n";cout<<"2. 录⼊指定⼈数的学⽣信息\n";cout<<"3. 显⽰学⽣表中的所有信息\n";cout<<"4. 根据姓名查找该学⽣,并返回学号和成绩\n";cout<<"5. 根据某指定位置显⽰该学⽣信息\n";cout<<"6. 在指定位置插⼊学⽣信息\n";cout<<"7. 在指定位置删除学⽣信息\n";cout<<"8. 统计学⽣个数\n";cout<<"0. 退出\n";cout<<"------------------------\n";int n,choose=-1;while(choose!=0){puts("请输⼊你要选择的功能前的序号:");cin>>choose ;if(choose==0)break;else if (choose==1){if(InitList(p))cout<<"建⽴顺序表成功\n";elsecout<<"建⽴顺序表失败\n";}else if (choose==2){cout<<"将要输⼊学⽣的⼈数:";cin>>n;for(int i=1;i<=n;i++){printf("第%d个学⽣:\n",i);Input(&a);ListInsert(&L,i,a);}}else if (choose==3){for(int i=1;i<=n;i++){GetElem(&L,i,b);Output(&b);}}else if (choose==4)cout<<"请输⼊要查找的学⽣姓名:";cin>>s;if(Search(L,s,p))Output(&(p->data));elsecout<<"对不起,查⽆此⼈";puts("");}else if (choose==5){cout<<"请输⼊要查询的位置:";int id1;cin>>id1;GetElem(&L,id1,c);Output(&c);}else if (choose==6){cout<<"请输⼊要插⼊的位置:";int id2;cin>>id2;cout<<"请输⼊学⽣信息:\n";Input(&d);if(ListInsert(&L,id2,d)){n++;cout<<"插⼊成功"; ;puts("");}else{cout<<"插⼊失败";puts("");}}else if (choose==7){cout<<"请输⼊要删除的位置:";int id3;cin>>id3;if(ListDelete(&L,id3)){n--;cout<<"删除成功";puts("");}else{cout<<"删除失败";puts("");}}else if (choose==8){cout<<"已录⼊的学⽣个数为:"<<n<<endl;break;}}cout<<"\n\n谢谢您的使⽤,请按任意键退出\n\n\n"; system("pause");return0;}。
顺序表的实验报告
顺序表的实验报告顺序表的实验报告一、引言顺序表是一种常见的数据结构,它能够以连续的存储空间来存储数据,并且能够快速地进行插入、删除和查找操作。
在本次实验中,我们将通过实际操作和观察,深入了解顺序表的特点和使用方法。
二、实验目的1. 掌握顺序表的定义和基本操作;2. 熟悉顺序表的插入、删除和查找操作;3. 比较不同操作在顺序表中的时间复杂度。
三、实验内容本次实验主要包括以下几个方面的内容:1. 顺序表的初始化:通过调用初始化函数,创建一个空的顺序表;2. 顺序表的插入操作:向顺序表中插入若干个元素,并观察插入后的顺序表状态;3. 顺序表的删除操作:从顺序表中删除指定位置的元素,并观察删除后的顺序表状态;4. 顺序表的查找操作:查找指定元素在顺序表中的位置,并观察查找结果。
四、实验步骤1. 初始化顺序表:调用初始化函数,创建一个空的顺序表;2. 插入操作:依次向顺序表中插入元素,观察插入后的顺序表状态;3. 删除操作:从顺序表中删除指定位置的元素,观察删除后的顺序表状态;4. 查找操作:查找指定元素在顺序表中的位置,观察查找结果。
五、实验结果与分析通过实验操作和观察,我们得到了以下实验结果:1. 初始化顺序表后,顺序表为空,长度为0;2. 在插入操作中,我们成功向顺序表中插入了若干个元素,并且顺序表的长度随之增加;3. 在删除操作中,我们成功删除了指定位置的元素,并且顺序表的长度随之减少;4. 在查找操作中,我们成功找到了指定元素在顺序表中的位置,并且返回了正确的结果。
根据实验结果,我们可以得出以下结论:1. 顺序表的插入和删除操作都能够在常数时间内完成,时间复杂度为O(1);2. 顺序表的查找操作的时间复杂度为O(n),其中n为顺序表的长度。
六、实验总结通过本次实验,我们深入了解了顺序表的定义、基本操作以及时间复杂度。
顺序表作为一种常见的数据结构,在实际应用中具有广泛的用途。
掌握了顺序表的使用方法,我们能够更加高效地处理各种数据操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告一.具体设计Ⅰ顺序表㈠存储结构定义采用了两个结构体,其中Student结构体用于存储学生的各项信息,包括学号int num;姓名char name[20];英语成绩float english;数学成绩float math;数据结构成绩float database;总分float sum;平均分float average; 顺序表的结构体sqlist中包含的数据项是Student结构体,还有存储当前长度的int length;及当前分配的存储容量的int listsize;㈡函数功能定义及具体功能介绍⑴录入信息int Input(sqlist *L)每次输入学生的所有信息,输入完后提示是否继续输入⑵显示所有学生信息int Display(sqlist *L)⑶插入一条记录到表尾void Insert(sqlist *L)⑷删除一条记录int Delete(sqlist *L)包括1.按姓名删除2.按学号删除⑸统计成绩int Statistic(sqlist *L)包括全班平均成绩,各科平均成绩,总分最高分,总分最低分,各科最高分,各科最低分以及各科及格率⑹查找int Search(sqlist *L)查找方法包括1.顺序查找2.二分查找按查找内容又包括1.按学号查找2.按姓名查找,若查找成功则显示查找到的学生信息,若查找失败则提示“查找失败!”⑺排序int Sort(sqlist *L)排序方法包括1.直接插入排序2.折半插入排序3.冒泡排序4.直接选择排序,排序内容包括1.按学号排序2.按英语成绩排序3.按高数成绩排序4.按数据结构成绩排序5.按总分排序(0)退出程序void tuichu(sqlist *L)释放占用的内存空间,显示"谢谢使用!",然后关闭所有文件,终止正在进行的程序(9) 主菜单int menu(),每次进行完一次功能实现后再次弹出,方便用户使用(10) 主函数int main(),用switch语句根据用户的选择进行相应的操作㈢具体设计思路及过程⑴录入信息int Input(sqlist *L),初始length为0,每录入一个学生length加一,然后显示提示信息是否继续,若继续则要再录入,所以要把这个整体的外面再套一层while循环,但是在写的过程中也遇到了一个困难,还没有输入继续y,就让输入学生信息,通过百度,知道了C有一个输入的缓冲区,所以在每次输入前都请空了缓冲区,防止读入缓冲区余下的内容。
运行截图如下:⑵显示所有学生信息int Display(sqlist *L)把存储在顺序表中的内容全部读出即可,但是当用户还没有输入数据的时候就选择了显示所有学生信息,就显示一个提示信息"请先输入数据!",然后回到主界面运行截图如下:⑶插入一条记录到表尾void Insert(sqlist *L)即输入学生信息保存到数组下标为L->length,然后让L->length加一即可运行截图如下:⑷删除一条记录int Delete(sqlist *L)包括1.按姓名删除2.按学号删除,所以要用一个int型变量存储学生的选项。
当用户还没有输入数据的时候如果选择了删除一条记录,就显示一个提示信息"请先输入数据!",然后回到主界面。
若顺序表中存在数据就先用顺序查找法查找是否存在这个学生,如果存在那么把后面的学生信息前移一位,然后L->length--,如果没有找到这个学生的信息就显示"要删除记录不存在!",然后返回主界面。
运行截图如下:⑸统计成绩int Statistic(sqlist *L),因为要统计的信息包含总分和3门课程,所以要设置多个计数器,而且计算及格率的计数器应设为float,否则两个整数相除是整数,结果会有误。
实现时从第一个学生信息开始依次加到最后一个即可,运行截图如下:⑹查找int Search(sqlist *L) 当用户还没有输入数据的时候如果选择了查找,就显示一个提示信息"请先输入数据!",然后回到主界面。
如果顺序表中存在数据就开始查找,找方法包括1.顺序查找2.二分查找按查找内容又包括1.按学号查找2.按姓名查找,所以要设置两个int 型的变量ch1,ch2来读入选择的内容,然后再通过switch语句进入选择的查找方法或查找的内容。
按学号查找的比较语句要用”==”,按姓名查找的比较语句就要用strcmp()函数,顺序查找法当计数器大于等于L->length时,输出"查找失败!",然后回到主界面,二分查找法当low>high时就输出"查找失败!",然后回到主界面。
运行截图如下:⑺排序int Sort(sqlist *L)排序方法包括1.直接插入排序2.折半插入排序3.冒泡排序4.直接选择排序,排序内容包括1.按学号排序2.按英语成绩排序3.按高数成绩排序4.按数据结构成绩排序5.按总分排序,所以要设置两个int 型的变量ch1,ch2来读入选择的内容,然后再通过switch语句进入选择的排序方法然后进入要排序的内容再进行相应的排序。
自己一开始写的时候复制记录是把结构体中的所有内容按照相应的复制方法依次复制过去,后来意识到结构体是可以直接复制的,所以又进行了改进,而且把数组中的第一个空闲,当作监视哨。
(0)退出程序void tuichu(sqlist *L),最初自己只是显示出谢谢使用!,然后用exit(0)终止程序,后来意识到还应释放存储学生信息的结构体,所以又增加了if(!L->stu)free(L->stu);(9)主菜单int menu(),显示标题,和大致功能,用户根据功能前的编号选择进入相应的函数,执行相应的功能,所以用一个int型的变量来录入用户的选择,并且这个函数的返回值类型为int ,以供main函数使用,为了防止用户的输入错误,加了一个while语句,当输入错误时,提示"输入错误!请重新输入:",直到用户输入正确为止。
(10)main函数,先定义顺序表,然后初始化,并且为了查找、排序方便将第一个当哨兵,所以LL->length初值为1,用一个while(1)和switch(menu())执行用户的选择操作,直到选择了退出。
Ⅱ单链表㈠存储结构定义采用了一个结构体表示单链表里面包含保存学生学号的int stuid,姓名的char name[20],英语成绩的float english,数学成绩的float math,数据结构成绩的float database,总分的float sum,平均分的float average;指示结点地址的指针struct LNode *next 。
㈡函数功能定义及具体功能介绍⑴录入信息LinkList Input()每次输入学生的所有信息,先输入要输入的学生人数然后逆序建表、完后提示是否继续输入⑵显示所有学生信息void Display(LinkList L)⑶插入一条记录到表尾void Insert(LinkList L)⑷删除一条记录void Delete(LinkList L)包括1.按姓名删除2.按学号删除⑸顺序查找某个学生void Search(LinkList L)按查找内容包括1.按学号查找2.按姓名查找,若查找成功则显示查找到的学生信息,若查找失败则提示“没有该学生的信息”⑹显示各科最高分void Max(LinkList L))⑺各科平均分void Average(LinkList L)(8)排序void Sort(LinkList L)排序方法包括1.直接插入排序2.冒泡排序3.直接选择排序,排序内容包括1.按学号排序2.按英语成绩排序3.按高数成绩排序4.按数据结构成绩排序5.按总分排序(1)退出程序void tuichu()显示"谢谢使用!",然后关闭所有文件,终止正在进行的程序(9) 主菜单void Menu(),每次进行完一次功能实现后再次弹出,方便用户使用(10) 主函数int main(),用switch语句根据用户的选择进行相应的操作㈢具体设计思路及过程⑴录入信息LinkList Input(),先建立一带头结点的空单链表,然后逆序建立存储学生信息的单链表,录入时,因为当时设计时想了两种录入方法,一种是顺序表中的每次输入一个学生信息然后输出提示让用户判断是否还要输入,另一种是先确定了输入人数再建立,所以在单链表中采用了第二中。
先输入要输入的人数,所以要把这个整体的外面再套一层for循环,依次用malloc生成新结点,再把把新结点插入到链表头部。
运行截图如下:⑵显示所有学生信息int Display(sqlist *L)把存储在顺序表中的内容全部读出即可,但是当用户还没有输入数据的时候就选择了显示所有学生信息,就显示一个提示信息"请先输入数据!",然后回到主界面,所以先判断链表是否为空,在外层要嵌套一层if......else语句,然后内层用一个for循环把存储在顺序表中的内容全部读出。
运行截图如下:⑶插入插入单个学生到表头void Insert(LinkList L),因为是采用逆序建表,所以是插入到表头。
先用malloc申请一个新的结点空间,然后录入各项信息插入到表头修改指针即可。
运行截图如下:⑷删除一条记录void Delete(LinkList L)包括1.按姓名删除2.按学号删除。
所以要设置两个int 型变量,一个存储存储用户的选项,然后用if...else语句进入相应的功能区;另一个存储要删除的,用户输入的学号信息;还要设一个char型数组,存储用户输入的要删除的姓名信息。
当用户还没有输入数据的时候如果选择了删除一条记录,就显示一个提示信息"请先输入数据!",然后回到主界面。
若单链表中存在数据就先用顺序查找法查找是否存在这个学生,如果存在因为单链表删除结点要知道要删除的这个结点的前一个结点的位置,所以要用一个指针记录,一共有3个指针,L是头结点的头指针,,最后p指向要删除的结点的前一个位置,q指向p的下一个结点,即最后指向要删除的结点。
找到后修改p,q这个两个指针的指向即可,最后输出要删除的学生信息后释放要删除的结点。
如果没有找到这个学生的信息就显示"要删除记录不存在!",然后返回主界面。
运行截图如下:⑸顺序查找某个学生void Search(LinkList L)单链表只能采用顺序查找法,不能采用折半查找。
按查找内容包括1.按学号查找2.按姓名查找,若查找成功则显示查找到的学生信息,若查找失败则提示“没有该学生的信息”。