DAY15:链表实现学生信息管理系统
要求功能:
- 创建学生信息表
- 头插法输入学生信息
- 尾插法输入学生信息
- 输出任意位置范围内的学生信息
- 头删法删除学生信息
- 尾删法删除学生信息
- 按位置添加学生信息
- 按位置删除学生信息
- 按位置修改学生信息
- 按位置查找学生信息
- 释放空间
今天有点累,懒得写注释了,其实思路都差不多,就是找到在操作,没什么太多区别
创建结构体
节点结构体
len:链表长度
data:节点数据
next:节点后继
typedef struct Node {union {int data;int len;};struct Node* next;
} Node, *PNode;
创建链表
PNode linklist_creat() {PNode p = (PNode) malloc(sizeof(Node));if(NULL == p){printf("创建失败!\n");return NULL;}p->len = 0;p->next = NULL;printf("创建成功!\n");return p;
}
头插法输入学生信息
int linklist_head_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);//头插temp->next = linklist->next;linklist->next = temp;//改变长度记录linklist->len++;}printf("头插 %d 个元素成功!\n",num);return 1;
}
尾插法输入学生信息
int linklist_tail_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);PNode p = linklist;while (p->next != NULL){p = p->next;}for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);temp->next = NULL;p->next = temp;p = p->next;linklist->len++;}printf("尾插 %d 个元素成功!\n",num);return 1;
}
输出任意位置范围内的学生信息
int linklist_output(PNode linklist, int out_begin, int out_end) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(out_begin > out_end){printf("输入顺序出错!\n");return 0;}if(out_begin < 1 || out_end > linklist->len){printf("输入不在链表范围内");return 0;}PNode temp = linklist->next;int count = 1;while (count < out_begin){temp = temp->next;count++;}for (int i = out_begin; i <= out_end; ++i) {printf("%d ",temp->data);temp = temp->next;}printf("\n");printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);return 1;
}
头删法删除学生信息
int linklist_head_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {//创建删除指针PNode temp = linklist->next;//断开链接linklist->next = temp->next;//释放删除节点temp->next = NULL;free(temp);temp = NULL;linklist->len--;}printf("头删 %d 个元素完成!\n",num);return 1;
}
尾删法删除学生信息
int linklist_tail_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len || num < 1){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {PNode temp = linklist;while (temp->next->next != NULL){temp = temp->next;}free(temp->next);temp->next = NULL;linklist->len--;}printf("尾删 %d 个数据成功!\n",num);return 1;
}
按位置插入学生信息
int linklist_set_insert(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len + 1 || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 0;while (count < set){temp = temp->next;count++;}PNode new_node = (PNode) malloc(sizeof(Node));printf("请输入要插入的值:");scanf("%d",&new_node->data);new_node->next = temp->next;temp->next = new_node;linklist->len++;printf("插入新数据到 %d 位置成功\n",set);return 1;
}
按位置删除学生信息
int linklist_set_delete(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 1;while (count < set){temp = temp->next;count++;}PNode p = temp->next;temp->next = p->next;free(p);linklist->len--;printf("删除 %d 位置的数据成功\n",set);return 1;
}
按位置修改学生信息
int linklist_set_change(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("当前值为: %d\n",temp->data);printf("请输入要修改的值:");scanf("%d",&temp->data);printf("修改成功!\n");return 1;
}
按位置查找学生信息
释放空间
int linklist_free(PNode linklist) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}while (linklist->next != NULL){PNode p = linklist->next;linklist->next = p->next;p->next = NULL;free(p);p = NULL;}printf("释放成功!\n");return 1;
}
代码总和
#include <stdio.h>
#include <malloc.h>//节点结构体,len:链表长度,data:节点数据,next:节点后继
typedef struct Node {union {int data;int len;};struct Node* next;
} Node, *PNode;PNode linklist_creat();int linklist_free(PNode linklist);int linklist_head_insert(PNode linklist, int num);int linklist_tail_insert(PNode linklist, int num);int linklist_output(PNode linklist, int out_begin, int out_end);int linklist_head_delete(PNode linklist, int num);int linklist_tail_delete(PNode linklist, int num);int linklist_set_insert(PNode linklist, int set);int linklist_set_delete(PNode linklist, int set);int linklist_set_change(PNode linklist, int set);int linklist_set_find(PNode linklist, int set);int main(){PNode linklist;int chose;for (;;) {printf("请输入你的选择:");scanf("%d",&chose);if(chose == 0){printf("当前链表长度为:%-5d\n",linklist->len);} else if(chose == 1){//创建头节点linklist = linklist_creat();} else if(chose == 2){//头插int num;printf("请输入要头插节点的数量:");scanf("%d",&num);linklist_head_insert(linklist,num);} else if(chose == 3){//尾插int num;printf("请输入要尾插节点的数量:");scanf("%d",&num);linklist_tail_insert(linklist,num);} else if(chose == 4){//遍历链表int out_begin,out_end;printf("当前链表长度为:%-3d\n",linklist->len);printf("请输入要遍历的起始位置和结束位置:");scanf("%d %d",&out_begin,&out_end);linklist_output(linklist,out_begin,out_end);} else if(chose == 5){//头删int num;printf("请输入要头删的数量:");scanf("%d",&num);linklist_head_delete(linklist,num);} else if(chose == 6){//尾删int num;printf("请输入要尾删的数量:");scanf("%d",&num);linklist_tail_delete(linklist,num);}if(chose == 7){//任意位置插入int set;printf("请输入要插入的位置:");scanf("%d",&set);linklist_set_insert(linklist,set);}if(chose == 8){//任意位置删除int set;printf("请输入要删除的位置:");scanf("%d",&set);linklist_set_delete(linklist,set);}if(chose == 9){//任意位置修改int set;printf("请输入要修改的位置:");scanf("%d",&set);linklist_set_change(linklist,set);}if(chose == 10){//任意位置查找int set;printf("请输入要查找的位置:");scanf("%d",&set);linklist_set_find(linklist,set);}else if(chose == -1){//释放内存,指针指空linklist_free(linklist);free(linklist);linklist = NULL;break;}printf("\n");}return 0;
}int linklist_set_find(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("第 %d 个数据为 %d\n",set,temp->data);return 1;
}int linklist_set_change(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置PNode temp = linklist->next;int count = 1;while (count < set){temp = temp->next;count++;}printf("当前值为: %d\n",temp->data);printf("请输入要修改的值:");scanf("%d",&temp->data);printf("修改成功!\n");return 1;
}int linklist_set_delete(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 1;while (count < set){temp = temp->next;count++;}PNode p = temp->next;temp->next = p->next;free(p);linklist->len--;printf("删除 %d 位置的数据成功\n",set);return 1;
}int linklist_set_insert(PNode linklist, int set) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(set > linklist->len + 1 || set < 1){printf("输入长度超过链表长度!\n");return 0;}//找到set位置前面那个位置PNode temp = linklist;int count = 0;while (count < set){temp = temp->next;count++;}PNode new_node = (PNode) malloc(sizeof(Node));printf("请输入要插入的值:");scanf("%d",&new_node->data);new_node->next = temp->next;temp->next = new_node;linklist->len++;printf("插入新数据到 %d 位置成功\n",set);return 1;
}int linklist_tail_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len || num < 1){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {PNode temp = linklist;while (temp->next->next != NULL){temp = temp->next;}free(temp->next);temp->next = NULL;linklist->len--;}printf("尾删 %d 个数据成功!\n",num);return 1;
}int linklist_head_delete(PNode linklist, int num) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(num > linklist->len){printf("输入长度超过链表长度!\n");return 0;}for (int i = 0; i < num; ++i) {//创建删除指针PNode temp = linklist->next;//断开链接linklist->next = temp->next;//释放删除节点temp->next = NULL;free(temp);temp = NULL;linklist->len--;}printf("头删 %d 个元素完成!\n",num);return 1;
}int linklist_output(PNode linklist, int out_begin, int out_end) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}if(out_begin > out_end){printf("输入顺序出错!\n");return 0;}if(out_begin < 1 || out_end > linklist->len){printf("输入不在链表范围内");return 0;}PNode temp = linklist->next;int count = 1;while (count < out_begin){temp = temp->next;count++;}for (int i = out_begin; i <= out_end; ++i) {printf("%d ",temp->data);temp = temp->next;}printf("\n");printf("输出 %d 到 %d 个元素完成!\n",out_begin,out_end);return 1;
}int linklist_tail_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);PNode p = linklist;while (p->next != NULL){p = p->next;}for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);temp->next = NULL;p->next = temp;p = p->next;linklist->len++;}printf("尾插 %d 个元素成功!\n",num);return 1;
}int linklist_head_insert(PNode linklist, int num) {if(NULL == linklist) return -1;printf("请输入 %d 个数据:\n",num);for (int i = 0; i < num; ++i) {PNode temp = (PNode) malloc(sizeof(Node));scanf("%d",&temp->data);//头插temp->next = linklist->next;linklist->next = temp;//改变长度记录linklist->len++;}printf("头插 %d 个元素成功!\n",num);return 1;
}int linklist_free(PNode linklist) {if(NULL == linklist) return -1;if(linklist->len == 0){printf("链表为空!\n");return 0;}while (linklist->next != NULL){PNode p = linklist->next;linklist->next = p->next;p->next = NULL;free(p);p = NULL;}printf("释放成功!\n");return 1;
}PNode linklist_creat() {PNode p = (PNode) malloc(sizeof(Node));if(NULL == p){printf("创建失败!\n");return NULL;}p->len = 0;p->next = NULL;printf("创建成功!\n");return p;
}
相关文章:
DAY15:链表实现学生信息管理系统
要求功能: 创建学生信息表 头插法输入学生信息 尾插法输入学生信息输出任意位置范围内的学生信息 头删法删除学生信息尾删法删除学生信息按位置添加学生信息按位置删除学生信息 按位置修改学生信息按位置查找学生信息释放空间 今天有点累,懒得写注释了&a…...
JAVA语法基础 day05-面向对象
一、面向对象基本概念 /* 面向对象编程的步骤: 1.先设计对象的模板,也就是一个类class 生成一个新类的语句是:public class 类名,就跟python中class 类名一样 2.通过new关键字生成具体的对象,每new一次代表创建了的一个新的对象*…...
关于RabbitMQ重复消费的解决方案
一、产生原因 RabbitMQ在多种情况下可能会出现消息的重复消费。这些情况主要包括以下几个方面: 1. 网络问题 网络波动或中断:在消息处理过程中,由于网络波动或中断,消费者向RabbitMQ返回的确认消息(ack)…...
【SSM-Day2】第一个SpringBoot项目
运行本篇中的代码:idea专业版或者idea社区版本(2021.1~2022.1.4)->这个版本主要是匹配插件spring boot Helper的免费版(衰) 【SSM-Day2】第一个SpringBoot项目 框架->Spring家族框架快速上手Spring BootSpring Boot的作用通过idea创建S…...
【PyTorch】张量操作与线性回归
张量的操作 Tensor Operation 拼接与切分 1.1 torch.cat() torch.cat(tensors, dim0, outNone)功能:将张量按维度dim进行拼接 tensors:张量序列dim:要拼接的维度 1.2 torch.stacok() torch.stack(tensors, dim0, outNone)功能…...
情感类智能体——你的微信女神
智能体名称:你的微信女神 链接:文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/agent/preview/RulbsUjIGj4wsinydlBH7AR3NQKFungt 简介 “你的微信女神”是一个直率的智能体,她用犀利而真实的言辞帮助用户…...
基于SpringBoot+Vue+MySQL的养老院管理系统
系统展示 管理员界面 家属界面 系统背景 随着全球人口老龄化的加速,养老院管理面临着前所未有的挑战。传统管理方式存在信息不透明、效率低下、资源分配不均等问题,难以满足日益增长的养老服务需求。因此,开发一套智能化、高效的养老院管理系…...
大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍
文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、语法结构 三、WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器,其作为源表时,扮演的就是flink cdc的角色。 一、特色功能 MySQ…...
FutureTask源码分析
Thread类的run方法返回值类型是void,因此我们无法直接通过Thread类获取线程执行结果。如果要获取线程执行结果就需要使用FutureTask。用法如下: class CallableImpl implements Callable{Overridepublic Object call() throws Exception {//do somethin…...
Highcharts甘特图基本用法(highcharts-gantt.js)
参考官方文档: https://www.highcharts.com/docs/gantt/getting-started-gantt https://www.highcharts.com/demo/gantt/project-management https://www.hcharts.cn/demo/gantt 链接在下面按需引入 https://code.highcharts.com/gantt/highcharts-gantt.js htt…...
【Linux庖丁解牛】—Linux基本指令(上)!
🌈个人主页:秋风起,再归来~🔥系列专栏: Linux庖丁解牛 🔖克心守己,律己则安 目录 1、 pwd命令 2、ls 指令 3、cd 指令 4、Linux下的根目录 5、touch指令 6、 stat指令 7、mkdi…...
node.js 中的进程和线程工作原理
本文所有的代码均基于 node.js 14 LTS 版本分析 概念 进程是对正在运行中的程序的一个抽象,是系统进行资源分配和调度的基本单位,操作系统的其他所有内容都是围绕着进程展开的 线程是操作系统能够进行运算调度的最小单位,其是进程中的一个执…...
Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)
发布版本链接 通过百度网盘分享的文件:TCP调试助手V1.zip(含客户端与服务器) 链接:https://pan.baidu.com/s/14LTRPChPhYdwp_s6KeyBiA?pwdcedu 提取码:cedu 基于Qt/C实现了一款功能丰富的TCP服务器与客户端调试助手…...
DNS解析流程
DNS解析流程: 浏览器DNS缓存: 当我们在浏览器中访问某个域名时,浏览器首先会检查自己内部的DNS缓存,看是否有该域名的对应IP地址。如果有,直接使用缓存中的IP地址,跳过后续步骤。 本地系统DNS缓存…...
[PTA]7-1 藏头诗
[PTA]7-1 藏头诗 本题要求编写一个解密藏头诗的程序。 注:在 2022 年 7 月 14 日 16 点 50 分以后,该题数据修改为 UTF-8 编码。 输入格式: 输入为一首中文藏头诗,一共四句,每句一行。注意:一个汉字占三…...
每日OJ题_牛客_WY22 Fibonacci数列(斐波那契)
目录 牛客_WY22 Fibonacci数列(斐波那契) 解析代码 牛客_WY22 Fibonacci数列(斐波那契) Fibonacci数列_牛客题霸_牛客网 解析代码 求斐波那契数列的过程中,判断⼀下:何时 n 会在两个 fib 数之间。 #in…...
SQL 查询语句汇总
在软件开发和数据分析中,SQL(结构化查询语言)是与数据库交互的重要工具。为了更好地理解 SQL 查询语句的使用,本文将设计一个简单的数据库,包括几张表,并通过这些表展示各种 SQL 查询的应用。 一、背景信息…...
封装一个语言识别文字的方法
语音识别 需求: 参考官方文档,整合语音识别apicallback 的写法改为 Promise 的版本 在startRecord中: 参考文档实例化-开启转换将录制的内容传递给录音识别回调函数中的 Log,改为 Logger 在closeRecord: 结束识别…...
解决 iOS App Tracking Transparency 权限问题
解决 iOS App Tracking Transparency 权限问题 在 iOS 14 及更高版本中,Apple 引入了 App Tracking Transparency (ATT) 框架,要求应用在跟踪用户之前必须获得用户的明确许可。这通常涉及到访问用户的广告标识符(IDFA)。如果没有…...
ClickHouse 的底层架构和原理
ClickHouse 是一个用于实时分析和处理大规模数据的列式数据库,其设计目标是高效地处理海量数据的查询需求。它特别适合 OLAP(Online Analytical Processing)场景,能够在不依赖复杂的索引结构的情况下,实现极快的查询速…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
