用链表实现学生管理系统的增删查改
使用分文件对需求进行编译。
.h头文件:
#ifndef _STU_H_
#define _STU_H_
#define MAX 10
typedef struct stu{
char name[MAX];
int score;
int ID;
}STU;
typedef struct Node{
int len;
struct stu S;
struct Node *next;
}linklist;
//菜单选择
void menu();
//创建链表
linklist* create();
//增
linklist* add(linklist* L);
//删
linklist* delete(linklist* L,int pos);
//查看学生个人信息
linklist* show_pos(linklist* L,int pos);
//查看所有人信息
linklist* show(linklist* L);
//改
linklist* revise(linklist* L);
//排序
void sort(linklist* L);
#endif
调用函数增删查改,排序代码的实现:
#include <stdio.h>
#include <stdlib.h>
#include "stu.h"
#include <string.h>
void menu(){
printf("******1.增加学生信息********\n");
printf("******2.删除学生信息********\n");
printf("******3.查询学生信息********\n");
printf("******4.查看所有人信息******\n");
printf("******5.修改学生信息********\n");
printf("******6.排列学生信息********\n");
printf("**********0.退出************\n");
}
//创建链表
linklist* create(){
linklist* L=(linklist*)malloc(sizeof(linklist));
if(L==NULL){
printf("学生系统创建失败\n");
return NULL;
}
L->len=0;
L->next=NULL;
printf("学生系统创建成功\n");
return L;
}
//判空
int empty(linklist* L){
if(NULL==L){
printf("还没有输入信息\n");
return -1;
}
return L->next==NULL?1:0;
}
//增
linklist* add(linklist* L){
//判空
if(L==NULL){
printf("学生系统创建失败\n");
return NULL;
}
//申请节点和申请数据空间
linklist* p=(linklist*)malloc(sizeof(linklist));
//将数据存入
printf("输入学生姓名:");
scanf("%s",p->S.name);
printf("输入学生成绩:");
scanf("%d",&p->S.score);
printf("输入学生学号:");
scanf("%d",&p->S.ID);
//头插
p->next=L->next;
L->next=p;
//表的变化
L->len++;
printf("增加信息成功\n");
return 0;
}
//删
linklist* delete(linklist* L,int pos){
//判断逻辑
if(NULL==L || L->len==0){
printf("删除失败,没有数据\n");
return NULL;
}
//找到要删除的前驱
linklist* q=L;
for(int i=0;i<pos-1;i++){
q=q->next;
}
//删除逻辑
linklist* p=q->next;
q->next=p->next;
free(p);
p=NULL;
//表的变化
L->len--;
printf("删除成功\n");
return 0;
}
//查看学生个人信息并且返回结点
linklist* show_pos(linklist* L,int pos){
if(NULL==L||L->len==0){
printf("查找失败\n");
return NULL;
}
//查找节点
linklist* q=L;
for(int i=0;i<pos;i++){
q=q->next;
}
printf("%s\t\t%d\t\t%d\t\n",q->S.name,q->S.score,q->S.ID);
return q;
}
//查看所有人信息
linklist* show(linklist* L){
//判断逻辑
if(NULL==L || L->len==0){
printf("还没有学生信息存在\n");
return NULL;
}
//遍历
printf("大家的信息分别是:\n");
printf("姓名\t\t成绩\t\t学号\t\n");
linklist *q=L->next;
while(q!=NULL){
printf("%s\t\t%d\t\t%d\t\n",q->S.name,q->S.score,q->S.ID);
q=q->next;
}
}
//改
linklist* revise(linklist* L){
//判断逻辑
if(NULL==L || L->len==0){
printf("修改失败\n");
return NULL;
}
//找到要修改的结点
linklist* q=L;
int pos;
printf("输入要修改的位置进行修改:");
scanf("%d",&pos);
for(int i=0;i<pos;i++){
q=q->next;
}
printf("输入学生姓名:");
scanf("%s",q->S.name);
printf("输入学生成绩:");
scanf("%d",&q->S.score);
printf("输入学生学号:");
scanf("%d",&q->S.ID);
printf("该位置信息修改成功\n");
return 0;
}
//排序
void sort(linklist* L){
//判断逻辑
if(NULL==L || L->len==0){
printf("修改失败\n");
return ;
}
//定义前后指针
linklist* p=L;
linklist* q=L;
//遍历与交换数据
while(p!=NULL){
while(q->next!=NULL){
if((q->S.score)>(q->next->S.score)){
//交换结构体数据
STU x;
x=q->S;
q->S=q->next->S;
q->next->S=x;
}
q=q->next;
}
p=p->next;
q=p;
}
printf("排序完成\n");
}
main函数的调用与选择使用case语句执行:
#include <stdio.h>
#include <stdlib.h>
#include "stu.h"
#include <string.h>
int main(int argc, const char *argv[])
{
printf("进入菜单选择;");
int i=1;
//创建链表
linklist* p=create();
//菜单选择
while(i){
menu();
printf("选择你需要的操作:");
int num;
scanf("%d",&num);
switch(num)
{
case 1:{
add(p);
break;
}
case 2:{
int pos;
printf("输入要删除人的位置");
scanf("%d",&pos);
delete(p,pos);
break;
}
case 3:{
int pos;
printf("输入要查找人的位置");
scanf("%d",&pos);
show_pos(p,pos);
break;
}
case 4:{
show(p);
break;
}
case 5:{
revise(p);
break;
}
case 6:{
sort(p);
break;
}
case 0:{
i--;
break;
}
default:{
printf("输入错误,请重新输入\n");
break;
}
}
}
printf("退出成功\n");
return 0;
}