建立一个无序链表,每个结点包含:学号、姓名、年龄、C语言成绩.由一个函数完成建立链表的工作,另一个函数完成输出链表上各结点值,一个函数完成释放链表结点占用的动态存储空间.

来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/26 13:01:28
建立一个无序链表,每个结点包含:学号、姓名、年龄、C语言成绩.由一个函数完成建立链表的工作,另一个函数完成输出链表上各结点值,一个函数完成释放链表结点占用的动态存储空间.建立一个无序链表,每个结点包含

建立一个无序链表,每个结点包含:学号、姓名、年龄、C语言成绩.由一个函数完成建立链表的工作,另一个函数完成输出链表上各结点值,一个函数完成释放链表结点占用的动态存储空间.
建立一个无序链表,每个结点包含:学号、姓名、年龄、C语言成绩.由一个函数完成建立链表的工作,另一个函数完成输出链表上各结点值,一个函数完成释放链表结点占用的动态存储空间.

建立一个无序链表,每个结点包含:学号、姓名、年龄、C语言成绩.由一个函数完成建立链表的工作,另一个函数完成输出链表上各结点值,一个函数完成释放链表结点占用的动态存储空间.
#include
#include
#include
#include
#include
#include
void pause();
typedef struct STUDENT
{
char studentNumber[20]; //学生学号
char studentName[20]; //学生姓名
char className[20]; //班级名称
float chinese; //语文绩
float maths; //数学成绩
float english; //外语成绩
float total;
float average; //平均值
struct STUDENT *next; //指向下个数据
struct STUDENT *last; //指向上个
}STUDENT;
static STUDENT *first=NULL; //链表头
static STUDENT *end=NULL;
STUDENT *Malloc(void)
{
STUDENT *p;
p=(STUDENT*)malloc(sizeof(STUDENT));
if(p==NULL)
return NULL;
memset(p->studentNumber,'\0',20);
memset(p->studentName,'\0',20);
memset(p->className,'\0',20);
p->chinese=0.0;
p->maths=0.0;
p->english=0.0;
p->total=0.0;
p->average=0.0;
p->next=NULL;
p->last=NULL;
return p;
}
void Insert(STUDENT *t) //链表插入
{
STUDENT *p;
if (first==NULL)
first=t;
else
{ p=first;
while (p->next)
p=p->next;
p->next=t;
t->last=p;
end=t;
}
}
void loaddatabase() //加载数据
{
FILE *fp;
STUDENT *p;
fp=fopen("student.txt","r");
if(!fp)
{
printf("打开文件出错\n");
pause();
return;
}
p=Malloc();
//first=p;
while(fscanf(fp,"%s%s%s%f%f%f%f%f",
p->studentNumber,p->studentName,p->className,
&(p->chinese),&(p->maths),&(p->english),&(p->total),&(p->average))>0)
{
Insert(p);
p=Malloc();
}
fclose(fp);
printf("\t\t 欢迎使用学生成绩管理系统 \n\n");
printf("\n\n\n\n\n\n\n\t\t\t\t数据加载成功\n\n\n\n\n\n\n\t\t\t\t");
system("pause");
system("cls");
}
void savedata() //保存数据
{
FILE *fp;
STUDENT *p;

if (first==NULL )
{
printf("没有学生记录\n");
pause();
//return;
}
fp=fopen("student.txt","w+");
if(!fp)
{
printf("打开文件出错\n");
pause();
return;
}
p=first;
while(p)
{
fprintf(fp,"%s %s %s %f %f %f %f %f\n",p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
p=p->next;
}
fclose(fp);
printf("数据保存成功\n");
}
void add() //添加记录
{
STUDENT *p;
STUDENT *newstudent=Malloc();
printf("请输入学号:");
scanf("%s",newstudent->studentNumber);
printf("请输入姓名:");
scanf("%s",newstudent->studentName);
printf("请输入班级名称:");
scanf("%s",newstudent->className);
printf("请输入语文成绩:");
scanf("%f",&newstudent->chinese);
printf("请输入数学成绩:");
scanf("%f",&newstudent->maths);
printf("请输入外语成绩:");
scanf("%f",&newstudent->english);
newstudent->total=newstudent->chinese+newstudent->maths+newstudent->english;
newstudent->average=(newstudent->total)/3;
Insert(newstudent);
}
void pause()
{
system("pause");
system("cls");
}
void printall() //打印全部记录
{
STUDENT *p;
p=first;
printf("\n");
printf("学号\t\t姓名\t\t班级\t语文\t数学\t外语\t总分\t平均分\n");
while (p)
{
printf("%s\t%s\t\t%s\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\n",p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
p=p->next;
}
printf("\n");
}
void findbyname() //按姓名查询
{ int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入学生姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentName,buf)==0)
{ printf("%s\t %s\t %s\t %3.1f\t %3.1f\t %3.1f\t %3.1f\t %3.1f\n",
p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
i++;
break;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改学生记录\n");
}
void findbynumber() //按学号查询
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入学生学号:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentNumber,buf)==0)
{ printf("%s\t %s\t %s\t %3.1f\t %3.1f\t %3.1f\t %3.1f\t %3.1f\n",
p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
i++;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改学生记录\n");
}
void findbyclass() //按班级名查询
{ int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入班级名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->className,buf)==0)
{ printf("%s\t %s\t %s\t %3.1f\t %3.1f\t %3.1f\t %3.1f\t %3.1f\n",
p->studentNumber,p->studentName,p->className,
p->chinese,p->maths,p->english,p->total,p->average);
i++;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改学生记录\n");
}


