2022嵌入式7.23周末作业

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;
}

部分功能实现

输入

在这里插入图片描述
在这里插入图片描述

删除

在这里插入图片描述

修改

在这里插入图片描述
在这里插入图片描述

查询

在这里插入图片描述

排序

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值