数据结构小项目

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

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
相关推荐
workflower6 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
一个不喜欢and不会代码的码农6 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
No0d1es8 小时前
2024年9月青少年软件编程(C语言/C++)等级考试试卷(九级)
c语言·数据结构·c++·算法·青少年编程·电子学会
bingw01148 小时前
华为机试HJ42 学英语
数据结构·算法·华为
木辛木辛子10 小时前
L2-2 十二进制字符串转换成十进制整数
c语言·开发语言·数据结构·c++·算法
誓约酱10 小时前
(动画版)排序算法 -希尔排序
数据结构·c++·算法·排序算法
誓约酱11 小时前
(动画版)排序算法 -选择排序
数据结构·算法·排序算法
可别是个可爱鬼12 小时前
代码随想录 -- 动态规划 -- 完全平方数
数据结构·python·算法·leetcode·动态规划
三小尛12 小时前
选择排序(C语言)
数据结构