代码如下:
#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("\t\t\t★★考生报名管理程序★★\n\t\t----------------------------------------\n")
menu(L)
return 0
}
//创建一个带头结点的空表
List
make_empty( List L)
{
L = ( List ) malloc (sizeof( Node ))
if(NULL == L)
{
printf("内存分配失败")
exit( 1 )
}
L->next = NULL
//printf("空表创建成功。\n")
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("报名成功\n")
}
else
{
printf("修改成功\n")
}
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("您要查找的考生信息:\n")
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)
}
else
{
printf("没有您要找的学生。\n")
}
}
//循环创建考生信息
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\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",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("现无考生报名!\n")
}
else
{
position p=L->next
while( p != NULL )
{
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",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("你要删除的考生不存在\n")
return 0
}
else
{
q = p->next
p->next = q->next
printf("删除成功。\n删除的考生信息为:\n")
printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",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\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",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("\t\t\t a. 考生报名入口\n")
printf("\t\t\t b. 查询考生信息\n")
printf("\t\t\t c. 修改考生信息\n")
printf("\t\t\t d. 删除考生信息\n")
printf("\t\t\t e. 全部考生信息\n")
printf("\t\t\t f. 程序作者信息\n")
printf("\t\t\t g. 退出程序\n")
char n='h'
while(n != 'g')
{
do //确定正确输入
{
printf("请通过字母序号选择功能:")
n = getchar()
getchar()
putchar('\n')
if( n <'a' || n >'g')
{
printf("错误的字母序号。\n")
}
}
while( n <'a' || n >'g' )
switch (n)
{
case 'a':
{
printf("请输入报名考生信息:\n")
position p = make_node( p, 1 )//创建新结点
link_to_tail( L, p )//将新结点连接到表上
put_information( p ) //是否输出该考生信息
putchar('\n')
}
break
case 'b':
{
put_name_information( L )
putchar('\n')
}
break
case 'c':
{
int n=0
position p = NULL
printf("您正在进行修改操作。\n")
p = find(L)
n = put_pos_information( p )
if(n)
{
make_node( p , 0 )
put_information( p ) //是否输出该考生信息
}
putchar('\n')
}
break
case 'd':
{
printf("您正在进行删除操作。\n")
delete_val( L )
putchar('\n')
}
break
case 'e':
{
put_all( L )
putchar('\n')
}
break
case 'f':
{
printf(" 修改日期 版本号 修改人 修改内容 \n")
printf(" --------------------------------------------------------\n")
printf(" 2018.6.19 v2.0 陈百川 增加主菜单\n")
printf(" 2018.6.23 v3.0 陈百川 增加生成文件功能\n\n")
printf(" 该版本号为v2.0\n")
putchar('\n')
}
break
default:
break
}
}
printf(" 感谢本次使用,祝您生活愉快。")
getch()
}
回答于 2022-12-11
#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("欢迎进入信息管理版块!\n\n")
printf("\025 1、添加学生\n")
printf("\025 2、删除学生\n")
printf("\025 3、修改学生信息\n")
printf("\025 4、返回\n")
printf("请输入您的选择编号:\n")
scanf("%d",&j)
getchar()
if ( 1 == j) head = AddStu(head)
else if( 2 == j) head = DeleStu(head)
else if( 3 == j) head = RwrStu(head)
else if( 4 == j)
else printf("输入有误,请重新输入!\n")
}
case 2:
{
//信息查询
system("cls")
printf("欢迎进入信息查询版块!\n")
printf("请输入要查询的学生编号:")
scanf("%d",&j)
getchar()
//printf("%d\n",j) //检测输入是否成功,调试程序用
FindStu(head,j) //查询并输出
printf("\n请输入回车键返回主菜单!")
getchar()
system("cls")
break
}
扩展资料:
C语言包含的各种控制语句仅有9种,关键字也只有32 个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。
实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。
参考资料来源:百度百科-c语言
/*好吧,其实你可以上网看看,那么多的,你可以自己修改下*/#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
char name[20]
long int num
char sex[4]
int age
char address[30]
double tele_num
char aihao[20]
struct student *next
}//定义一个结构题
int TOTAL_NUM = 0//学生总数
struct student *head = NULL
void welcome ()//欢迎界面
void mainmenu ()//主界面
void record ()//记录数据
void insert(struct student *stu)//插入数据
void display(struct student *stu)//显示一个学生的信息
void displayAll ()//显示所有学生的信息
void query_by_num ()//按学号查询学生信息
void readData ()//读取文件里学生的信息
void writeData ()//向文件写入学生信息
void freeAll ()//清空链表内容
void del ()//删除学生信息
void change ()//更改学生信息
void devise (struct student *p)//选择更改内容
int main (void)
{
welcome ()
//显示主菜单
mainmenu ()
return 0
}
//显示欢迎信息
void welcome ()
{
printf ("+----------------------------------------------------+\n")
printf ("||\n")
printf ("| 欢迎使用网络工程学院信息安全092班学生信息管理系统 |\n")
printf ("||\n")
printf ("+----------------------------------------------------+\n")
}
//系统主菜单
void mainmenu ()
{
int choice
choice = -1
readData ()
printf ("\n温馨提示:为保证您的操作得到保存,请按正常顺序退出系统^_^\n")
do
{
printf ("\n\n\n")
printf ("\t\t\t--------------------------------------------\n")
printf ("\t\t\t+信息安全092班学生信息管理系统 |\n")
printf ("\t\t\t--------------------------------------------\n")
printf ("\t\t\t+[1]----录入学生信息|\n")
printf ("\t\t\t+[2]----浏览学生信息|\n")
printf ("\t\t\t+[3]----查询学生信息|\n")
printf ("\t\t\t+[4]----删除学生信息|\n")
printf ("\t\t\t+[5]----修改学生信息|\n")
printf ("\t\t\t+[0]----退出系统|\n")
printf ("\t\t\t+*·*·*·*·*·*·*·*·*·*·*·*·*·*·*|\n")
printf ("\t\t\t--------------------------------------------\n")
printf ("请输入您的选择:")
scanf ("%d", &choice)
switch (choice)
{
case 0:
writeData ()
freeAll ()
exit (0)
case 1:
record ()
break
case 2:
displayAll ()
break
case 3:
query_by_num ()
break
case 4:
del ()
break
case 5:
change ()
break
default:
printf ("\n无效选项!")
break
}
}
while (choice != 0)
}
//录入学生信息
void record ()
{
struct student *p0
p0 = (struct student *)malloc(LEN)
printf ("请输入学生的姓名:")
scanf ("%s",p0->name)
printf ("请输入学生的学号:")
scanf ("%ld",&p0->num)
printf ("请输入学生的性别:")
scanf ("%s",p0->sex)
printf ("请输入学生的年龄:")
scanf ("%d",&p0->age)
printf ("请输入学生的地址:")
scanf ("%s",p0->address)
printf ("请输入学生的电话:")
scanf ("%lf",&p0->tele_num)
printf ("请输入学生的爱好:")
scanf ("%s",p0->aihao)
insert (p0)
printf ("该学生的信息为:\n")
printf ("-------------------------------------------------------------------------------\n")
printf ("姓名\t学号\t\t年龄\t性别\t地址\t\t电话\t\t爱好\n")
display (p0)
}
void insert (struct student *stu)
{
struct student *p0, *p1, *p2
p1 = head
p0 = stu
if (head == NULL)
{
head = p0
p0->next = NULL
}
else
{
while ((p0->num >p1->num)&&(p1->next != NULL))
{
p2 = p1
p1 = p1->next
}
if (p0->num <= p1->num)
{
if (head == p1)
head = p0
else
p2->next = p0
p0->next = p1
}
else
{
p1->next = p0
p0->next = NULL
}
}
TOTAL_NUM++
}
void display (struct student *p)
{
printf ("%s\t%ld\t%d\t%s\t%s\t\t%.0f\t%s\n", p->name, p->num, p->age, p->sex, p->address, p->tele_num, p->aihao)
}
//浏览学生信息
void displayAll()
{
struct student *p
printf("学生总数:%d\n", TOTAL_NUM)
p = head
if (head != NULL)
{
printf("\n姓名\t学号\t\t年龄\t性别\t地址\t\t电话\t\t爱好\n")
printf("-------------------------------------------------------------------------------\n")
do
{
display(p)
p = p->next
}
while(p != NULL)
}
printf ("\n")
}
//按学号查询学生信息
void query_by_num ()
{
int num
struct student *p1
printf("请输入学生的学号:")
scanf("%ld", &num)
if(head==NULL)
{
printf("无学生记录!\n")
return
}
p1 = head
while (num!=p1->num &&p1->next!=NULL)
p1 = p1->next
if (num == p1->num)
{
printf ("姓名\t学号\t\t年龄\t性别\t地址\t\t电话\t\t爱好\n")
printf ("-------------------------------------------------------------------------------\n")
display (p1)
}
else
printf ("没有该学生记录,请核对!")
}
//写入文件
void writeData ()
{
FILE* fp//文件指针
struct student *p
fp = fopen("1.txt", "w")
if (!fp)
{
printf("文件打开错误!")
return
}
fprintf(fp,"%d\n", TOTAL_NUM)
for(p = headp!= NULLp= p->next)
{
fprintf(fp,"%s\t%ld\t%s\t%d\t%s\t%.0f\t%s\n", p->name, p->num, p->sex, p->age, p->address, p->tele_num, p->aihao)
}
fclose (fp)
}
void freeAll ()
{
struct student *p1, *p2
p1 = p2=head
while(p1)
{
p2=p1->next
free (p1)
p1 = p2
}
}
//读取文件
void readData ()
{
FILE* fp//文件指针
struct student *p1, *p2
fp = fopen("1.txt", "r")
if (!fp)
{
printf("文件打开错误!")
return
}
fscanf(fp,"%d\n", &TOTAL_NUM)
head = p1 = p2 = (struct student *)malloc(LEN)
fscanf(fp,"%s\t%ld\t%s\t%d\t%s\t%lf\t%s\n", p1->name, &p1->num, p1->sex, &p1->age, p1->address, &p1->tele_num, p1->aihao)
while(!feof(fp))
{
p1 = (struct student *)malloc(LEN)
fscanf(fp,"%s\t%ld\t%s\t%d\t%s\t%lf\t%s\n", p1->name, &p1->num, p1->sex, &p1->age, p1->address, &p1->tele_num, p1->aihao)
p2->next = p1
p2 = p1
}
p2->next = NULL
fclose(fp)
}
//删除学生信息
void del ()
{
struct student *p1, *p2
long int num
if (head == NULL)
{
printf("无学生记录!\n")
return
}
printf("请输入您要删除的学生的学号:")
scanf("%ld", &num)
p1 = head
while (num != p1->num &&p1->next != NULL)
{
p2 = p1
p1 = p1->next
}
if(num == p1->num)
{
if(p1 == head)
head = p1->next
else p2->next = p1->next
free(p1)
TOTAL_NUM--
}
else
printf("没有该学生记录,请核对!\n")
}
//修改学生信息
void change ()
{
struct student *p1, *p2
long int num
if (head == NULL)
{
printf ("无学生记录!\n")
return
}
printf ("请输入您要修改的学生的学号:")
scanf ("%ld", &num)
p1 = head
while (num != p1->num &&p1->next != NULL)
{
p2 = p1
p1 = p1->next
}
if(num == p1->num)
devise (p1)
else
printf("没有该学生记录,请核对!\n")
}
void devise (struct student *p)
{
int choice
choice = -1
do
{
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")
printf("请输入您的选择:")
scanf("%d", &choice)
switch (choice)
{
case 0:
return
case 1:
printf("请输入新姓名:")
scanf("%s", p->name)
break
case 2:
printf("请输入新学号:")
scanf("%d", &p->num)
break
case 3:
printf("请输入新性别:")
scanf("%s", p->sex)
break
case 4:
printf("请输入新年龄:")
scanf("%s", &p->age)
break
case 5:
printf("请输入新地址:")
scanf("%s", p->address)
break
case 6:
printf("请输入新电话:")
scanf("%lf", &p->tele_num)
break
case 7:
printf("请输入新爱好:")
scanf("%s", p->aihao)
break
default:
printf("\n无效选项!")
break
}
}
while(choice != 0)
}