数据结构小项目

单链表或者双链表完成学生管理系统。

1、使用fscanf和fprintf实现登录注册界面,登录成功显示学生管理系统菜单界面。

2、学生信息结构体(学号,姓名,年龄)

3、界面功能包含:录入学生信息,输出学生信息,任意位置删除学生信息,任意位置插入学生信息,任意位置修改学生信息,任意位置查找学生信息,表头插入一个学生,表尾插入一个学生信息,按照姓名查找学生并删除,按照年龄查找学生并修改其学号为10086。

4、可以使用单链表或者双链表完成,所有功能都需要人为输入,不能写死参数。

menu.c

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

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

c 复制代码
#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
相关推荐
波音彬要多做39 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Noah_aa1 小时前
代码随想录算法训练营第五十六天 | 图 | 拓扑排序(BFS)
数据结构
KpLn_HJL1 小时前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
AC使者7 小时前
5820 丰富的周日生活
数据结构·算法
无 证明8 小时前
new 分配空间;引用
数据结构·c++
别NULL12 小时前
机试题——疯长的草
数据结构·c++·算法
ZSYP-S13 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
唐叔在学习14 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA14 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
武昌库里写JAVA17 小时前
浅谈怎样系统的准备前端面试
数据结构·vue.js·spring boot·算法·课程设计