当前位置: 首页 > article >正文

数据结构小项目

单链表或者双链表完成学生管理系统。
1、使用fscanf和fprintf实现登录注册界面,登录成功显示学生管理系统菜单界面。
2、学生信息结构体(学号,姓名,年龄)
3、界面功能包含:录入学生信息,输出学生信息,任意位置删除学生信息,任意位置插入学生信息,任意位置修改学生信息,任意位置查找学生信息,表头插入一个学生,表尾插入一个学生信息,按照姓名查找学生并删除,按照年龄查找学生并修改其学号为10086。
4、可以使用单链表或者双链表完成,所有功能都需要人为输入,不能写死参数。
menu.c

#include "log.h"
int main(int argc, const char *argv[])
{
	int ch;
#if 1
	while(1)
	{
		printf("1.注册\n");
		printf("2.登录\n");
		printf("3.退出\n");
		printf("请输入你的选择:");
		scanf("%d",&ch);
		getchar();
		switch(ch)
		{
			case 1:
				regist();
			break;
			case 2:
			{
				int flag=login();
				if(flag==1)
					menu();
				break;
			}
			case 3:
				exit(0);
				break;
		
		}
	}
#endif
	return 0;
}

log.c

#include "log.h"
void regist()
{
	char name[20];
	printf("请输入账号:");
	fgets(name,sizeof(name),stdin);
	char pwd[20];
	printf("请输入密码:");
	fgets(pwd,sizeof(pwd),stdin);
	printf("账号:%s",name);
	printf("密码:%s",pwd);
	FILE *fp=fopen("./up.txt","a");
	if(fp==NULL)
	{
		perror("fopen");
		return;
	}
	fputs(name,fp);//账号放入文件
	fputs(pwd,fp);//密码放入文件
	
	fclose(fp);

}
int login()
{
	int flag=-1;
	char name[20];
	printf("登录账号:");
	fgets(name,sizeof(name),stdin);
	char pwd[20];
	printf("登录密码:");
	fgets(pwd,sizeof(pwd),stdin);
	printf("登录账号:%s",name);
	printf("登录密码:%s",pwd);
	FILE *fp=fopen("./up.txt","r");
	if(fp==NULL)
	{
		perror("fopen");
		return -1;
	}
	char dname[20];
	char dpwd[20];
	while(1)
	{
		char *r=fgets(dname,sizeof(dname),fp);
		if(r==NULL)
		{
			break;	
		}
		fgets(dpwd,sizeof(dpwd),fp);
		if(strcmp(dname,name)==0&&strcmp(dpwd,pwd)==0)
		{
			
			flag=1;	
			break;
		}
		else
		{
			flag=0;
		}
	}
	if(flag==0)
	{
		printf("登录失败\n");
	}
	else if(flag==1)
	{
		printf("登录成功\n");
	}
	fclose(fp);
	return flag;
}
void menu()
{
	int ch;
	Link *L=create();
	while(1)
	{
		printf("*************************\n");
		printf("1.录入学生信息\n");
		printf("2.输出学生信息\n");
		printf("3.任意位置插入学生信息\n");
		printf("4.任意位置删除学生信息\n");
		printf("5.任意位置查找学生信息\n");
		printf("6.任意位置修改学生信息\n");
		printf("7.表头位置插入学生信息\n");
		printf("8.表尾位置插入学生信息\n");
		printf("9.按照姓名查找学生并删除\n");
		printf("10.按照年龄查找学生并修改学号为10086\n");
		printf("请输入你的选择:");
		scanf("%d",&ch);
		switch(ch)
		{
			case 1:
				luru(L);
				break;
			case 2:
				shuchu(L);
				break;
			case 3:
				anyposinsert(L);
				break;
			case 4:
				anyposdel(L);
				break;
			case 5:
				anyposfind(L);
				break;
			case 6:
				anyposupdate(L);
				break;
			case 7:
				headinsert(L);
				break;
			case 8:
				rearinsert(L);
				break;
			case 9:
				findbynamedel(L);
				break;
			case 10:
				findbyage10086(L);
				break;
		}
		
	}

}
Link* apply()
{
	Link *L=malloc(sizeof(Link));
	if(L==NULL)
	{
		perror("申请失败");
		return NULL;
	}
	return L;
}
Link* create()
{
	Link *head=apply();
	if(head==NULL)
	{
		perror("创建头节点失败");
		return NULL;
	}
	head->len=0;
	head->next=NULL;
	return head;
}
void luru(Link *L)
{
	printf("请输入要录入的学生个数:");
	int num;
	scanf("%d",&num);
	int i;
	for(i=0;i<num;i++)
	{
		Link *p=apply();
		printf("请输入第%d个学生信息:",i+1);
		stu e;
		scanf("%d %s %d",&e.id,e.name,&e.age);
		p->data=e;
		p->next=L->next;
		L->next=p;
		L->len++;
		
		
	}
}
void shuchu(Link *L)
{
	int i;
	Link *p=L->next;
	if(L->len==0)
	{
		printf("没有学生呢,无法输出\n");
		return;
	}
	for(i=0;i<L->len;i++)
	{
		stu e=p->data;
		printf("第%d个学生:%d,%s,%d\n",i+1,e.id,e.name,e.age);
		p=p->next;
	}
}
void anyposinsert(Link *L)
{
	int pos;
	printf("请输入学生信息:");
	stu e;
	scanf("%d %s %d",&e.id,e.name,&e.age);
	printf("请输入要插入的位置:");
	scanf("%d",&pos);
	if(pos<1||pos>L->len+1)
	{
		printf("插入失败\n");
		return;
	}
	Link* p=L;
	int i;
	for(i=0;i<pos-1;i++)
	{
		p=p->next;//指向要插入位置的前驱
	}
	Link* p2=apply();
	p2->data=e;
	p2->next=p->next;
	p->next=p2;
	L->len++;
}
void anyposdel(Link *L)
{
	if(L->len==0)
	{
		printf("没有学生呢,无法删除\n");
		return;
	}
	printf("请输入要删除的学生位置:");
	int pos;
	scanf("%d",&pos);
	if(pos<1||pos>L->len||L->len==0)
	{
		printf("删除失败\n");
		return;
	}
	int i;
	Link* p=L;
	for(i=0;i<pos-1;i++)
	{
		p=p->next;//指向要删除位置的前驱
	}
	Link *Q=p->next;
	p->next=p->next->next;
	free(Q);
	L->len--;


}
Link* anyposfind(Link *L)
{
	if(L->len==0)
	{
		printf("没有学生呢,无法查找\n");
		return NULL;
	}
	printf("请输入要查找的学生位置:");
	int pos;
	scanf("%d",&pos);
	if(pos<1||pos>L->len)
	{
		printf("查找失败\n");
		return NULL;
	}
	int i;
	Link *p=L;
	for(i=0;i<pos;i++)
	{
		p=p->next;
	}
	printf("查找到的学生信息:%d,%s,%d\n",p->data.id,p->data.name,p->data.age);
	return p;

}
void anyposupdate(Link *L)
{
	Link *p=anyposfind(L);
	printf("请输入要修改的学生信息:");
	stu e;
	scanf("%d %s %d",&e.id,e.name,&e.age);
	p->data=e;
}
void headinsert(Link *L)
{
	Link *p=apply();
	printf("请输入要插入表头位置的学生信息:");
	stu e;
	scanf("%d %s %d",&e.id,e.name,&e.age);
	p->data=e;
	p->next=L->next;
	L->next=p;
	L->len++;
}
void rearinsert(Link *L)
{
	Link *p=apply();
	printf("请输入要插入表尾位置的学生信息:");
	stu e;
	scanf("%d %s %d",&e.id,e.name,&e.age);
	p->data=e;
	p->next=NULL;
	int i;
	Link *fp=L;
	for(i=0;i<L->len;i++)
	{
		fp=fp->next;
	}
	fp->next=p;
	L->len++;
}
void findbynamedel(Link *L)
{
	if(L->len==0)
	{
		printf("没有学生呢,无法查找\n");
		return;
	}
	char name[20];
	printf("请输入要查号的学生姓名:");
	scanf("%s",name);
	Link *p=L;
	int i;
	int flag=-1;
	for(i=0;i<L->len;i++)
	{
		p=p->next;
		if(strcmp(p->data.name,name)==0)
		{
			flag=1;
			break;
		}
	}
	if(flag==-1)
	{
		printf("没有查找到\n");
	}
	else
	{
		anyposdel2(L,i+1);	
	}


}
void anyposdel2(Link *L,int pos)
{
	if(pos<1||pos>L->len||L->len==0)
	{
		printf("删除失败\n");
		return;
	}
	int i;
	Link* p=L;
	for(i=0;i<pos-1;i++)
	{
		p=p->next;//指向要删除位置的前驱
	}
	Link *Q=p->next;
	p->next=p->next->next;
	free(Q);
	L->len--;


}
void findbyage10086(Link *L)
{
	if(L->len==0)
	{
		printf("没有学生呢,无法查找\n");
		return;
	}
	printf("请输入年龄:");
	int age;
	scanf("%d",&age);
	int i,flag=-1;
	Link *p=L;
	for(i=0;i<L->len;i++)
	{
		p=p->next;
		if(p->data.age==age)
		{
			flag=1;
			p->data.id=10086;
			break;
		}
	}
	if(flag==-1)
	{
		printf("没有查找到\n");
	}
	else
	{
		printf("修改成功\n");
	}
	
}

