✅简介:与大家一起加油,希望文章能够帮助各位!!!!
💬保持学习、保持热爱、认真分享、一起进步!!!
实验任务:
利用链表实现一个简单的学生信息管理系统:
(1)学生信息包括学号、姓名、性别、年龄、电话号码、所学专业、班级等;
(2)系统的主要功能包括:学生信息的创建、输出学生信息、查询学生信息、增加学生信息、删除学生信息。
每当写一个程序的时候,我们大脑中首先要有一个基本的轮廓。只要大体方向确定我们就可以根据这个方向去一点点完善。
以下是本次设计的大致轮廓:(有不太合适的请大佬指正)
- 学生信息结构体设计:定义一个包含以上要求信息的结构体;
- 学生信息数据:在程序开始运行时,初始化一些学生信息数据用于测试,或者从文件或数据库中读取已经存储的学生信息,或者刚开始输入一些数据;
- 显示菜单:给出学生信息管理系统的操作菜单,包括创建信息、输出信息、查询信息、增加信息和删除信息等功能选项;
- 执行操作:根据用户选择的功能选项,执行相应的操作,执行相应的方法;
- 整体的思路是利用链表来存储学生信息,通过不同的功能选项来对链表中的学生信息进行不同的操作。
代码如下:
在main
函数中,根据用户的选择调用相应的功能函数,并通过循环实现系统的持续运行,直到用户选择退出系统操作。最后,程序结束前释放了链表占用的内存空间。
记住!!!一定要释放空间......
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define OK 1
#define False 0
typedef struct _li{
char Sno[20];
char Sname[20];
int Ssex;
int Sage;
char Snum[11];
char Smaj[20];
char Scla[10];
struct _li* next;
}LNode,*linklist;
int Creat_infor(linklist q);
int PrintAll_stu(linklist p);
int Drop_stu(linklist p,char* match);
int Print_Single(linklist p);
int Select_stu(linklist p,char* match);
//--------------上半部分包括头文件的引用、结构体的定义和方法的声明-------------------
int main(){
LNode Head,hh;
Head.next=&hh;
hh.next=NULL;
int choice=0;
char c[20];
bool YANG=true;
while(YANG){
printf("----欢迎来到学生信息管理系统----\n");
printf("1 增加学生信息\n");
printf("2 查询学生信息\n");
printf("3 删除学生信息\n");
printf("4 输出所有学生信息\n");
printf("5 --退出系统--\n");
scanf("%d",&choice);
switch (choice) {
case 1:
printf("请输入增加的学生信息:\n");
Creat_infor(&Head);
break;
case 2:
printf("请输入要查询学生的学号:\n");
scanf("%s",c);
Select_stu(&Head,c);
break;
case 3:
printf("请输入要删除学生的学号:\n");
scanf("%s",c);
Drop_stu(&Head,c);
break;
case 4:
printf("学生信息为:\n");
PrintAll_stu(&Head);
break;
case 5:
printf("即将退出系统...\n");
YANG=false;
break;
default:
printf("无效的选项,请重新选择\n");
break;
}
}
// -----------释放链表内存空间--------------
linklist p = Head.next;
while (p != NULL) {
linklist temp = p;
p = p->next;
free(temp);
}
return 0;
}
接下来就是各种方法的实现了!!!
//创建学生信息 成功返回"OK",失败返回"False"
int Creat_infor(linklist q){
linklist p = malloc(sizeof(LNode));
if(p==NULL)
return False;
while(q->next!=NULL){
q=q->next;
}
q->next=p;
p->next=NULL;
printf("请输入学生的学号:\n");
scanf("%s",p->Sno);
int c;
while ((c = getchar()) != '\n' && c != EOF);
printf("请输入学生的姓名:\n");
scanf("%s",p->Sname);
printf("请输入学生的性别:\n");
scanf("%d",&p->Ssex);
printf("请输入学生的年龄:\n");
scanf("%d",&p->Sage);
printf("请输入学生的电话号码:\n");
scanf("%s",p->Snum);
printf("请输入学生的所学专业:\n");
scanf("%s",p->Smaj);
printf("请输入学生的班级:\n");
scanf("%s",p->Scla);
return OK;
}
//输出所有学生信息,成功返回OK,失败返回False
int PrintAll_stu(linklist p){
if(p->next==NULL)
return False;
p=p->next;
while(p->next!=NULL){
p=p->next;
Print_Single(p);
}
return OK;
}
//删除学生信息,成功返回OK,失败返回False(通过学号匹配)
int Drop_stu(linklist p,char* match){
if(p==NULL)
return False;
linklist q=p;
p=p->next;
while(p!=NULL){
if(strcmp(p->Sno,match)==0){
q->next=p->next;
free(p);
return OK;
}
p=p->next;
q=q->next;
}
return OK;
}
//查询学生信息,成功返回OK,失败返回False(通过学号匹配)
int Select_stu(linklist p,char* match){
if(p==NULL)
return False;
while(p->next!=NULL){
p=p->next;
if(strcmp(p->Sno,match)==0){
Print_Single(p);
return OK;
}
}
return False;
}
//输出学生信息
int Print_Single(linklist p){
if(p==NULL)
return False;
printf("学号:%s\t",p->Sno);
printf("姓名:%s\t",p->Sname);
if(p->Ssex==1)
printf("性别:男\t");
else
printf("性别:女\t");
printf("年龄:%d\t",p->Sage);
printf("电话号码:%s\t",p->Snum);
printf("专业:%s\t",p->Smaj);
printf("班级:%s\n",p->Scla);
return OK;
}
总结:
在使用链表的过程中,我认为最重要的是要理解指针的作用。它是内存地址的直接引用。在链表中,通过指针来实现节点之间的连接,使得链表能够进行插入、删除和遍历等操作。理解指针的概念和使用,才能够更好地掌握链表的操作和原理。
下面打算出一章或者一期关于指针的知识。
以上均是个人的理解,如果有不对的地方请各位大佬帮忙斧正!!
分享一句很喜欢的一句话:
在这短短的一生,我们最终都会失去,你不妨大胆一些。爱一个人,攀一座山,追一个梦。