创作本文目的:记录自己的学习历程
单链表实现学生信息管理系统
一、student.h
#ifndef __STUDENT_H__
#define __STUDENT_H__
#define MAX 20 //姓名长度
typedef struct student
{
int id; //学号
char name[MAX]; //姓名
int score; //成绩
}datatype;
typedef struct Node
{
union
{
datatype data;
int len;
};
struct Node *next;
}Linklist;
//创建
Linklist *list_create();
//判空
int list_empty(Linklist *);
//申请节点函数
Linklist *Node_apply(datatype );
//遍历
void list_show(Linklist *);
//按位置查找返回找到的节点
Linklist *find_node(Linklist *,int );
//销毁
void list_free(Linklist *);
//目录
void meun();
//学生信息插入
void stu_insert(Linklist *);
//学生信息删除
void stu_delete(Linklist *);
//学生信息查看与修改
void stu_search_and_updata(Linklist *);
//排序
void sort(Linklist *);
#endif
二、student.c
#include <stdlib.h>
#include <string.h>
#include "student.h"
#include <stdio.h>
//目录
void meun()
{
printf("\t\t*********************************\n");
printf("\t\t*\t链式学生管理系统\t*\n");
printf("\t\t*\t1.增\t\t\t*\n");
printf("\t\t*\t2.删\t\t\t*\n");
printf("\t\t*\t3.查与改\t\t*\n");
printf("\t\t*\t4.排序\t\t\t*\n");
printf("\t\t*\t5.查看全部信息\t\t*\n");
printf("\t\t*\t0.清空并退出\t\t*\n");
printf("\t\t*********************************\n");
}
//创建
Linklist *list_create()
{
Linklist *l = (Linklist *)malloc(sizeof(Linklist));
if(NULL == l)
{
printf("创建失败\n");
return NULL;
}
l->len=0;
l->next=NULL;
printf("创建成功\n");
return l;
}
//判空
int list_empty(Linklist *L)
{
if(NULL==L)
{
printf("表不合法\n");
return -1;
}
return NULL==L->next?1:0;
}
//申请节点函数
Linklist *Node_apply(datatype e)
{
Linklist *p = (Linklist *)malloc(sizeof(Linklist));
if(NULL == p)
{
printf("节点申请失败\n");
return NULL;
}
p->data =e;
p->next =NULL;
return p;
}
//遍历
void list_show(Linklist *L)
{
if(NULL==L || list_empty(L))
{
printf("表空,遍历失败\n");
return;
}
printf("\t\t学生信息\n");
Linklist *q = L->next;
while(q != NULL)
{
printf("学号:%d\t\t姓名:%s\t\t成绩:%d\n",q->data.id,q->data.name,q->data.score);
q = q->next;
}
printf("\n");
}
//按位置查找返回节点
Linklist *find_node(Linklist *L,int pos)
{
if(NULL==L || pos<0 || pos>L->len)
{
printf("查找失败\n");
return NULL;
}
Linklist *q = L;
for(int i=1;i<=pos;i++)
{
q = q->next;
}
return q;
}
//销毁
void list_free(Linklist *L)
{
if(NULL==L)
{
printf("不合法\n");
return;
}
while(L->next!=NULL)
{
Linklist *p = L->next; //标记
L->next = p->next; //孤立
free(p); //踢开
p=NULL;
L->len--;
}
free(L);
L=NULL;
printf("释放完成\n");
}
//学生插入
void stu_insert(Linklist *L)
{
int choice;
int n;
while(1)
{
printf("选择插入方式\n1.头部插入n个\n2.尾部插入n个\n3.任意位置插入n个\n请输入:");
scanf("%d",&choice);
if(choice>3 || choice<1)
{
printf("请输入正确的选项:");
while(getchar()!='\n');
continue;
}
printf("输入人数:");
scanf("%d",&n);
switch(choice)
{
case 1:
{
for(int i=0;i<n;i++)
{
datatype info;
printf("输入第%d个学生信息:",i+1);
scanf("%d%s%d",&info.id,info.name,&info.score);
Linklist *s=Node_apply(info);
s->next=L->next;
L->next=s;
L->len++;
printf("头部插入成功\n");
}
}break;
case 2:
{
for(int i=0;i<n;i++)
{
datatype info;
printf("输入第%d个学生信息:",i+1);
scanf("%d%s%d",&info.id,info.name,&info.score);
Linklist *s=Node_apply(info);
Linklist *q=L;
while(q->next!=NULL)
{
q=q->next;
}
q->next=s;
L->len++;
printf("尾部插入成功\n");
}
}break;
case 3:
{
int tmp=1;
while(1)
{
if(L->len)
{
printf("输入从第几位插入:");
scanf("%d",&tmp);
if(tmp<1 || tmp>L->len+1)
{
printf("请输入正确的数\n");
continue;
}
}
break;
}
for(int i=0;i<n;i++)
{
datatype info;
printf("输入第%d个学生信息:",i+1);
scanf("%d%s%d",&info.id,info.name,&info.score);
Linklist *s=Node_apply(info);
Linklist *q=L;
for(int j=0;j<tmp-1;j++)
q=q->next;
s->next=q->next;
q->next=s;
tmp++;
L->len++;
printf("插入成功\n");
}
}break;
}
break;
}
}
//学生删除
void stu_delete(Linklist *L)
{
if(NULL==L || list_empty(L))
{
printf("所给链表不合法\n");
return;
}
int choice;
int n;
while(1)
{
printf("选择删除方式\n1.头部删除n个\n2.尾部删除n个\n3.任意位置删除n个\n请输入:");
scanf("%d",&choice);
if(choice>3 || choice<1)
{
printf("请输入正确的选项:");
while(getchar()!='\n');
continue;
}
while(1)
{
printf("输入人数:");
scanf("%d",&n);
if(n>L->len)
{
printf("请输入正确的数\n");
while(getchar()!='\n');
continue;
}
break;
}
switch(choice)
{
case 1:
{
for(int i=0;i<n;i++)
{
Linklist *s=L->next;
L->next=s->next;
free(s);
s=NULL;
L->len--;
printf("头部删除成功\n");
}
}break;
case 2:
{
for(int i=0;i<n;i++)
{
Linklist *q=L;
while(q->next->next!=NULL)
{
q=q->next;
}
free(q->next);
q->next=NULL;
L->len--;
printf("尾部删除成功\n");
}
}break;
case 3:
{
int tmp=0;
while(1)
{
if(L->len && n)
{
printf("输入从第几位删除:");
scanf("%d",&tmp);
if(tmp<1 || tmp>L->len+1)
{
printf("请输入正确的数\n");
continue;
}
}
break;
}
for(int i=0;i<n;i++)
{
Linklist *s=find_node(L,tmp-1);
Linklist *p=s->next;
s->next=p->next;
free(p);
p=NULL;
L->len--;
printf("删除成功\n");
}
}break;
}
break;
}
}
//学生信息查看与修改
void stu_search_and_updata(Linklist *L)
{
if(NULL==L ||list_empty(L))
{
printf("所给链表不合法\n");
return;
}
int choice;
while(1)
{
printf("选择查看方式\n1.按位置进行查看\n2.按学号进行查看\n3.按姓名进行查看\n4.按成绩进行查看\n请输入:");
scanf("%d",&choice);
if(choice<1 || choice>4)
{
printf("选择正确的修改方式\n");
continue;
}
break;
}
switch(choice)
{
case 1:
{
int pos=0;
char ch;
datatype new;
while(1)
{
printf("输入要查看的位置:");
scanf("%d",&pos);
if(pos<1 || pos>L->len)
{
printf("请输入正确的位置\n");
continue;
}
break;
}
Linklist *p=find_node(L,pos);
printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
while(getchar()!='\n');
printf("\n是否修改当前信息(y/n):");
ch=getchar();
if(ch=='y')
{
printf("输入修改信息:");
scanf("%d%s%d",&new.id,new.name,&new.score);
p->data=new;
printf("修改成功\n");
}
else
{
printf("未修改\n");
}
}break;
case 2:
{
datatype new;
int flag=0;
char ch;
printf("输入要查看位置的学号:");
scanf("%d",&new.id);
Linklist *p=L->next;
while(p!=NULL)
{
if(p->data.id==new.id)
{
printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
while(getchar()!='\n');
printf("\n是否修改当前信息(y/n):");
ch=getchar();
if(ch=='y')
{
printf("输入修改信息:");
scanf("%d%s%d",&new.id,new.name,&new.score);
p->data=new;
printf("修改成功\n");
}
else
{
printf("未修改\n");
}
flag=1;
}
p=p->next;
}
if(!flag)
{
printf("查无此人\n");
}
}break;
case 3:
{
datatype new;
int flag=0;
char ch;
printf("输入要查看位置的姓名:");
scanf("%s",new.name);
Linklist *p=L->next;
while(p!=NULL)
{
if(strcmp(p->data.name,new.name)==0)
{
printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
while(getchar()!='\n');
printf("\n是否修改当前信息(y/n):");
ch=getchar();
if(ch=='y')
{
printf("输入修改信息:");
scanf("%d%s%d",&new.id,new.name,&new.score);
p->data=new;
printf("修改成功\n");
}
else
{
printf("未修改\n");
}
flag=1;
}
p=p->next;
}
if(!flag)
{
printf("查无此人\n");
}
}break;
case 4:
{
datatype new;
int flag=0;
char ch;
printf("输入要查看位置的成绩:");
scanf("%d",&new.score);
Linklist *p=L->next;
while(p!=NULL)
{
if(p->data.score==new.score)
{
printf("\n学号:%d\t\t姓名:%s\t\t成绩:%d\n",p->data.id,p->data.name,p->data.score);
while(getchar()!='\n');
printf("\n是否修改当前信息(y/n):");
ch=getchar();
if(ch=='y')
{
printf("输入修改信息:");
scanf("%d%s%d",&new.id,new.name,&new.score);
p->data=new;
printf("修改成功\n");
}
else
{
printf("未修改\n");
}
flag=1;
}
p=p->next;
}
if(!flag)
{
printf("查无此人\n");
}
}break;
}
}
//排序
void sort(Linklist *L)
{
if(NULL==L || list_empty(L))
{
printf("所给链表不合法\n");
return;
}
int i,j;
Linklist *q=L->next;
datatype tmp;
for(i=1;i<L->len;i++)
{
q=L->next;
for(j=0;j<L->len-i;j++)
{
if(q->data.score>q->next->data.score)
{
tmp=q->data;
q->data=q->next->data;
q->next->data=tmp;
}
q=q->next;
}
}
printf("排序完成\n");
}
三、main.c
#include "student.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
char choice;
Linklist *L = list_create();
if(NULL==L)
{
return -1;
}
while(1)
{
meun();
printf("\n请选择(0-4):");
scanf("%c",&choice);
switch(choice)
{
case '1':
{
stu_insert(L);
}break;
case '2':
{
stu_delete(L);
}break;
case '3':
{
stu_search_and_updata(L);
}break;
case '4':
{
sort(L);
}break;
case '5':
{
list_show(L);
}break;
case '0':
{
list_free(L);
L=NULL;
sleep(1); //延时1s
exit(0);
}break;
default:printf("\n请输入正确的选项\n");
}
while(getchar()!='\n');
}
return 0;
}