单链表实现学生管理系统(参照顺序表技能)写出菜单界面switch选择
1、创建单链表,
2、录入学生信息,
3、删除一个学生信息,
4、按照成绩修改一个学生的年龄,
5、按照姓名顺序查找一个学生是否存在。
要求:
1、学生信息结构体姓名,分数,年龄,电话。
2、其他功能函数自定义,分文件编译。
#include<myhead.h>
#define MAX 20
typedef struct
{
char name[20];
int score;
int age;
long telephone;
}stu;
typedef struct node
{
union
{
stu data;
int len;
};
struct node *next;
}Link,*Plink;
int empty(Plink L)
{
if(L==NULL)
{
return 1;
}
return 0;
}
Plink get_head()//申请头结点函数
{
Plink p = malloc(sizeof(Link));//申请结构体大小空间
if(p==NULL)
{
printf("申请头结点失败\n");
return NULL;
}
p->len=0;//数据域赋值
p->next = NULL;//指针域赋值(只有一个头结点)
return p;
}
int head_insert(Plink L)//头插法创建单链表
{
char inputname[20];
int inputscore,inputage;
long inputtelephone;
if(L==NULL)
{
printf("单链表不存在\n");
return -1;
}
Plink p = malloc(sizeof(Link));//申请结构体大小空间
printf("请输入姓名:");
scanf("%s",inputname);
strcpy(p->data.name,inputname);//新节点数据域赋值
printf("请输入成绩:");
scanf("%d",&inputscore);
p->data.score = inputscore;
printf("请输入年龄:");
scanf("%d",&inputage);
p->data.age = inputage;
printf("请输入电话:");
scanf("%ld",&inputtelephone);
p->data.telephone = inputtelephone;
//将第1个节点的地址放入新节点指针域
p->next = L->next;
//将新节点地址放入头结点指针域
L->next = p;
L->len++;//长度加1
}
int node_output(Plink L)//输出单链表
{
if(L==NULL||L->len==0)
{
printf("单链表不存在或者为空\n");
return -1;
}
int i;
Plink t = L;//指向头结点
for(i = 0;i<L->len;i++)
{
t = t->next;
printf("%s %d %d %ld",t->data.name,t->data.score,t->data.age,t->data.telephone);
printf("\n");
}
}
int dele_any_pos(Plink L)//任意位置删除
{
if(empty(L)||L->len==0)
{
printf("单链表不存在或者为空\n");
return -1;
}
int i,pos;
printf("请输入要删除的位置:");
scanf("%d",&pos);
Plink t =L;
for(i =0;i<pos-1;i++)//移动pos-1次指向待删除节点的前驱
{
t =t->next;
}
Plink Q = t->next;//保留要删除的节点
t->next = t->next->next;//删除
L->len--;
free(Q);
Q=NULL;
return 0;
}
int score_find_change(Plink L)
{
if(empty(L)||L->len==0)
{
printf("单链表不存在或者为空\n");
return -1;
}
Plink t = L;
int i,e,key,pos=-1;
printf("请输入要被修改的同学的成绩:");
scanf("%d",&key);
for(i = 0;i<L->len;i++)
{
t = t->next;
if(key==t->data.score)
{
pos=i+1;//保留节点位置
printf("查找成功,请输入要修改的年龄:");
scanf("%d",&e);
t->data.age = e;//修改
break;
}
}
if(pos==-1)
{
printf("不存在该节点值\n");
return -1;
}
return 0;
}
//按照姓名顺序查找一个学生是否存在
int name_find(Plink L)
{
if(empty(L)||L->len==0)
{
printf("单链表不存在或者为空\n");
return -1;
}
Plink t = L;
int i,pos=-1;
char find_name[20];
printf("请输入要查找的姓名:");
scanf("%s",find_name);
for(i = 0;i<L->len;i++)
{
t = t->next;
if(strcmp(find_name,t->data.name)==0)
{
pos=i+1;//保留节点位置
printf("查找成功,这个同学存在\n");
break;
}
}
if(pos==-1)
{
printf("不存在该节点值\n");
return -1;
}
return 0;
}
void caidan(void)
{
printf("\n");
printf("*******************\n");
printf("0、退出\n");
printf("2、录入学生信息\n");
printf("3、删除一个学生信息\n");
printf("4、按照成绩修改一个学生的年龄\n");
printf("5、按照姓名顺序查找一个学生是否存在\n");
printf("*****************\n");
printf("\n");
}
int main(int argc, char const *argv[])
{
int bianhao;
Plink L = get_head();
while(1)
{
caidan();
printf("请输入你要执行的功能:");
scanf("%d",&bianhao);
switch (bianhao)
{
case 0:exit(0);
case 2:
{
head_insert(L);
node_output(L);
}
break;
case 3:
{
dele_any_pos(L);
node_output(L);
}
break;
case 4:
{
score_find_change(L);
node_output(L);
}
break;
case 5:
{
name_find(L);
node_output(L);
}
break;
default:printf("你输入的内容有误");
break;
}
}
return 0;
}