int collect(){ //统计分数
int totalstudentnum=0;
double totalch=0.0,totalmh=0.0,totalen=0.0;
double totalscore=0.0;
STUDENT *p;
p=first;
while (p)
{
totalscore=totalscore+p->total;
totalch=totalch+p->chinese;
totalmh=totalmh+p->maths;
totalen=totalen+p->english;
totalstudentnum++;
p=p->next;
}
printf("人数:%d \t\t\t整体总分:%.1f \t\t整体平均分:%.1f \n",
totalstudentnum,totalscore,(totalscore/totalstudentnum));
printf("语文:%.1f \t\t数学:%.1f \t\t外语:%.1f \n",totalch,totalmh,totalen);
printf("语文平均分:%.1f \t数学平均分:%.1f \t外语平均分:%.1f\n",
(totalch/totalstudentnum),(totalmh/totalstudentnum),(totalen/totalstudentnum));
}
int delbyname()
{ int i=0;
STUDENT *p,*pnext,*pbuf,*plast;
char buf[20];
p=first;
printf("请输入需删除人员的姓名:");
scanf("%s",buf);

while (p)
{
if (strcmp(p->studentName,buf)==0)
{
i++;
if (first==p)
{
pbuf=first;
if (first->next==NULL) end=NULL;
first=first->next;
if (first) first->last=NULL;
free(pbuf);
printf("删除成功\n");
return 0;
}
plast->next=p->next;
if (p->next=NULL) end=p->last;
free(p);
printf("删除成功\n");
}
plast=p;
p=p->next;
}
if (i==0)
printf("sorry,没找到该学生记录\n");
}
int delbynumber()
{ int i=0;
STUDENT *p,*pnext,*pbuf,*plast;
char buf[20];
p=first;
printf("请输入需删除人员的学号:");
scanf("%s",buf);

while (p)
{
if (strcmp(p->studentNumber,buf)==0)
{
i++;
if (first==p)
{
pbuf=first;
if (first->next==NULL) end=NULL;
first=first->next;
//first->last=NULL;
if (first) first->last=NULL;
free(pbuf);
printf("删除成功\n");
return 0;
}
plast->next=p->next;
if (p->next=NULL) end=p->last;
free(p);
printf("删除成功\n");
}
plast=p;
p=p->next;
}
if (i==0)
printf("sorry,没找到该学生记录\n");
}

void changebynumber()
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入需修改人员的学号:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentNumber,buf)==0)
{
printf("请输入学号:");
scanf("%s",p->studentNumber);
printf("请输入姓名:");
scanf("%s",p->studentName);
printf("请输入班级名称:");
scanf("%s",p->className);
printf("请输入语文成绩:");
scanf("%f",&p->chinese);
printf("请输入数学成绩:");
scanf("%f",&p->maths);
printf("请输入外语成绩:");
scanf("%f",&p->english);
p->total=p->chinese+p->maths+p->english;
p->average=(p->total)/3;
printf("修改成功");
i++;
return;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改学生记录\n");
}

void changebyname()
{
int i=0;
STUDENT *p;
char buf[20];
p=first;
printf("请输入需修改人员的姓名:");
scanf("%s",buf);
while (p)
{
if (strcmp(p->studentName,buf)==0)
{
printf("请输入学号:");
scanf("%s",p->studentNumber);
printf("请输入姓名:");
scanf("%s",p->studentName);
printf("请输入班级名称:");
scanf("%s",p->className);
printf("请输入语文成绩:");
scanf("%f",&p->chinese);
printf("请输入数学成绩:");
scanf("%f",&p->maths);
printf("请输入外语成绩:");
scanf("%f",&p->english);
p->total=p->chinese+p->maths+p->english;
p->average=(p->total)/3;
printf("修改成功\n");
i++;
return;
}
p=p->next;
}
if (i==0)
printf("sorry,没找到改学生记录\n");
}

void sortbychinese() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{

// printf("外层 %f\n",p1->chinese);
// printall();
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next;p=p->next,p2=p2->next) //p指向P2后面一个数据
{
// printf("调整之前p=%f p2=%f \n",p->chinese,p2->chinese);
if ((p->chinese)-(p2->chinese)>0)
{
//printf("1\n");
plast=p2->last; //保存前节点
pnext=p->next; //保存后节点

if (plast) plast->next=p; //前节点接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后节点接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外层指针校正
else if (p1==p2)
p1=p;
// printf("2\n");
p->next=p2; //节点交换
p2->last=p;

p2->next=pnext;
// printf("3\n");
p->last=plast;
// printf("4\n");
// else
//p->last=NULL;
p2=p;
p=p2->next;

//if (p==NULL) break;
//printf("3\n");
//if (p->last==first) break;
// printall();
//printf ("5\n");
// printf("调整之后p=%f p2=%f\n",p->chinese,p2->chinese);
}
}
}
//printall();
}
void sortbymaths() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next && p;p=p->next,p2=p2->next) //p指向P2后面一个数据
{

if ((p->maths)-(p2->maths)>0)
{
//printf("1\n");
plast=p2->last; //保存前节点
pnext=p->next; //保存后节点

if (plast) plast->next=p; //前节点接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后节点接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外层指针校正
else if (p1==p2)
p1=p;
// printf("2\n");
p->next=p2; //节点交换
p2->last=p;

p2->next=pnext;
// printf("3\n");
p->last=plast;
// printf("4\n");
// else
//p->last=NULL;
p2=p;
p=p2->next;
//if (p==NULL) break;
//printf("3\n");
//if (p->last==first) break;
// printall();
// printf ("5\n");
}
}
}
//printall();
}
void sortbyenglish() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next && p;p=p->next,p2=p2->next) //p指向P2后面一个数据
{

if ((p->english)-(p2->english)>0)
{
//printf("1\n");
plast=p2->last; //保存前节点
pnext=p->next; //保存后节点

if (plast) plast->next=p; //前节点接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后节点接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外层指针校正
else if (p1==p2)
p1=p;
// printf("2\n");
p->next=p2; //节点交换
p2->last=p;

p2->next=pnext;
// printf("3\n");
p->last=plast;
// printf("4\n");
// else
//p->last=NULL;
p2=p;
p=p2->next;
//if (p==NULL) break;
//printf("3\n");
//if (p->last==first) break;
// printall();
// printf ("5\n");
}
}
}
}
void sortbytotal() //排序
{
STUDENT *p,*p1,*p2,*plast=NULL,*pnext=NULL;
for(p1=end->last;p1;p1=p1->last)
{
// if (p1->next==NULL) p1=p1->last;
for(p2=first,p=first->next;p2!=p1->next && p;p=p->next,p2=p2->next) //p指向P2后面一个数据
{

if ((p->total)-(p2->total)>0)
{
// printf("1\n");
plast=p2->last; //保存前节点
pnext=p->next; //保存后节点

if (plast) plast->next=p; //前节点接后面
else
{ first=p;
p->last=NULL;}
if (pnext) pnext->last=p2; //后节点接前面
else
{end=p2;
p2->next=NULL;
}
if (p1==p) p1=p2; //外层指针校正
else if (p1==p2)
p1=p;
// printf("2\n");
p->next=p2; //节点交换
p2->last=p;

p2->next=pnext;
// printf("3\n");
p->last=plast;
// printf("4\n");
// else
//p->last=NULL;
p2=p;
p=p2->next;
//if (p==NULL) break;
//printf("3\n");
//if (p->last==first) break;
//printall();
// printf ("5\n");
}
}
}
}
void exit_free()
{
STUDENT *p,*p1;
p=first;
while (p)
{
p1=p;
free(p1);
p=p->next;
}

}

