homework.h:
#ifndef __HOME_H__
#define __HOME_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int id;
char name[20];
float score;
}datatype;
typedef struct Node
{
union
{
int len;
datatype *data;
};
struct Node *next;
}student;
//菜单
void menu();
//创建链表
student *creat();
//判空
int empty(student *S);
//申请结点
student *nodeBuy(int id,char name[],float score);
//添加学生信息
int addStudent(student *S,int id,char name[],float score);
//遍历
void show(student *S);
//按姓名查找学生信息
student *selName(student *S,char name[]);
//删除指定学号学生信息
int delid(student *S,int id);
//通过姓名修改学生信息
int upd_name(student *S,char name[],int id_new,float score_new);
//按学号排序学生信息
void sort(student *S);
//头删
int delHead(student *S);
//销毁链表,退出系统
void destroy(student *S);
#endif
homework.c:
#include "homework.h"
//菜单
void menu()
{
printf("----------------学生管理系统-------------------\n");
printf("--------------1>增加学生信息---------------------\n");
printf("--------------2>查看学生信息---------------------\n");
printf("--------------3>按姓名查找学生信息---------------\n");
printf("--------------4>删除指定学号学生信息-------------\n");
printf("--------------5>修改学生信息---------------------\n");
printf("--------------6>按学号排序学生信息---------------\n");
printf("--------------0>退出系统-------------------------\n");
printf("--------------------------------------------------\n");
}
//创建链表
student *creat()
{
student *S = (student*)malloc(sizeof(student));
if(NULL == S)
{
printf("系统启动失败(链表申请失败)\n");
return NULL;
}
//初始化
S->len = 0;
S->next = NULL;
printf("系统启动成功\n");
return S;
}
//判空
int empty(student *S)
{
if(NULL == S)
{
printf("所给链表不合法\n");
return -1;
}
return S->next == NULL ? 1: 0; //1为空 0为非空
}
//申请结点
student *nodeBuy(int id,char name[],float score)
{
student *p =(student*)malloc(sizeof(student));
if(NULL == p)
{
printf("结点申请失败\n");
return NULL;
}
//申请结点中的 data
p->data = (datatype*)malloc(sizeof(datatype));
//将数据录入
p->data->id = id;
strcpy(p->data->name,name);
p->data->score = score;
//初始化next指针
p->next = NULL;
return p;
}
//添加学生信息
int addStudent(student *S,int id,char name[],float score)
{
if(NULL == S)
{
printf("所给链表不合法\n");
return -1;
}
student *p = nodeBuy(id,name,score);
p->next = S->next;
S->next = p;
S->len++;
printf("添加学生信息成功\n");
return 0;
}
//遍历
void show(student *S)
{
if(NULL == S || empty(S))
{
printf("显示失败\n");
return;
}
printf("\t学号\t姓名\t成绩\n");
student *q = S->next;
//遍历打印
while(q != NULL)
{
printf("\t%d\t%s\t%.2f\n",q->data->id,q->data->name,q->data->score);
q = q->next;
}
printf("显示完毕\n");
}
//删除指定id学生信息
int delid(student *S,int id)
{
if(NULL == S || empty(S))
{
printf("删除失败\n");
return -1;
}
student *q = S;
//定位要删除的前一个位置
while(q->next->data->id != id)
{
q = q->next;
}
//标记要删除的位置
student *p = q->next;
q->next = p->next;
free(p->data);
p->data = NULL;
free(p);
p = NULL;
//表的变化
S->len--;
printf("删除成功\n");
}
//按姓名查找学生信息
student *selName(student *S,char name[])
{
if(NULL == S || empty(S))
{
printf("查找失败\n");
return NULL;
}
student *q = S->next;
while(strcmp(q->data->name,name))
{
q = q->next;
if(q == NULL)
{
printf("查无此人\n");
return NULL;
}
}
printf("学号\t姓名\t成绩\n");
printf("%d\t%s\t%.2f\n",q->data->id,q->data->name,q->data->score);
printf("查找成功\n");
return q;
}
//按学号排序学生信息
void sort(student *S)
{
int i,j; //循环变量
datatype *temp; //交换变量
student *p = S->next;
student *q = S->next->next;
for(i=1;i<S->len; i++) //比较趟数
{
for(j=0;j<S->len-i; j++) //元素 比较次数
{
if(p->data->id > q->data->id) //大升小降
{
temp=q->data; q->data=p->data; p->data= temp;
}
q = q->next;
}
p = p->next;
q = p->next;
}
printf("排序成功\n");
}
//头删
int delHead(student *S)
{
//判断逻辑
if(NULL == S || empty(S))
{
printf("删除失败\n");
return -1;
}
//头删
student *p = S->next; //标记
S->next = p->next; //孤立
free(S); //踢开
p=NULL;
//表的变化
S->len--;
printf("头删成功\n");
return 0;
}
//销毁链表,退出系统
void destroy(student *S)
{
if(NULL == S)
{
return;
}
//不断调用头删,将结点进行删除
while(S->next != NULL)
{
delHead(S);
}
//将头结点释放
free(S);
S = NULL;
printf("退出系统完成\n");
return ;
}
//通过姓名修改学生信息
int upd_name(student *S,char name[],int id_new,float score_new)
{
if(NULL == S || empty(S))
{
printf("修改失败\n");
return -1;
}
student *p = selName(S,name);
p->data->id = id_new;
p->data->score = score_new;
printf("修改成功\n");
return 0;
}
main.c:
#include "homework.h"
int main(int argc, const char *argv[])
{
student *S = creat();
if(NULL == S)
{
return -1;
}
while(1)
{
int num;
menu();
printf("长度:%d\n",S->len);
printf("选择功能:");
scanf("%d",&num);
switch(num)
{
case 1:
{
while(1)
{
int id;char name[20];float score;
printf("请输入添加学生的学号:");
scanf("%d",&id);
printf("请输入添加学生的姓名:");
scanf("%s",name);
printf("请输入添加学生的成绩:");
scanf("%f",&score);
addStudent(S,id,name,score);
printf("\n");
int temp;
printf("是否继续输入,继续1,不继续2:");
scanf("%d",&temp);
if(temp == 2)
{
break;
}
}
}
break;
case 2:
show(S);
break;
case 3:
{
char name[20];
printf("请输入你要查询学生的姓名:");
scanf("%s",name);
printf("查询结果如下:\n");
selName(S,name);
}
break;
case 4:
{
while(1)
{
int id;
printf("请输入要删除学生的学号:");
scanf("%d",&id);
delid(S,id);
printf("\n");
int temp;
printf("是否继续输入,继续1,不继续2:");
scanf("%d",&temp);
if(temp == 2)
{
break;
}
}
}
break;
case 5:
{
char name[20];int id_new;float score_new;
printf("请输入你要修改学生的姓名:");
scanf("%s",name);
printf("请输入新的学号:");
scanf("%d",&id_new);
printf("请输入新的成绩\n");
scanf("%f",&score_new);
upd_name(S,name,id_new,score_new);
}
break;
case 6:
{
sort(S);
}
break;
case 0:
destroy(S);
S = NULL;
return -1;
default:
printf("输入错误请重新输入\n");
break;
}
}
return 0;
}