学生管理系统
1. 创建学生信息链表 返回地址
2. 学生信息独立空间创建(结构体) 返回地址
3. 学生信息独立空间封装 需要学生信息空间(2)地址 返回地址
4. 创建增添函数 将封装好的空间跟头文件相连
5. 输出链表
6. 根据姓名查找 (能直接修改,删除,注意一查多结果)
7. 根据分数查找 (同上)
8. 根据学号查找 (同上)
#ifndef __1_H__
#define __1_H__
typedef struct Stu
{
int num;
char name[10];
double score;
}Stu,*Studata;
typedef struct Node
{
union
{
int len;
Studata data;//定义指针数组存放指针指向学生
};
struct Node *prio;
struct Node *next;
}Node,*double_list;
//创建学生信息链表
double_list stu_list_create();
//创建学生信息存放空间
Studata stu_create();
//学生信息封装函数
double_list make_node(Studata p);
//判空
int list_empty(double_list p);
//学生信息链表录入信息(尾插)
void stu_list_tail_insert(double_list p,double_list new_stu);
//学生信息展示
void stu_list_out(double_list p);
//学号 姓名 分数 查找
void list_search_num(double_list p);
void list_search_name(double_list p);
void list_search_score(double_list p);
#endif
//***************************************************************************************
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include"1.h"
double_list stu_list_create() // 返回头文件地址
{
double_list p=(double_list)malloc(sizeof(Node));
if(p==NULL)
{
printf("学生信息链表创建失败");
return 0;
}
p->len=0;
p->next=p;
p->prio=p;
printf("学生信息链表创建成功\n");
return p;
}
Studata stu_create() //返回值为stu_pos
{
Studata p=(Studata)malloc(sizeof(Stu));
if(p==NULL)
{
printf("学生信息空间创建失败\n");
return 0;
}
printf("学生信息空间创建成功\n");
printf("请输入学生学号:");
int a;
scanf("%d",&a);
printf("请输入学生姓名:");
char b[10]="";
scanf("%s",b);
printf("请输入学生成绩:");
double c;
scanf("%lf",&c);
p->num=a;
strcpy(p->name,b);
p->score=c;
printf("学生信息录入成功\n");
return p;
}
double_list make_node(Studata p) // 收到值为 stu_pos 返回值为new_stu
{
double_list p1=(double_list)malloc(sizeof(Node));
if(p1==NULL)
{
printf("学生信息封装失败\n");
return 0;
}
p1->data=p;
p1->next=p1;
p1->prio=p1;
printf("学生信息封装成功\n");
return p1;
}
int list_empty(double_list p)//收到值为头文件地址
{
return p->next==p?1:0;
}
void stu_list_tail_insert(double_list p,double_list new_stu)//收到值为头文件地址 和学生封装地址new_stu
{
if(p==NULL||new_stu==NULL)
{
printf("地址不合法\n");
return;
}
if(list_empty(p))
{
new_stu->next=p;
new_stu->prio=p;
p->next=new_stu;
p->prio=new_stu;
p->len++;
printf("放入链表成功\n");
return;
}
double_list p1=p->next;
while(p1->next!=p)
{
p1=p1->next;
}
new_stu->prio=p1;
new_stu->next=p;
p1->next=new_stu;
p->prio=new_stu;
p->len++;
printf("放入链表成功\n");
return;
}
void stu_list_out(double_list p)// 收到值为头文件地址
{
if(list_empty(p))
{
printf("没有存放任何数据\n");
return;
}
printf("学号\t姓名\t\t成绩\n");
double_list p1=p->next;
while(p1!=p)
{
printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
p1=p1->next;
}
}
void list_search_num(double_list p)
{
if(p==NULL||list_empty(p))
{
printf("链表不合法,无法查找\n");
return ;
}
int num;
printf("请输入需要查找的学号:\n");
scanf("%d",&num);
double_list p1=p->next;
int count=0;
while(p1!=p)
{
if(num==p1->data->num)
{
count++;
printf("存在该学生\n");
printf("学号\t姓名\t\t分数\n");
double_list J;
printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
printf("选择对该学生信息的操作\n");
printf("\t1.删除\t\t2.修改\n");
printf("\t3.不操作\n");
int a=0;
scanf("%d",&a);
if(a==1)
{
J=p1->prio;
p1->next->prio=p1->prio;
p1->prio->next=p1->next;
p1->next=p1;
p1->prio=p1;
p->len--;
p1=J;
printf("删除成功\n");
goto LOOP;
// p1=p1->next;
// continue;
}
else if(a==2)
{
int A;
printf("请输入修改后的学生学号:");
scanf("%d",&A);
putchar(10);
p1->data->num=A;
char B[10]="";
printf("请输入修改后的学生姓名:");
gets(B);
putchar(10);
strcpy(p->data->name,B);
double C;
printf("请输入修改后的学生成绩:");
scanf("%lf",&C);
putchar(10);
p1->data->score=C;
printf("修改成功\n");
// p1=p1->next;
// continue;
goto LOOP;
}
}
LOOP:
p1=p1->next;
}
if(count==0)
{
printf("不存在\n");
}
return;
}
void list_search_name(double_list p)
{
if(p==NULL||list_empty(p))
{
printf("链表不合法,无法查找\n");
return ;
}
char N[10];
printf("请输入需要查找的姓名:\n");
scanf("%s",N);
double_list p1=p->next;
int count=0;
while(p1!=p)
{
if(strcmp(N,p1->data->name)==0)
{
count++;
printf("存在该学生\n");
printf("学号\t姓名\t\t分数\n");
double_list J=p1->prio;
printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
printf("选择对该学生信息的操作\n");
printf("\t1.删除\t\t2.修改\n");
printf("\t3.不操作\n");
int a;
scanf("%d",&a);
if(a==1)
{
p1->next->prio=p1->prio;
p1->prio->next=p1->next;
p1->next=p1;
p1->prio=p1;
p->len--;
p1=J;
printf("删除成功\n");
}
if(a==2)
{
int A;
printf("请输入修改后的学生学号:");
scanf("%d",&A);
putchar(10);
p1->data->num=A;
char B[10]="";
printf("请输入修改后的学生姓名:");
gets(B);
putchar(10);
strcpy(p->data->name,B);
double C;
printf("请输入修改后的学生成绩:");
scanf("%lf",&C);
putchar(10);
p1->data->score=C;
printf("修改成功\n");
}
p1=p1->next;
continue;
}
p1=p1->next;
}
if(count==0)
{
printf("不存在\n");
}
return;
}
void list_search_score(double_list p)
{
if(p==NULL||list_empty(p))
{
printf("链表不合法,无法查找\n");
return ;
}
double S;
printf("请输入需要查找的分数:\n");
scanf("%lf",&S);
double_list p1=p->next;
int count=0;
while(p1!=p)
{
if(S==p1->data->score)
{
count++;
printf("存在该学生\n");
printf("学号\t姓名\t\t分数\n");
double_list J=p1->prio;
printf("%d\t%s\t\t%.2lf\n",p1->data->num,p1->data->name,p1->data->score);
printf("选择对该学生信息的操作\n");
printf("\t1.删除\t\t2.修改\n");
printf("\t3.不操作\n");
int a;
scanf("%d",&a);
if(a==1)
{
p1->next->prio=p1->prio;
p1->prio->next=p1->next;
p1->next=p1;
p1->prio=p1;
p->len--;
p1=J;
printf("删除成功\n");
}
if(a==2)
{
int A;
printf("请输入修改后的学生学号:");
scanf("%d",&A);
putchar(10);
p1->data->num=A;
char B[10]="";
printf("请输入修改后的学生姓名:");
gets(B);
putchar(10);
strcpy(p->data->name,B);
double C;
printf("请输入修改后的学生成绩:");
scanf("%lf",&C);
putchar(10);
p1->data->score=C;
printf("修改成功\n");
}
p1=p1->next;
continue;
}
p1=p1->next;
}
if(count==0)
{
printf("不存在\n");
}
return;
}
//***************************************************************************************
#include <stdio.h>
#include<stdlib.h>
#include"1.h"
int main(int argc, const char *argv[])
{
double_list p;//头文件
Studata stu_pos;
double_list new_stu=NULL;
while(1)
{
printf("\t\t****功能菜单****\n");
printf("1.录入学生信息\t\t\t2.学生信息输出\n");
printf("3.按学号查找\t\t\t4.按姓名查找\n");
printf("5.按分数查找\t\t\t6.结束运行\n");
printf("请选择功能:");
int choose;
scanf("%d",&choose);
switch(choose)
{
case 1:
p=stu_list_create();
printf("学生总数:");
int m;
scanf("%d",&m);
putchar(10);
for(int i=1;i<=m;i++)
{
stu_pos=stu_create();
new_stu=make_node(stu_pos);
stu_list_tail_insert(p,new_stu);
}
break;
case 2:
stu_list_out(p);
break;
case 3:
list_search_num(p);
break;
case 4:
list_search_name(p);
break;
case 5:
list_search_score(p);
break;
case 6:
return 0;
}
}
return 0;
}