c语言链表学生信息
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define N 3
typedef struct z1
{
char no[11];
char name[15];
int score[N];
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
STUDENT *init();
STUDENT *create();
STUDENT *del(STUDENT *h);
void print(STUDENT *h);
void search1(STUDENT *h);
void search2(STUDENT *h);
STUDENT *insert(STUDENT *h);
void sort(STUDENT *h);
void save(STUDENT *h);
void tongji(STUDENT *h);
int menu_select();
STUDENT *load();
void inputs(char *prompt,char *s,int count);
STUDENT *load();
main()
{
int i;
STUDENT *head;
head=init();
for(;;)
{
switch(menu_select())
{
case 0:head=init();break;
case 1:head=create();break;
case 2:head=insert(head);break;
case 3:save(head);break;
case 4:print(head);break;
case 5:search1(head);break;
case 6:head=del(head);break;
case 7:sort(head);break;
case 8:tongji(head);break;
case 9:search2(head);break;
case 10:exit(0);
}
}
}
int menu_select()
{
char *menu[]={"************菜单************",
"0. 初始化链表",
"1. 输入学生成绩",
"2. 插入学生成绩",
"3. 保存学生记录",
"4. 显示学生记录",
"5. 按学号查找学生信息",
"6. 删除指定学号的学生信息",
"7. 按某一门课对学生成绩排序",
"8. 统计某门课程的学生成绩",
"9. 按姓名查找学生信息",
"10. 退出系统"};
char s[3];
int c,i;
for(i=0;i<=11;i++)
printf(" %s\n",menu[i]);
do
{
printf("\n请选择0~10中的某一个选项\n");
scanf("%s",s);
c=atoi(s);
}while(c<0||c>10);
return c;
}
STUDENT *init()
{
return NULL;
}
STUDENT *create()
{
int i;int s;
STUDENT *h=NULL,*info;
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT));
if(!info)
{
printf("\n内存不足");
return NULL;
}
inputs("输入学号:",info->no,11);
if(info->no[0]=='@')break;
inputs("输入姓名:",info->name,15);
printf("开始输入%d门课的成绩\n",N);
s=0;
for(i=0;i<N;i++)
{
do{
printf("第%d门分数:",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("输入成绩错误,请重新输入:\n");
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i];
}
info->sum=s;
info->average=(float)s/N;
info->order=0;
info->next=h;
h=info;
}
return h;
}
void inputs(char *prompt,char *s,int count)
{
char p[255];
do
{
printf(prompt);
scanf("%s",p);
if(strlen(p)>count)
printf("\n太长了!\n");
}while(strlen(p)>count);
strcpy(s,p);
}
void print(STUDENT *h)
{
int i=0;
STUDENT *p;
p=h;
printf("\n\n\n***********************学生***********************\n");
printf("|序号|学号 | 姓名 | 语文 | 英语 |数学 | 总分 |平均分 |名次 |\n");
printf("|---|-------|--------|----|----|----|------|------|---|\n");
while(p!=NULL)
{
i++;
printf("|%3d |%-10s|%-8s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",i,p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("***********************end***********************\n");
}
STUDENT *del(STUDENT *h)
{
STUDENT *p,*q;
char s[11];
printf("请输入要删除的学生的学号\n");
scanf("%s",s);
q=p=h;
while(strcmp(p->no,s)&&p!=NULL)
{
q=p;
p=p->next;
}
if(p==NULL)
printf("\n链表中没有学号为%s的学生\n",s);
else
{
printf("\n\n\n***********************找到了***********************\n");
printf("|学号 | 姓名 | 语文 | 英语 | 数学 | 总分 | 平均分 | 名次 |\n");
printf("|----------|----------|----|----|----|------|------|---|\n");
printf("|%-10s|%-8s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("***********************end***********************\n");
printf("请按任意键删除\n");
getchar();
if(p==h)
h=p->next;
else q->next=p->next;
free(p);
printf("\n已经删除学号为%s的学生\n",s);
printf("不要忘了保存数据\n");
}
return h;
}
void search1(STUDENT *h)
{
STUDENT *p;
char s[11];
printf("请输入你要查找的同学的学号\n");
scanf("%s",s);
p=h;
while(strcmp(p->no,s)&&p!=NULL)
p=p->next;
if(p==NULL)
printf("'n没有学号为%s的学生\n",s);
else
{
printf("\n\n\n***********************找到了***********************\n");
printf("|学号 | 姓名 | 语文 | 英语 | 数学 | 总分 | 平均分 | 名次 |\n");
printf("|----------|-----------|----|----|----|------|------|---|\n");
printf("|%-10s|%-8s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("***********************end***********************\n");
}
}
void search2(STUDENT *h)
{
STUDENT *p;
char s[11];
printf("请输入你要查找的同学的姓名\n");
scanf("%s",s);
p=h;
while(strcmp(p->name,s)&&p!=NULL)
p=p->next;
if(p==NULL)
printf("\n没有姓名为%s的学生\n",s);
else
{
printf("\n\n\n***********************找到了***********************\n");
printf("|学号 | 姓名 | 语文 | 英语 | 数学 | 总分 | 平均分 | 名次 |\n");
printf("|----------|-----------|----|----|----|------|------|---|\n");
printf("|%-10s|%-8s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("***********************end***********************\n");
}
}
STUDENT *insert(STUDENT *h)
{
STUDENT *p,*q,*info;
char s[11];
int s1,i;
printf("请输入插入点的学生学号\n");
scanf("%s",s);
printf("\n请输入新的学生信息\n");
info=(STUDENT *)malloc(sizeof(STUDENT));
if(!info)
{
printf("\n内存不足!");
return NULL;
}
inputs("输入学号:",info->no,11);
inputs("输入姓名:",info->name,15);
printf("请输入%d门课的分数\n",N);
s1=0;
for(i=0;i<N;i++)
{
do{
printf("分数%d",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("输入数据有误,请重新输入\n");
}while(info->score[i]>100||info->score[i]<0);
s1=s1+info->score[i];
}
info->sum=s1;
info->average=(float)s1/N;
info->order=0;
info->next=NULL;
p=h;
q=h;
while(strcmp(p->no,s)&&p!=NULL)
{q=p;p=p->next;}
if(p==NULL)
if(p==h)
h=info;
else q->next=info;
else
if(p==h)
{
info->next=p;
h=info;
}
else
{
info->next=p;
q->next=info;
}
printf("\n已经插入了%s这个学生\n",info->name);
printf("----不要忘了存盘啊--\n");
return(h);
}
void save(STUDENT *h)
{
FILE *fp;
STUDENT *p;
char outfile[10];
printf("请输入保存文件的文件名,例如 c:\\f1\\te.txt:\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL)
{
printf("不能打开文件\n");
exit(1);
}
printf("\n正在保存......\n");
p=h;
while(p!=NULL)
{
fwrite(p,sizeof(STUDENT),1,fp);
p=p->next;
}
fclose(fp);
printf("------保存成功!!!------\n");
}
void sort(STUDENT *h)
{
int i=0,j;
STUDENT *p,*q,*t,*h1;
printf("请输入要按哪门课程的编号来排序:(0.语文 1.数学 2.英语)\n");
scanf("%d",&j);
h1=h->next;
h->next=NULL;
while(h1!=NULL)
{
t=h1;
h1=h1->next;
p=h;
q=h;
while(t->score[j]<p->score[j]&&p!=NULL)
{
q=p;
p=p->next;
}
if(p==q)
{
t->next=p;
h=t;
}
else
{
t->next=p;
q->next=t;
}
}
p=h;
while(p!=NULL)
{
i++;
p->order=i;
p=p->next;
}
print(h);
printf("排序成功!!!\n");
}
void tongji(STUDENT *h)
{
STUDENT *p;
int a,b,i;
printf("请输入课程编号\n");
scanf("%d",&i);
printf("请输入分数段:\n");
scanf("%d,%d",&a,&b);
p=h;
while(p!=NULL)
{
printf("\n\n\n***********************找到了***********************\n");
if(p->score[i]>=a&&p->score[i]<=b)
{
printf("|学号 | 姓名 | 语文 | 英语 | 数学 | 总分 | 平均分 | 名次 |\n");
printf("|--------|---------|----|----|----|------|------|---|\n");
printf("|%-10s|%-8s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
}
p=p->next;
}
printf("***********************end***********************\n");
}
‘贰’ c语言学生信息管理系统代码
代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct examinee //考生信息结构
{ char examno[20]; //准考证号
char name[10]; //姓名
char sex[4]; //性别
short age; //年龄
char examtype[10]; //报考科目
}ElemType;
typedef struct Node //定义链表结点
{
ElemType data; //数据域
struct Node *next; //指针域
}Node,*List,*position;
List make_empty( List L ); //创建一个带头结点的空表
int is_empty( List L ); //测试链表是否是空表
int is_last( position p, List L ); //测试当前位置是否是表尾
position make_node( position p,int n ); //创建结点并输入考生信息
void put_information( position p ); //是否输出该考生信息
void put_name_information( List L ); //输出姓名为xx的考生信息
int put_pos_information( position p ); //输出该地址考生信息
void link_to_tail( List L, position p ); //将结点连接到表尾
int ciculation_make(); //循环创建考生信息
int judge_put_all(); //是否输出所有考生信息
void put_all(List L); //输出所有考生信息。
position find( List L ); //查找第一个姓名为xx的元素并返回位置
position find_previous( List L ); //查找第一个姓名为xx的元素并返回该元素直接前驱的位置
//int judge_delete_val(); //询问是否删除考生数据
int delete_val( List L ); //删除指定考生信息并输出其信息
void menu(List L); //菜单函数
List L;
//position p;
int
main( void )
{
List L = NULL; //定义头结点指针
position p = NULL; //定义表工作指针
L = make_empty( L ); //创建空表
printf(" ★★考生报名管理程序★★
----------------------------------------
");
menu(L);
return 0;
}
//创建一个带头结点的空表
List
make_empty( List L)
{
L = ( List ) malloc (sizeof( Node ));
if(NULL == L)
{
printf("内存分配失败");
exit( 1 );
}
L->next = NULL;
//printf("空表创建成功。
");
return L;
}
//创建结点并输入考生信息
position
make_node( position p ,int n)
{
if(n) //n为1是创建结点并输入,n为0是修改
{
p = ( position ) malloc ( sizeof ( Node ));
p->next = NULL ;
}
printf("请输入考生准考证号:");
gets(p->data.examno);
printf("请输入考生姓名:");
gets(p->data.name);
do
{
printf("请输入考生性别,只能输入“男”或者“女”:");
gets(p->data.sex);
}
while( 0 != strcmp( p->data.sex, "男" ) && 0 != strcmp( p->data.sex, "女" )); //判断性别是否有误
printf("请输入考生年龄:");
scanf("%hd",&p->data.age);
getchar(); //如果把这句删掉,就“无法执行”下面的报考类别
/*下面的do while用来判断报考类别是否输入有误*/
do
{
printf("请输入报考类别,只能输入“数学”或“英语”或者“数据结构”:");
gets(p->data.examtype);
}
while( 0 != strcmp( "英语", p->data.examtype ) && 0 != strcmp( "数学", p->data.examtype ) && 0 != strcmp( "数据结构", p->data.examtype ));
if(n)
{
printf("报名成功
");
}
else
{
printf("修改成功
");
}
return p;
}
//前插法;
void
link_to_tail( List L, position p)
{
p->next = L->next;
L->next = p;
}
//查找第一个姓名为xx的元素并返回位置
position
find( List L )
{
position p = L->next;
char name[10];
printf("请输入你要查找的考生姓名:");
gets(name);
while( p != NULL && 0 != strcmp( p->data.name , name))
{
p=p->next;
}
return p;
}
//测试链表是否是空表
int
is_empty( List L )
{
return L->next == NULL;
}
//测试当前位置是否是表尾
int
is_last( position p, List L )
{
return p->next == NULL;
}
//输出姓名为xx的考生信息
void
put_name_information( List L )
{
position p = find(L);
if(p!=NULL)
{
printf("您要查找的考生信息:
");
printf("准考证号:%s 姓名:%s 性别:%s 年龄:%hd 报考科目:%s
",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
}
else
{
printf("没有您要找的学生。
");
}
}
//循环创建考生信息
int
ciculation_make()
{
int n = 2;
do
{
printf("是否继续创建考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//是否输出考生信息
void
put_information( position p )
{
int n=2;
do
{
printf("是否输出该考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
if(n)
{
printf("准考证号:%s 姓名:%s 性别:%s 年龄:%hd 报考科目:%s
",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
}
}
//是否输出所有考生信息
int
judge_put_all()
{
int n = 2;
do
{
printf("是否输出所有考生信息?是请输入“1”,不是请输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//输出所有考生信息
void
put_all(List L)
{
if(L->next == NULL)
{
printf("现无考生报名!
");
}
else
{
position p=L->next;
while( p != NULL )
{
printf("准考证号:%s 姓名:%s 性别:%s 年龄:%hd 报考科目:%s
",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
p=p->next;
}
}
//getchar();
}
//询问是否删除考生数据
int
judge_delete_val()
{
int n = 2;
do
{
printf("是否要删除某个考生数据?是请输入“1”,不是输入“0”:");
scanf("%d",&n);
getchar();
}
while( n != 0 && n != 1);
return n;
}
//查找第一个姓名为xx的元素并返回其直接前驱的位置
position
find_previous( List L )
{
position q = L;
position p = L->next;
char name[10];
printf("请输入你要查找的考生姓名:");
gets(name);
while( p != NULL && 0 != strcmp( p->data.name , name))
{
q=p;
p=p->next;
}
if( p != NULL )
{
return q;
}
else
return p;
}
//删除指定考生信息并输出其信息
int
delete_val(List L)
{
int n=2;
position q=NULL;
position p=find_previous( L ); //返回考生信息地址
if( NULL == p )
{
printf("你要删除的考生不存在
");
return 0;
}
else
{
q = p->next;
p->next = q->next;
printf("删除成功。
删除的考生信息为:
");
printf("准考证号:%s 姓名:%s 性别:%s 年龄:%hd 报考科目:%s
",q->data.examno,q->data.name,q->data.sex,q->data.age,q->data.examtype);
free(q);
return 1;
}
}
//输出该地址考试信息
int
put_pos_information( position p )
{
if(p != NULL )
{
printf("准考证号:%s 姓名:%s 性别:%s 年龄:%hd 报考科目:%s
",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype);
return 1;
}
else
{
printf("没有您要查找的学生。");
return 0;
}
}
//菜单函数
void
menu(List L)
{
printf(" a. 考生报名入口
");
printf(" b. 查询考生信息
");
printf(" c. 修改考生信息
");
printf(" d. 删除考生信息
");
printf(" e. 全部考生信息
");
printf(" f. 程序作者信息
");
printf(" g. 退出程序
");
char n='h';
while(n != 'g')
{
do //确定正确输入
{
printf("请通过字母序号选择功能:");
n = getchar();
getchar();
putchar('
');
if( n < 'a' || n > 'g')
{
printf("错误的字母序号。
");
}
}
while( n < 'a' || n > 'g' );
switch (n)
{
case 'a':
{
printf("请输入报名考生信息:
");
position p = make_node( p, 1 ); //创建新结点
link_to_tail( L, p ); //将新结点连接到表上
put_information( p ); //是否输出该考生信息
putchar('
');
}
break;
case 'b':
{
put_name_information( L );
putchar('
');
}
break;
case 'c':
{
int n=0;
position p = NULL;
printf("您正在进行修改操作。
");
p = find(L);
n = put_pos_information( p );
if(n)
{
make_node( p , 0 );
put_information( p ); //是否输出该考生信息
}
putchar('
');
}
break;
case 'd':
{
printf("您正在进行删除操作。
");
delete_val( L );
putchar('
');
}
break;
case 'e':
{
put_all( L );
putchar('
');
}
break;
case 'f':
{
printf(" 修改日期 版本号 修改人 修改内容
");
printf(" --------------------------------------------------------
");
printf(" 2018.6.19 v2.0 陈百川 增加主菜单
");
printf(" 2018.6.23 v3.0 陈百川 增加生成文件功能
");
printf(" 该版本号为v2.0
");
putchar('
');
}
break;
default:
break;
}
}
printf(" 感谢本次使用,祝您生活愉快。");
getch();
}
(2)c语言链表学生信息扩展阅读:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。[1]目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
参考资料:
网络——C语言
‘叁’ 如何用c语言制作一个学生信息管理系统,要求以文件形式保存
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//链表结点结构体声明
typedef struct subjects
{
char name[20];
float score;
}sub;
typedef struct student
{
int num;
char name[20];
sub subject[3];
struct student* next;
}stu,*pstu;
#define SIZE sizeof(stu)
//函数申明
pstu LoadInfo();
void PrintMenu();
pstu AddStu(pstu );
pstu DeleStu(pstu );
pstu RwrStu(pstu );
void FindStu(pstu , char );
void Count(pstu ,char * ,float ,float );
void Rank(pstu ,char * );
void SaveQuit(pstu );
//创建菜单,进入选择循环
while(1)
{
PrintMenu();
printf("请输入您的选择编号:");
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
{
system("cls");
j=0;
while(4!=j)
{
printf("欢迎进入信息管理版块! ");
printf("