数据结构-链表的简实现->学生管理系统

这是一个简单的C语言学生管理系统,包括增删改查等功能,并实现了文件读写。程序通过链表存储学生信息,支持按学号搜索及修改学生资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 C++第一节课,老师给我们留了个作业,用C语言实现学生管系统。

要求实现:增删改查(包含文件操作)

本学渣就腆着脸发出来了。简单小程序。C语言初学的一点小应用

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define F_PATH "D:\\a\\info.dat"


typedef struct st_info {
	char number[10];
	int sex;
	char name[20];
	char native_place[10];
	int birth[3];
	struct st_info *next;
}info;

typedef info *point;


void menu0();
void menu1();
void wr(point head);
point create(void);
point find(point head, point comp);
point del(point head);
void addition(point head);
void modify(point head);
void search(point head);


int main(void)
{
	int i;
	point head;
	head = NULL;
	menu0();
	head=create();
	menu1();
	scanf("%d", &i);
		while (i==1||i==2||i==3||i==4||i==5)
		{
			if (i == 1) addition(head);
			if (i == 2) head = del(head);
			if (i == 3) modify(head);
			if (i == 4) search(head);
			if (i == 5) wr(head);
			printf("如还需完成其他操作,\n请再次输入数字,否则请直接输入数字5退出\n");
			scanf("%d", &i);
		}
	return 0;
}

void menu0(void)
{
	printf("********************************************\n");
	printf("***********欢迎使用学生管理系统*************\n");
	printf("***********以下是系统的使用菜单*************\n");
	printf("**********正在载入已储存学生信息************\n");
}

void menu1(void) 
{
	printf("*------------*-*-*-****-*-*-*--------------*\n");
	printf("**************1.增加学生信息****************\n");
	printf("**************2.删除学生信息****************\n");
	printf("**************3.修改学生信息****************\n");
	printf("**************4.查找学生信息****************\n");
	printf("*************5.储存修改并退出***************\n");
	printf("********请按照你的需求输入相应的数字********\n");
	printf("*********如果有过信息修改请一定保存*********\n");
	printf("********************************************\n");

};

point create(void)//初始化读取文件信息函数
{
	FILE *fp;
	int flag, i;
	point cr, use,head;
	head = NULL;
	use = NULL;
	flag = 1;
	fp = fopen(F_PATH, "ab+");
	while(1)
	{
	cr = (info*)malloc(sizeof(info));
	cr->next = NULL;
	fscanf(fp, "%s", cr->name);
	fseek(fp, 1L, SEEK_CUR);
	fscanf(fp, "%d", &cr->sex);
	fseek(fp, 1L, SEEK_CUR);
	fscanf(fp, "%s", cr->native_place);
	fseek(fp, 1L, SEEK_CUR);
	for (i = 1; i <= 3; i++)   fscanf(fp, "%d", &cr->birth[i - 1]);
	fscanf(fp, "%s", cr->number);
	if(flag==1) {
		head = cr;
		use=cr;}
	else
		{
			use->next=cr;
			use=use->next;
		}
	flag++;
	if (feof(fp)) break;
	}

	fclose(fp);
	return head;
}

void wr(point head)//信息再次储存函数 
{
	point c;
	FILE *fp;
	int flag = 0;
	c = head;
	fp = fopen(F_PATH, "w");
	while (head)
	{
		fprintf(fp, "%s %d %s %d %d %d", head->name, head->sex, head->native_place, head->birth[0], head->birth[1], head->birth[2]);
	
		if(head->next) fputc('\n', fp);
		head = head->next;
		free(c);
		c = head;
	}
}

