📄 tc23-5.c
字号:
/*****************
tc23-5.c
学生信息系统
******************/
/* 文件头与主函数 */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct Student /* 定义链表结构 */
{
int num;
char name[8];
struct Student * next;
} Stud;
/*函数说明*/
Stud * create_list( ); /* 此函数用于建立空链表 */
int insert_list(Stud * head,Stud * std,int n); /* 此函数用于向链表插入新结点*/
int del_list(Stud * head,Stud * std); /* 此函数用于删除链表结点*/
Stud* find_list(Stud * head,Stud * std); /* 此函数用于查找指定的结点*/
void brow_list(Stud * head); /* 此函数用于浏览链表*/
main( )
{
Stud *head; /* 定义链表头指针 */
Stud newstd;
int choice;
head=NULL; /* 初始化头指针 */
printf(" 学生信息系统\n");
printf("1. 建立链表\n"); /* 显示选项 */
printf("2. 插入新生\n");
printf("3. 查找学生\n");
printf("4. 删除学生\n");
printf("5. 数据浏览\n");
printf("0. 退出程序\n");
do
{
printf("请选择操作(输入0-5):");
scanf("%d",&choice); /* 输入数值选择要进行的操作*/
if(choice>5||choice<0) /* 确保输入值为可选取项 */
{
printf("输入错误!\07\n");
continue;
}
switch (choice) /* 利用开关语句执行选项*/
{
case 1:
if(head==NULL) /* 头指针为空方可建立链表,避免重复建表*/
head=create_list( ); /* 调用函数create_list建立链表,得到头指针*/
break;
case 2:
if(head==NULL) /* 确保链表存在,方可执行以下操作*/
{
printf("链表未建立!\n");
break;
}
while(1)
{
printf("学号(输入0 结束):");
scanf("%d",&newstd.num);
if(newstd.num==0) /* 当输入0时终止循环 */
break;
printf("姓名:");
scanf("%s",newstd.name);
insert_list(head,&newstd,-1); /* 调用函数insert_list插入新结点 */
}
break;
case 3:
printf("输入姓名:");
scanf("%s",newstd.name);
find_list(head,&newstd); /* 调用函数find_list查找结点 */
break;
case 4:
printf("输入姓名:");
scanf("%s",newstd.name);
del_list(head,&newstd); /* 调用函数del_list删除结点 */
break;
case 5:
brow_list(head); /* 调用函数brow_list浏览结点 */
break;
default:
return; /* 选项不为1~5时结束程序 */
}
}while(1);
}
/* 建立链表 */
Stud * create_list( ) /* 建立空链表*/
{
Stud * head;
head=malloc(sizeof(Stud)); /* 为头结点分配存储空间*/
if(head!=NULL) /* 确保链表成功建立,并返回相应信息*/
printf("链表已建立!\n");
else
printf("没有足够内存空间!\07\n");
head->next=NULL; /* 头结点初始化 */
head->num=0; /* 学号初始化 */
return head; /* 返回头结点地址给头指针 */
}
/* 插入结点 */
int insert_list(Stud * head,Stud * std,int n) /* 插入结点*/
{
Stud * p,* q,* s;
s=malloc(sizeof(Stud)); /* 为新结点分配存储空间 */
if(s==NULL)
{
printf("没有足够内存空间!\07\n");
return 0; /* 插入失败返回0*/
}
q=head; /* 指针初始化 */
p=head->next; /* p指向第一个结点 */
while(p!=NULL && n!=q->num) /* 当链表未到尾结点且n不等于下一学号时循环*/
{
q=p; /* 让p指向下一结点 */
p=p->next;
}
/*将新结点s加入到链表中,如果学号n存在,s将插到n前,否则将插到链表尾*/
q->next=s;
s->next=p;
strcpy(s->name,std->name); /*将姓名存入新结点*/
s->num =std->num; /*将学号存入新结点*/
return 1; /*插入成功返回1*/
}
/* 查找结点 */
Stud * find_list(Stud * head,Stud * std) /* 查找指定的结点*/
{
Stud * p;
p=head; /* 初始化指针*/
/* 当链表到达尾结点或name等于当前姓名时结束循环 */
while(p!=NULL && strcmp(p->name,std->name)) /*使用strcmp来进行字符串比较*/
p=p->next; /* 向后移动结点指针 */
if(p!=NULL)
{
printf("学号:%d 姓名:%s\n",p->num,p->name);
}
else
printf("查无此人!\n");
return p; /*如果找到name,返回指向它的指针,否则返回空指针*/
}
/* 删除结点 */
int del_list(Stud * head,Stud * std) /*删除指定结点*/
{
Stud * p,*q;
q=head; /* 初始化指针*/
p=head->next;
/* 当链表到达尾结点或name等于下一结点的姓名时结束循环*/
while(p!=NULL && strcmp(p->name,std->name))
{
q=p; /*移动指针,p为当前结点指针,q为下一结点指针*/
p=p->next;
}
if(p!=NULL) /*找到姓名为name时删除该结点*/
{
q->next =p->next; /*调整指针,使p->next指向q的下一结点*/
free(p); /*释放该结点存储空间*/
printf("删除完成!\n");
return 1; /* 删除成功返回1*/
}
else
{
printf("查无此人!\07\n");
return 0; /* 找不到姓名为name的结点,返回0*/
}
}
/* 浏览链表*/
void brow_list(Stud * head)
{
Stud *p;
p=head->next; /*初始化指针*/
while(p!=NULL) /*未到链表尾时循环*/
{
printf("学号:%d 姓名:%s\n",p->num,p->name);
p=p->next; /*移动指针*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -