ZZULI-学生信息管理系统(链表)

✅简介:与大家一起加油,希望文章能够帮助各位!!!!
💬保持学习、保持热爱、认真分享、一起进步!!!

 实验任务:

利用链表实现一个简单的学生信息管理系统:

(1)学生信息包括学号、姓名、性别、年龄、电话号码、所学专业、班级等;

(2)系统的主要功能包括:学生信息的创建、输出学生信息、查询学生信息、增加学生信息、删除学生信息。

每当写一个程序的时候,我们大脑中首先要有一个基本的轮廓。只要大体方向确定我们就可以根据这个方向去一点点完善。

以下是本次设计的大致轮廓:(有不太合适的请大佬指正)

  1. 学生信息结构体设计:定义一个包含以上要求信息的结构体;
  2. 学生信息数据:在程序开始运行时,初始化一些学生信息数据用于测试,或者从文件或数据库中读取已经存储的学生信息,或者刚开始输入一些数据;
  3. 显示菜单:给出学生信息管理系统的操作菜单,包括创建信息、输出信息、查询信息、增加信息和删除信息等功能选项;
  4. 执行操作:根据用户选择的功能选项,执行相应的操作,执行相应的方法;
  • 整体的思路是利用链表来存储学生信息,通过不同的功能选项来对链表中的学生信息进行不同的操作。

 代码如下:

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;
}

总结:

在使用链表的过程中,我认为最重要的是要理解指针的作用。它是内存地址的直接引用。在链表中,通过指针来实现节点之间的连接,使得链表能够进行插入、删除和遍历等操作。理解指针的概念和使用,才能够更好地掌握链表的操作和原理。

下面打算出一章或者一期关于指针的知识。

以上均是个人的理解,如果有不对的地方请各位大佬帮忙斧正!!

分享一句很喜欢的一句话:

在这短短的一生,我们最终都会失去,你不妨大胆一些。爱一个人,攀一座山,追一个梦。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这是一道经典的位运算题目,考察对二进制的理解和位运算的熟练程度。 题目描述: 给定一个长度为 $n$ 的数组 $a$,初始时每个数的值都为 $0$。现在有 $m$ 个操作,每个操作为一次询问或修改。 对于询问,给出两个整数 $l,r$,求 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 的值。 对于修改,给出一个整数 $x$,表示将 $a_x$ 的值加 $1$。 输入格式: 第一行两个整数 $n,m$。 接下来 $m$ 行,每行描述一次操作,格式如下: 1 l r:表示询问区间 $[l,r]$ 的异或和。 2 x:表示将 $a_x$ 的值加 $1$。 输出格式: 对于每个询问操作,输出一个整数表示答案,每个答案占一行。 数据范围: $1 \leq n,m \leq 10^5$,$0 \leq a_i \leq 2^{30}$,$1 \leq l \leq r \leq n$,$1 \leq x \leq n$ 输入样例: 5 5 2 1 2 3 1 2 4 2 2 1 1 5 输出样例: 0 2 解题思路: 对于询问操作,可以利用异或的性质,即 $a \oplus b \oplus a = b$,将 $a_l \oplus a_{l+1} \oplus \cdots \oplus a_r$ 转化为 $(a_1 \oplus \cdots \oplus a_{l-1}) \oplus (a_1 \oplus \cdots \oplus a_r)$,因为两个前缀异或后的结果可以相互抵消,最后的结果即为 $a_1 \oplus \cdots \oplus a_{l-1} \oplus a_1 \oplus \cdots \oplus a_r = a_l \oplus \cdots \oplus a_r$。 对于修改操作,可以将 $a_x$ 对应的二进制数的每一位都分离出来,然后对应位置进行修改即可。由于只有加 $1$ 操作,所以只需将最后一位加 $1$ 即可,其余位不变。 参考代码:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊没烦恼~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值