void addition(point head)//增加函数
{
	point b;
	b = (info*)malloc(sizeof(info));
	b->next = head->next;
	head->next = b;
	printf("请输入要插入学生的姓名\n");
	{
		scanf("%s", b->name);
	}
	
	printf("请输入要插入学生的性别(男1女0)\n");
	{
		scanf("%d", &b->sex);
	}
	printf("请输入要插入学生的籍贯\n");
	{
		scanf("%s", b->native_place);
	}
	printf("请按格式(XXXX-X-X)\n");
	{
		scanf("%d-%d-%d", &b->birth[0], &b->birth[1], &b->birth[2]);
	}
	printf("输入要插入的学生学号\n");
	{
		scanf("%s", b->number);

	}
	printf("谢谢使用,学生信息已录入\n");
}

point find(point head,point comp)  //查找核心功能
{
	printf("请输入学生的学号");
	char re[10];
	int a;
	point s;
	s = head;
	scanf("%s", re);
	a = 0;
	while (s)
	{
		if (!strcmp(re, s->number)) {
			comp = s;
			break;
		}
		s = s->next;
	}
	return comp;
} 

void search(point head)//查找函数
{
	point s;
	int i;
	s = NULL;
	s = find(head,s);
	if (s!=NULL) {
		printf("查得该学生,是否需要查看该学生信息,需要请输入1,不需要请输入0\n");
		scanf("%d", &i);
		if (i == 0) {
			printf("该学生的姓名为%s\n", s->name);
			if (s->sex)	printf("该人为男\n");
			else printf("性别为女\n");
			printf("籍贯为%s\n", s->native_place);
			printf("生日为%d年%d月%d日\n", s->birth[0], s->birth[1], s->birth[2]);
		}
	}
	else
		{
			printf("查无此人,也可能是学号输入错误,如有疑问可以再次查询") ;
		}
}

point del(point head)// 删除函数
{
	printf("请输入要删除的学号");
	char re[10];
	int a;
	point s,q;
	s = q = head;
	scanf("%s", re);
	a = 0;
	if (!strcmp(re, s->number)) 
	{
		head = head->next;
		return head;
	}
	else
	{
		s = s->next;
	}
	while (s)
	{
		if (!strcmp(re, s->number)) 
		{
			a = 1;
			break;
		}
		q = s;
		s = s->next;
	}	
	if (a) 
	{
		q->next = s->next;
		free(s);
	}
	if (a==0)
	{
		printf("在查找的过程中别没有查找到这个人,请尝试重新操作,也有可能是该学生信息已经被删除\n");
	}
	return head;
}

void modify(point head)//修改函数
{
	printf("请输入想要修改的学生现在最后一次储存的学号");
	point comp;
	comp = NULL;
	comp = find(head,comp);
	if (comp!=NULL) {
		printf("请输入你想要修改的学生的信息选项:\n*1.修改学号*\n*2.修改姓名*\n*3.修改籍贯*\n*4.修改生日*\n*(PS:由于法律,性别暂无法修改)*");
		int a;
		scanf("%d", &a);
		if (a == 1) {
			char m[10];
			printf("请输入学号\n"); 
			scanf("%s", m);
			memset(comp->number, 0, 10 * sizeof(char));
			comp->number[0] = '\0';
			strcpy(comp->number, m);
		}
		else if (a==2)
		{
			char m[20];
			printf("请输入姓名\n");
			scanf("%s", m);
			memset(comp->name, 0, 20 * sizeof(char));
			comp->name[0] = '\0';
			strcpy(comp->name, m);
		}
		else if (a==3)
		{
			char m[20];
			printf("请输入籍贯\n");
			scanf("%s", m);
			memset(comp->native_place, 0, 20 * sizeof(char));
			comp->native_place[0] = '\n';
			strcpy(comp->native_place, m);
		}
		else if (a==4)
		{
			int m;
			printf("请输入性别,男请输入1,女输入2\n");
			scanf("%d", &m);
			comp->sex = m;
		}
		else
		{
			printf("您输入有误,如有需要,请重试\n");
		}
	}
	else
	{
		printf("对不起,你输入的学号信息有误,请重试\n");
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值