void ver()
{
system("cls");
printf("\n");
printf("\t\t\t 学生成绩管理系统 v1.0");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t作者 风中的纸屑\n\n\n");

}
int menu(void)
{
int choose;
//system("cls");
printf(" \n\n");
printf(" 1: 显示所有学生的信息 |");
printf(" 2: 按姓名查询 |\n");
printf(" 3: 按学号查询 |");
printf("\t 4: 按班级查询 |\n");
printf(" 5: 通过姓名删除学生 | ");
printf(" 6:按学号删除学生 |\n");
printf(" 7: 按学号修改学生成绩 |");
printf(" 8: 按姓名修改学生成绩 |\n");
printf(" 9: 添加 |");
printf("\t\t\t 10: 语文排序 |\n");
printf(" 11: 数学排序 |");
printf("\t\t 12: 外语排序 |\n");
printf(" 13: 总分排序 |");
printf(" \t\t 14:汇总 |\n");
printf(" 15:保存所有学生信息 |");
printf(" 16:清屏 |\n");
printf(" 17: 版本 |");
printf("\t\t 18: 退出 |\n");
printf("\t \n");
printf(" ");
printf("\t 请输入对应数字:");
scanf("%d",&choose);/*取得用户的选择*/
switch(choose)
{
case 1:
system("cls");
printall();/*显示所有学生的信息*/
printf("\n");
collect();
break;
case 2:
findbyname();
break;
case 3:
findbynumber();/*根据用户输入的学号显示该学生的信息*/
break;

建立一个无序链表,每个结点包含:学号、姓名、年龄、C语言成绩.由一个函数完成建立链表的工作,另一个函数完成输出链表上各结点值,一个函数完成释放链表结点占用的动态存储空间. 数据结构中,建立一个空表,空表有没有头结点? 离散证明:一个图包含2n个结点,每个结点的度数大于等于n的简单图是连通的证明:一个图包含2n个结点,每个结点的度数大于等于n的简单图是连通的. 已知带表头结点的单链表L,指针P指向L链表中的一个结点(非首、尾结点):删除P结点的语句序列是? 数据结构已知指针P指向双向链表中的一个结点(非首结点、非尾结点),则:(1)将结点S插入在P结点的直接 已知带头结点的单链表L,指针P指向L链表中的一个结点为(非首结点、非尾结点),删除P结点的直接后继结点的语句是 ;(2)删除P结点的直接前驱结点的语句序列是 C语言中编写两个函数我是新手,最近学到单向链表了,有一个疑惑.比如,假设编写函数creat是建立一个带有头结点的链表,编写函数take是顺序输出单向链表各结点数据的内容.函数creatstruct list{char 循环链表的特点:最后一个结点的指针域指向头结点.用语句怎么表述 数据结构:在带头结点的単链接head中,已知指针e指向链表的某个结点,写一个算法求该结点的直接前趋结点! 2.(10分)设有一个带头结点,由正整数组成的无序单链表,头指针为L.整个问题如下2.(10分)设有一个带头结点,由正整数组成的无序单链表,头指针为L,Typedef struct Lnode{ int data; struct Lnode * 关于access 分类记数的查询一个表,里面有这样几个字段:班级,学号,姓名,成绩要求查询每个班里成绩>=60的人数 4. 在双向链表中,每个结点包含有两个指针域,一个指向其_____ ______结点,另一个指向其_____ ____结点 十二个的成语每个包含一个属相 已知有一个单向循环链表,其每个结点中含三个域:prior,data 和next,其中data为数据域,next为指向后继结点指针域,pre也为指针域,但它的值为空(NULL),试编写算法将此单向循环链表改为双向循环链表, 二叉树和度为2的树的相同之处包括?二叉树和度为2的树的相同之处包括__.A)每个结点都有一个或两个孩子结点B)至少有一个根结点C)至少有一个度为2的结点D)每个结点至多只有一个双亲结点非 在n个结点的顺序表中删除一个结点需要平均移动 个结点,具体移动次数取决于 . 数据结构基础题目.带有头结点的动态单链表l中的结点是按整数值递增排列的,将值为x的结点插入表l中,使其仍然有序,图中是我的插入函数和主函数,除这之外只有一个建立单链表的函数是抄 数据结构(c语言版)的问题:一个单向链表,有一个头结点,那么头指针指向?一个单向链表,有一个头结点,后面依次是第1、第2、……第n个结点.那么头指针指向第1个结点还是指向头结点?