目录
前言
一、学生信息系统创建
首先是建立结构体,学生信息包括学号姓名和分数,单链表包括data和next,注意Studebt data
存放一个学生的信息,开辟一个空间,避免浪费。
创建学生链表,根据指定学生个数,逐个输入学生信息;
二、test.h(结合枚举)
三、game.h
四、具体功能实现
4.1 插入学生(插班生)
4.2 逐个显示学生表中所有学生的相关信息
4.3 根据姓名进行查找,返回此学生的学号和成绩
4.4 给定一个学生信息,插入到表中指定的位置
4.5 删除指定位置的学生记录
五、 game.c
总结
带验证结果
实验内容:
设计并实现一个包含学生信息(学号,姓名,成绩)的链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 给定一个学生信息,插入到表中指定的位置;
(5) 删除指定位置的学生记录;
用户指定学生人数,输入学生信息,可以不输入,输入就进行链表连接。
#include
#include
#include
#include
#define NUM_MAX 12
#define NAME_MAX 6
//学生结构体
typedef struct Student
{
char Number[NUM_MAX];
char Name[NAME_MAX];
int Grade;
}Student;
//单链表
typedef struct SListNode
{
Student data;
struct SListNode* next;
}SListNode;
//开辟空间用来存放学生信息,一次开辟一个
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
if (newnode == NULL)//开辟失败
{
printf("malloc error\n");
exit(-1);
}
//开辟成功就录入学生节点的基本信息
printf("请录入学生基本信息:(学号,姓名,成绩)\n");
scanf("%s", &((newnode->data).Number));
scanf("%s", &((newnode->data).Name));
scanf("%d", &((newnode->data).Grade));
newnode->next = NULL;
int i = 0;
int n = 0;//学生人数
SListNode* SList = NULL;//创建空链表
SListNode* head = NULL;//记录头指针
SListNode* tail = NULL;//记录尾指针
//输入N个学生的信息
scanf("%d", &n);
while (i++ < n)
{
//开辟空间用来存放学生信息,一次开辟一个
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
if (newnode == NULL)//开辟失败
{
printf("malloc error\n");
exit(-1);
}
//开辟成功就录入学生节点的基本信息
printf("请录入学生基本信息:(学号,姓名,成绩)\n");
scanf("%s", &((newnode->data).Number));
scanf("%s", &((newnode->data).Name));
scanf("%d", &((newnode->data).Grade));
newnode->next = NULL;
//如果空链表,即第一次插入学生信息
if (head == NULL)
{
SList = newnode;
head = newnode;
tail = newnode;
}
else//链接链表,尾插
{
tail->next = newnode;
tail = newnode;//尾相应的变位置
}
}
#define _CRT_SECURE_NO_WARNINGS 1
/*设计并实现一个包含学生信息(学号,姓名,成绩)的链表*/
#include"game.h"
enum Option
{
EXIT,//退出0
ADD,//尾插学生信息
SHOW,//逐个显示学生表中所有学生的相关信息;
FIND,//根据姓名进行查找,返回此学生的学号和成绩;
INSERT,//给定一个学生信息,插入到表中指定的位置;
DELETE,//删除指定位置的学生记录;
}input;
void menu()
{
printf("*************************************** \n");
printf("**** 0.退出学生管理系统 ***************** \n");
printf("**** 1.尾插学生信息 **********************\n");
printf("**** 2.逐个显示学生表中所有学生的相关信息 **********************\n");
printf("**** 3.根据姓名进行查找,返回此学生的学号和成绩 *****************\n");
printf("**** 4.给定一个学生信息,插入到表中指定的位置 *******************\n");
printf("**** 5.删除指定位置的学生记录 ********************************\n");
printf("**********************************************************\n");
}
int main()
{
//创建学生链表
int i = 0;
int n = 0;//学生人数
SListNode* SList = NULL;//创建空链表
SListNode* head = NULL;//记录头指针
SListNode* tail = NULL;//记录尾指针
//输入N个学生的信息
scanf("%d", &n);
while (i++ < n)
{
//开辟空间用来存放学生信息,一次开辟一个
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
if (newnode == NULL)//开辟失败
{
printf("malloc error\n");
exit(-1);
}
//开辟成功就录入学生节点的基本信息
printf("请录入学生基本信息:(学号,姓名,成绩)\n");
scanf("%s", &((newnode->data).Number));
scanf("%s", &((newnode->data).Name));
scanf("%d", &((newnode->data).Grade));
newnode->next = NULL;
//如果空链表,即第一次插入学生信息
if (head == NULL)
{
SList = newnode;
head = newnode;
tail = newnode;
}
else//链接链表,尾插
{
tail->next = newnode;
tail = newnode;//尾相应的变位置
}
}
do
{
menu();
printf("请选择->\n");
scanf("%d", &input);
switch (input)
{
case EXIT:
free(SList);
SList = NULL;
printf("退出学生管理系统\n");
break;
case ADD:
printf("插入学生信息:>\n");
SListPushBack(&SList);
break;
case SHOW:
printf("打印学生信息:>\n");
SListPrint(SList);
break;
case FIND:
printf("通过姓名查找:>\n");
SListNode* SL = SListFind(SList);
if (SL == NULL)
{
printf("找不到!\n");
}
else
{
printf("%-13s\t%-6s\t%-4d\t\n", (SL->data).Number, (SL->data).Name, (SL->data).Grade);
}
break;
case INSERT:
{
//先调用一下,找到位置
SListNode* pos = SListFind(SList);
if (pos == NULL)
{
printf("找不到!\n");
}
else
{
printf("指定位置插入学生信息:\n");
SListInsert(&SList, pos);
}
SListPrint(SList);
break;
}
case DELETE:
{
SListNode* del = SListFind(SList);
if (del == NULL)
{
printf("找不到!\n");
printf("无法删除!\n");
}
else
{
printf("删除指定位置学生信息后的学生信息:\n");
SListDelete(&SList, del);
SListPrint(SList);
}
break;
}
default:
printf("选择错误!\n");
break;
}
} while (input);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
/*设计并实现一个包含学生信息(学号,姓名,成绩)的链表*/
#include
#include
#include
#include
#define NUM_MAX 12
#define NAME_MAX 6
//学生结构体
typedef struct Student
{
char Number[NUM_MAX];
char Name[NAME_MAX];
int Grade;
}Student;
//单链表
typedef struct SListNode
{
Student data;
struct SListNode* next;
}SListNode;
void SListPrint(SListNode* phead);
void SListPushBack(SListNode** pphead);
SListNode* SListFind(SListNode* phead);
void SListInsert(SListNode** pphead, SListNode* pos);
void SListDelete(SListNode** pphead, SListNode* del);
void SListPushBack(SListNode** pphead)
{
assert(pphead);
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
//输入插入的学生基本信息
printf("请输入插班生的基本信息:(学号,姓名,成绩)>\n");
scanf("%s", &((newnode->data).Number));
scanf("%s", &((newnode->data).Name));
scanf("%d", &((newnode->data).Grade));
newnode->next = NULL;
if (*pphead == NULL)//pphead接收的&SList,*pphead就是SList本身
{
//这就是说该链表无节点,可以直接插入
*pphead = newnode;//现在让SList指向newnode即可插入成功
}
else
{//找尾,尾插即可
SListNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
void SListPrint(SListNode* phead)
{
assert(phead);
SListNode* cur = phead;
while (cur != NULL)
{
printf("%-13s\t%-6s\t%-4d\t\n", (cur->data).Number, (cur->data).Name, (cur->data).Grade);
cur = cur->next;
}
}
SListNode* SListFind(SListNode* phead)
{
assert(phead);
SListNode* cur = phead;
char Name[NAME_MAX];
printf("请输入你要查找的人的姓名:>\n");
scanf("%s", &Name);
while (cur != NULL)//只有这样才能检查最后一个节点
{
if ((strcmp(((cur->data).Name),Name)) == 0)
{
return cur;
}
cur = cur->next;
}
return NULL;//找不到返回NULL
}
void SListInsert(SListNode** pphead, SListNode* pos)
{
assert(pphead);
assert(pos);
//1.空链表
if (*pphead == NULL)
{
return;//空链表都没有pos位置,无意义
}
//2.单节点
else if ((*pphead)->next == NULL)
{
SListPushBack(pphead);//pphead是SList的地址
}
//3.多节点
else
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
//输入插入的学生基本信息
printf("在pos位置插入的学生的基本信息:(学号,姓名,成绩)>\n");
scanf("%s", &((newnode->data).Number));
scanf("%s", &((newnode->data).Name));
scanf("%d", &((newnode->data).Grade));
newnode->next = NULL;
SListNode* cur = *pphead;
while (cur != pos)
{
cur = cur->next;
}
newnode->next = pos->next;
cur->next = newnode;
}
}
void SListDelete(SListNode** pphead, SListNode* del)
{
assert(pphead);
assert(del);
if (*pphead == NULL)
{
return;//空链表没有删除的必要
}
else if ((*pphead) == del)
{
free(*pphead);
*pphead = NULL;
}
else
{
SListNode* cur = *pphead;
while (cur->next != del)
{
cur = cur->next;
}
cur->next = del->next;
free(del);
del = NULL;
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
/* EXIT,//退出0
ADD,//插班生;
SHOW,//逐个显示学生表中所有学生的相关信息;
FIND,//根据姓名进行查找,返回此学生的学号和成绩;
INSERT,//给定一个学生信息,插入到表中指定的位置;
DELETE,//删除指定位置的学生记录;*/
//插入学生,尾插
void SListPushBack(SListNode** pphead)
{
assert(pphead);
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
//输入插入的学生基本信息
printf("请输入插班生的基本信息:(学号,姓名,成绩)>\n");
scanf("%s", &((newnode->data).Number));
scanf("%s", &((newnode->data).Name));
scanf("%d", &((newnode->data).Grade));
newnode->next = NULL;
if (*pphead == NULL)//pphead接收的&SList,*pphead就是SList本身
{
//这就是说该链表无节点,可以直接插入
*pphead = newnode;//现在让SList指向newnode即可插入成功
}
else
{//找尾,尾插即可
SListNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
//打印链表
void SListPrint(SListNode* phead)
{
assert(phead);
SListNode* cur = phead;
while (cur != NULL)
{
printf("%-13s\t%-6s\t%-4d\t\n", (cur->data).Number, (cur->data).Name, (cur->data).Grade);
cur = cur->next;
}
}
//根据姓名进行查找
SListNode* SListFind(SListNode* phead)
{
assert(phead);
SListNode* cur = phead;
char Name[NAME_MAX];
printf("请输入你要查找的人的姓名:>\n");
scanf("%s", &Name);
while (cur != NULL)//只有这样才能检查最后一个节点
{
if ((strcmp(((cur->data).Name),Name)) == 0)
{
return cur;
}
cur = cur->next;
}
return NULL;//找不到返回NULL
}
//给定一个学生信息,插入到表中pos位置
void SListInsert(SListNode** pphead, SListNode* pos)
{
assert(pphead);
assert(pos);
//1.空链表
if (*pphead == NULL)
{
return;//空链表都没有pos位置,无意义
}
//2.单节点
else if ((*pphead)->next == NULL)
{
SListPushBack(pphead);//pphead是SList的地址
}
//3.多节点
else
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
//输入插入的学生基本信息
printf("在pos位置插入的学生的基本信息:(学号,姓名,成绩)>\n");
scanf("%s", &((newnode->data).Number));
scanf("%s", &((newnode->data).Name));
scanf("%d", &((newnode->data).Grade));
newnode->next = NULL;
SListNode* cur = *pphead;
while (cur != pos)
{
cur = cur->next;
}
newnode->next = pos->next;
cur->next = newnode;
}
}
//删除指定位置的学生信息
void SListDelete(SListNode** pphead, SListNode* del)
{
assert(pphead);
assert(del);
if (*pphead == NULL)
{
return;//空链表没有删除的必要
}
else if ((*pphead) == del)
{
free(*pphead);
*pphead = NULL;
}
else
{
SListNode* cur = *pphead;
while (cur->next != del)
{
cur = cur->next;
}
cur->next = del->next;
free(del);
del = NULL;
}
}
结合单链表的实现和通讯录的实现,可以较好的完成!