数据结构小项目
单链表或者双链表完成学生管理系统。
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