log.h

#ifndef _LOG_H
#define _LOG_H
#include <myhead.h>
typedef struct
{
	int id;
	char name[20];
	int age;
}stu;
typedef struct node
{
	union
	{
		int len;
		stu data;
	};
	struct node*next;
}Link;
void regist();
int login();
void menu();
void luru(Link *);
void shuchu(Link *);
void anyposinsert(Link *);
void anyposdel(Link*);
Link* apply();
Link* create();
Link* anyposfind(Link*);
void anyposupdate(Link*);
void headinsert(Link *);
void rearinsert(Link *);
void anyposdel2(Link *,int);
void findbynamedel(Link *);
void findbyage10086(Link *);
#endif


http://www.kler.cn/a/393012.html

相关文章:

  • 前端框架大比拼:React.js, Vue.js 及 Angular 的优势与适用场景探讨
  • 使用Docker快速部署FastAPI Web应用
  • 密码学的基本原理
  • Android OpenGL ES详解——立方体贴图
  • 【QT】QSS
  • 【C++】C++11特性(上)
  • 数据结构---详解栈
  • 「QT」几何数据类 之 QSize 尺寸类
  • 比ChatGPT更酷的AI工具
  • NVT新能德科技入职测评SHL题库更新:数字推理+演绎推理高分答案、真题解析
  • Pycharm PyQt5 环境搭建创建第一个Hello程序
  • AndroidStudio-滚动视图ScrollView
  • 光驱验证 MD5 校验和
  • Docker解决暴露2375端口引发的安全漏洞
  • 11.12 机器学习-特征工程
  • 工作和学习遇到的技术问题
  • OBOO鸥柏:旗下户外景区自助触摸查询一体机已布局智慧城市便民
  • 汇编分析C++class
  • 【征稿倒计时!华南理工大学主办 | IEEE出版 | EI检索稳定】2024智能机器人与自动控制国际学术会议 (IRAC 2024)
  • LabVIEW大数据处理
  • 网络学习第四篇
  • matlab建模入门指导
  • 【C++】用红黑树封装set和map
  • 【C语言刷力扣】58.最后一个单词的长度
  • 机器学习小补充(加深理解)
  • Matplotlib库中show()函数的用法