student.h(库函数)
代码块
#ifndef __STUDENT_H__
#define __STUDENT_H__
typedef struct //定义学生信息结构体
{
int id; //学号
char name[10]; //姓名
int score; //成绩
}datatype;
typedef struct Node //定义单向链表结构体
{
union
{
datatype data; //学生信息
int len; //学生人数
};
struct Node *next; //指针域
}linklist;
//主目录
void menu();
//输入目录
void insert_menu();
//删除目录
void del_menu();
//修改目录
void update_menu();
//查询目录
void find_menu();
//排序目录
void sort_menu();
//创建
linklist* create();
//判空
int empty(linklist *L);
//申请结点
linklist* apply(linklist *L, datatype e);
//尾插
int insert_tail(linklist *L, datatype e);
//任意插入
int insert(linklist *L, int pos, datatype e);
//遍历
void show(linklist *L);
//按学号查找
linklist *find_id(linklist *L, int e);
//按姓名查找
linklist *find_name(linklist *L, char *s);
//按位置查找
linklist *find_pos(linklist *L, int pos);
//头删
int del_head(linklist *L);
//按学号删除
int del_id(linklist *L, int e);
//按姓名删除
int del_name(linklist *L, char *s);
//按位置删除
int del_pos(linklist *L, int pos);
//按学号修改
int update_id(linklist *L, int i, datatype e);
//按姓名修改
int update_name(linklist *L, char *s, datatype e);
//按成绩排序
void sort_score(linklist *Li, int flag);
//按学号排序
void sort_id(linklist *L, int flag);
//释放链表
void destroy(linklist *L);
#endif
student.c(封装函数)
代码块
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"
//主目录
void menu()
{
printf("\n");
printf("======学生管理系统======\n");
printf("\t1、学生信息输入\n");
printf("\t2、学生信息删除\n");
printf("\t3、学生信息修改\n");
printf("\t4、学生信息查询\n");
printf("\t5、学生信息排序\n");
printf("\t6、学生信息输出\n");
printf("\t0、退出\n");
printf("请输入序号:");
}
//输入目录
void insert_menu()
{
printf("\n");
printf("=====输入目录=====\n");
printf("\t1、多个输入\n");
printf("\t2、单个插入\n");
printf("\t3、学生信息输出\n");
printf("\t0、返回主目录\n");
printf("请输入序号:");
}
//删除目录
void del_menu()
{
printf("\n");
printf("=====删除目录=====\n");
printf("\t1、按学号删除\n");
printf("\t2、按姓名删除\n");
printf("\t3、按位置删除\n");
printf("\t4、学生信息输出\n");
printf("\t0、返回主目录\n");
printf("请输入序号:");
}
//修改目录
void update_menu()
{
printf("\n");
printf("=====修改目录=====\n");
printf("\t1、按学号修改\n");
printf("\t2、按姓名修改\n");
printf("\t3、学生信息输出\n");
printf("\t0、返回主目录\n");
printf("请输入序号:");
}
//查询目录
void find_menu()
{
printf("\n");
printf("=====查询目录=====\n");
printf("\t1、按学号查找\n");
printf("\t2、按姓名查找\n");
printf("\t3、按位置查找\n");
printf("\t4、学生信息输出\n");
printf("\t0、返回主目录\n");
printf("请输入序号:");
}
//排序目录
void sort_menu()
{
printf("\n");
printf("=====排序目录=====\n");
printf("\t1、按学号排序\n");
printf("\t2、按成绩排序\n");
printf("\t3、学生信息输出\n");
printf("\t0、返回主目录\n");
printf("请输入序号:");
}
//创建
linklist *create()
{
linklist *L = (linklist*)malloc(sizeof(linklist));
if(NULL == L)
{
printf("创建失败\n");
return NULL;
}
//初始化
L->len = 0;
L->next = L;
printf("创建成功\n");
return L;
}
//判空
int empty(linklist *L)
{
return L==L->next ? 1:0;
}
//申请结点
linklist* apply(linklist *L, datatype e)
{
linklist *p = (linklist*)malloc(sizeof(linklist));
if(NULL == p)
{
printf("申请失败\n");
return NULL;
}
p->data = e;
p->next = NULL;
//printf("申请成功\n");
return p;
}
//尾插
int insert_tail(linklist *L, datatype e)
{
if(NULL == L)
{
printf("链表不合法\n");
return -1;
}
linklist *p = apply(L, e); //申请结点存放数据
linklist *q = L; //遍历指针
while(q->next != L) //遍历到最后一位
{
q = q->next;
}
p->next = L;
q->next = p; //插入逻辑
L->len++;
printf("输入成功\n");
return 0;
}
//任意插入
int insert(linklist *L, int pos, datatype e)
{
if(NULL==L || pos<1)
{
printf("插入失败\n");
return -1;
}
linklist *p = apply(L, e); //申请结点
linklist *q = find_pos(L, pos-1); //查找插入位置的前一个结点
if(q == NULL)
{
return -2;
}
//如果要插入位置大于链表长度则插入到最后一个
if(pos > L->len)
{
insert_tail(L, e);
return 0;
}
//插入逻辑
p->next = q->next;
q->next = p;
L->len++;
printf("插入成功\n");
return 0;
}
//遍历
void show(linklist *L)
{
if(NULL==L || empty(L))
{
printf("遍历失败\n");
return;
}
linklist *q = L->next; //遍历指针
printf("当前学生信息如下:\n");
while(q != L) //遍历逻辑
{
printf("学号:%d\t姓名:%s\t成绩:%d\t", q->data.id, q->data.name, q->data.score);
q = q->next;
printf("\n");
}
}
//按学号查找
linklist *find_id(linklist *L, int e)
{
if(NULL==L || empty(L) || e<1)
{
printf("查找失败\n");
return NULL;
}
linklist *q = L->next;
while(q != L)
{
if(q->data.id == e)
{
printf("查找成功\n");
return q;
}
q = q->next;
}
printf("查找失败\n");
return NULL;
}
//按姓名查找
linklist *find_name(linklist *L, char *s)
{
if(NULL==L || empty(L))
{
printf("链表不合法\n");
return NULL;
}
linklist *q = L->next;
while(q != L)
{
if(0 == strcmp(q->data.name, s))
{
printf("查找成功\n");
return q;
}
q = q->next;
}
printf("查找失败\n");
return NULL;
}
//按位置查找
linklist *find_pos(linklist *L, int pos)
{
if(NULL==L || empty(L) || pos<0 || pos>L->len)
{
printf("查找失败\n");
return NULL;
}
linklist *q = L;
for(int i=0; i<pos; i++)
{
q = q->next;
}
printf("查找成功\n");
return q;
}
//头删
int del_head(linklist *L)
{
if(NULL==L || empty(L))
{
printf("链表不合法\n");
return -1;
}
linklist *p = L->next;
L->next = p->next;
free(p);
p = NULL;
printf("删除成功\n");
return 0;
}
//按学号删除
int del_id(linklist *L, int e)
{
if(NULL==L || empty(L))
{
printf("删除失败\n");
return -1;
}
linklist *q = find_id(L, e); //查找学号
if(NULL == q)
{
printf("该学号不存在\n");
return -2;
}
linklist *p = q->next;
//删除逻辑
//将后一个值赋给前一个函数,再将后一个删除
if(p == L)
{
p->next->next = L;
}
else
{
q->data = p->data;
q->next = p->next;
}
free(p);
p = NULL;
L->len--;
printf("删除成功\n");
return 0;
}
//按姓名删除
int del_name(linklist *L, char *s)
{
if(NULL==L || empty(L))
{
printf("链表不合法\n");
return -1;
}
linklist *q = find_name(L, s); //查找姓名
if(NULL == q)
{
printf("该学生不存在\n");
return -2;
}
linklist *p = q->next;
//删除逻辑
//将后一个值赋给前一个,再将后一个删除
if(p == L)
{
p->next->next = L;
}
else
{
q->data = p->data;
q->next = p->next;
}
free(p);
p = NULL;
L->len--;
printf("删除成功\n");
return 0;
}
//按位置删除
int del_pos(linklist *L, int pos)
{
if(NULL==L || empty(L) || pos<1 || pos>L->len)
{
printf("删除失败\n");
return -1;
}
linklist *q = find_pos(L, pos-1); //查找删除位置的前一个结点
linklist *p = q->next;
//删除逻辑
q->next = p->next;
free(p);
p = NULL;
L->len--;
printf("删除成功\n");
return 0;
}
//按学号修改
int update_id(linklist *L, int i, datatype e)
{
if(NULL==L || empty(L) || i<1)
{
printf("修改失败\n");
return -1;
}
linklist *p = find_id(L, i); //查找id
if(p == NULL)
{
printf("修改失败\n");
return -2;
}
p->data = e;
printf("修改成功\n");
return 0;
}
//按姓名修改
int update_name(linklist *L, char *s, datatype e)
{
if(NULL==L || empty(L))
{
printf("链表不合法\n");
return -1;
}
linklist *p = find_name(L, s); //查找姓名
if(NULL == p)
{
printf("该学生不存在\n");
return -2;
}
p->data = e;
printf("修改成功\n");
return 0;
}
//按成绩排序
void sort_score(linklist *L, int flag) // 1 为升序 0为降序
{
if(NULL==L || empty(L))
{
printf("链表不合法\n");
return;
}
for(int i=1; i<L->len; i++)
{
linklist *q = L->next; //遍历指针
//排序逻辑,用的是冒泡排序的思路
//只改变了链表数据的值没改变链表数据的位置
while(q->next != L)
{
datatype temp; //临时变量
if(flag == 1)
{
if(q->data.score > q->next->data.score)
{
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
else if(flag == 0)
{
if(q->data.score < q->next->data.score)
{
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}
}
printf("排序结果如下:\n");
show(L);
}
//按学号排序
void sort_id(linklist *L, int flag) // 1 为升序 0为降序
{
if(NULL==L || empty(L))
{
printf("链表不合法\n");
return;
}
for(int i=1; i<L->len; i++)
{
linklist *q = L->next; //遍历指针
while(q->next != L)
{
datatype temp;
if(flag == 1)
{
if(q->data.id > q->next->data.id)
{
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
else if(flag == 0)
{
if(q->data.id < q->next->data.id)
{
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}
}
printf("排序结果如下:\n");
show(L);
}
//释放链表
void destroy(linklist *L)
{
linklist *q = L;
while(q->next != L)
{
del_head(L);
}
free(L);
L = NULL;
printf("释放成功\n");
}
main.c(主函数)
代码块
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"
int main(int argc, const char *argv[])
{
int num; //序号
int flag; //死循环变量
linklist *L = create();
if(NULL == L)
{
return -1;
}
while(1) //外层死循环
{
menu();
scanf("%d", &num);
switch(num)
{
case 1:
{
flag = 1;
while(flag) //内层死循环
{
insert_menu();
scanf("%d", &num);
switch(num)
{
datatype temp;
case 1:
{
int m;
printf("请输入学生人数:");
scanf("%d", &m);
getchar();
for(int i=0; i<m; i++)
{
printf("请输入学生信息:");
scanf("%d%s%d", &temp.id ,temp.name, &temp.score);
insert_tail(L, temp);
}
break;
}
case 2:
{
int pos;
printf("请输入学生信息:");
scanf("%d%s%d", &temp.id ,temp.name, &temp.score);
printf("请输入要插入的位置:");
scanf("%d", &pos);
insert(L, pos, temp);
break;
}
case 3:
{
show(L);
break;
}
case 0:
{
flag = 0;
break;
}
default: printf("序号有误\n");
}
}
break;
}
case 2:
{
flag = 1;
while(flag)
{
del_menu();
scanf("%d", &num);
switch(num)
{
case 1:
{
int id;
printf("请输入学号:");
scanf("%d", &id);
del_id(L, id);
break;
}
case 2:
{
char name[10];
printf("请输入姓名:");
getchar();
scanf("%s", name);
del_name(L, name);
break;
}
case 3:
{
int pos;
printf("请输入位置:");
scanf("%d", &pos);
del_pos(L, pos);
break;
}
case 4:
{
show(L);
break;
}
case 0:
{
flag = 0;
}
default:printf("序号有误\n");
}
}
break;
}
case 3:
{
flag = 1;
datatype temp;
while(flag)
{
update_menu();
scanf("%d", &num);
switch(num)
{
case 1:
{
int id;
printf("请输入学号:");
scanf("%d", &id);
printf("请输入学生信息:");
getchar();
scanf("%d%s%d", &temp.id, temp.name, &temp.score);
update_id(L, id, temp);
break;
}
case 2:
{
char name[10];
printf("请输入姓名:");
getchar();
scanf("%s", name);
printf("请输入学生信息:");
getchar();
scanf("%d%s%d", &temp.id, temp.name, &temp.score);
update_name(L, name, temp);
break;
}
case 3:
{
show(L);
break;
}
case 0:
{
flag = 0;
break;
}
default: printf("序号有误\n");
}
}
break;
}
case 4:
{
flag = 1;
linklist *p;
while(flag)
{
find_menu();
scanf("%d", &num);
switch(num)
{
case 1:
{
int id;
printf("请输入学号:");
scanf("%d", &id);
p = find_id(L, id);
printf("%d\t%s\t%d\t", p->data.id, p->data.name, p->data.score);
break;
}
case 2:
{
char name[10];
printf("请输入姓名:");
getchar();
scanf("%s", name);
p = find_name(L, name);
printf("%d\t%s\t%d\t", p->data.id, p->data.name, p->data.score);
break;
}
case 3:
{
int pos;
printf("请输入位置:");
scanf("%d", &pos);
p = find_pos(L, pos);
printf("%d\t%s\t%d\t", p->data.id, p->data.name, p->data.score);
break;
}
case 4:
{
show(L);
break;
}
case 0:
{
flag = 0;
break;
}
default: printf("序号有误\n");
}
}
break;
}
case 5:
{
flag = 1;
int temp;
while(flag)
{
sort_menu();
scanf("%d", &num);
switch(num)
{
case 1:
{
printf("升序为1,降序为0,请输入:");
scanf("%d", &temp);
sort_id(L, temp);
break;
}
case 2:
{
printf("升序为1,降序为0,请输入:");
scanf("%d", &temp);
sort_score(L, temp);
break;
}
case 3:
{
show(L);
break;
}
case 0:
{
flag = 0;
break;
}
default: printf("序号有误\n");
}
}
break;
}
case 6:
{
show(L);
break;
}
case 0:
{
exit(0);
}
}
}
return 0;
}
部分功能实现
输入
删除
修改