当前位置: 首页 > news >正文

数据结构--单链表创建、增删改查功能以及与结构体合用

一、作业要求

单链表操作,要求节点是结构体类型,实现以下功能:

1.尾插学生
2.任意位置插入学生
3.任意位置删除学生
4.逆置单链表
5.学生按学号排序
6.销毁单链表
二、实现过程
1.代码如下:

(1)头文件创建

#ifndef _LINK_L_
#define _LINK_L_
#include <myhead.h>
//学生信息结构体
typedef struct
{int id;char name[20];
}stu,*Stu;
//单链表结构体
typedef struct Link
{union {int len;stu xs;};struct Link *next;
}links,*Plink;
//创建头节点
Plink create();
//尾插法
int rear_insert(Plink,stu);
//输出函数
int output_link(Plink);
//学生信息输入
Stu input_stu(Stu);
//任意位置插入
int anypos_insert(Plink,int,Stu);
//任意位置删除
int anypos_delete(Plink,int);
//单链表逆置
int rev_stulink(Plink);
//按学号排序
int id_sort(Plink);
//单链表销毁
int link_destroy(Plink);
#endif

(2)主函数编写 

#include "link.h"
int main(int argc, const char *argv[])
{int n,pos;Stu s=NULL;Stu sp=NULL;Plink L=create();//学生信息管理系统结构while(1){printf("\t++++++学生管理系统++++++++++\n");printf("\t\t1、尾插法\n");printf("\t\t2、任意位置插入信息\n");printf("\t\t3、任意位置删除信息\n");printf("\t\t4、单链表逆置\n");printf("\t\t5、学生学号排序\n");printf("\t\t6、销毁链表退出系统\n");printf("\n");int cz=0;printf("请输入操作数:");scanf("%d",&cz);switch(cz){case 1://尾插法printf("请输入学生个数:");scanf("%d",&n);s=malloc(sizeof(stu)*n);for(int i=0;i<n;i++){printf("请输入学生信息:");scanf("%d %s",&s[i].id,s[i].name);}for(int i=0;i<n;i++){rear_insert(L,s[i]);}output_link(L);break;case 2://任意位置插入printf("请输入要插入位置:");scanf("%d",&pos);sp=input_stu(sp);anypos_insert(L,pos,sp);output_link(L);break;case 3://任意位置删除printf("请输入要删除位置:");scanf("%d",&pos);anypos_delete(L,pos);output_link(L);break;case 4://单链表逆置rev_stulink(L);output_link(L);break;case 5:id_sort(L);output_link(L);break;case 6://销毁单链表并退出程序link_destroy(L);return 0;}}return 0;
}

 (3)功能函数编写

#include "link.h"
Plink create()
{Plink L=malloc(sizeof(links));if(L==NULL){printf("创建头节点失败\n");return NULL;}L->next=NULL;L->len=0;printf("创建成功\n");return L;
}
//任意位置删除
int anypos_delete(Plink L,int pos)
{if(L==NULL||pos<1||pos>L->len){printf("删除失败\n");return -1;}Plink t=L;//t指针移至指定节点的前驱for(int i=1;i<pos;i++)t=t->next;//p指针指向要删除节点Plink p=t->next;//t指针链接要删除节点的后一节点t->next=t->next->next;//长度-1L->len--;//释放p节点free(p);p=NULL;return 0;
}
//单链表逆置
int rev_stulink(Plink L)
{if(L==NULL||L->len<1){printf("逆置失败\n");return -1;}//Q指针指向头节点下一节点Plink Q=L->next;//t指向Q的下一节点Plink t=Q->next;//后移直到next指向空while(Q->next!=NULL){//Q指针指向t节点下一节点//单拎t节点Q->next=t->next;//t节点放到头节点之后t->next=L->next;//头节点链接t节点L->next=t;//再次将t指针指向Q节点的下一节点t=Q->next;}return 0;
}
//按学号排序
int id_sort(Plink L)
{Plink j=L;//遍历次数for(int i=1;i<L->len;i++){//指针指向头节点后一节点//后移直到j指针的next为空for(j=L->next;j->next!=NULL;j=j->next){//判断学号大小if(j->xs.id>j->next->xs.id){//结构体内容交换stu temp=j->xs;j->xs=j->next->xs;j->next->xs=temp;}}}return 0;
}
//尾插法
int rear_insert(Plink L,stu s)
{if(L==NULL){printf("插入失败\n");return -1;}Plink t=L;for(int i=0;i<L->len;i++)t=t->next;Plink p=malloc(sizeof(links));p->xs.id=s.id;strcpy(p->xs.name,s.name);p->next=NULL;t->next=p;L->len++;return 0;
}
//输出函数
int output_link(Plink L)
{if(L==NULL){printf("该链表为空\n");return -1;}Plink t=L;for(int i=0;i<L->len;i++){t=t->next;printf("学号:%d\t姓名:%s\n",t->xs.id,t->xs.name);}printf("\n");return 0;
}
//学生信息输入
Stu input_stu(Stu s)
{s=malloc(sizeof(stu));printf("请输入学生信息:");scanf("%d %s",&s->id,s->name);return s;
}
//任意位置插入
int anypos_insert(Plink L,int pos,Stu s)
{if(L==NULL||pos<1||pos>L->len+1){printf("插入失败\n");return -1;}Plink t=L;for(int i=1;i<pos;i++)t=t->next;Plink p=malloc(sizeof(links));p->xs.id=s->id;strcpy(p->xs.name,s->name);p->next=t->next;t->next=p;L->len++;return 0;}
//销毁单链表
int link_destroy(Plink L)
{//链表为空销毁失败if(L==NULL){printf("销毁失败\n");return -1;}//t指针指向单链表Plink t=L;while(L!=NULL){//t指针后移t=t->next;//从头节点开始释放free(L);//指向tL=t;}printf("销毁成功\n");return 0;
}
2.运行结果如图所示:
(1)尾插法插入学生信息

 (2)任意位置插入学生信息

 (3)任意位置删除学生信息

 (4)单链表逆置

 (5)按学号给学生排序

(6)销毁单链表并退出系统

相关文章:

数据结构--单链表创建、增删改查功能以及与结构体合用

一、作业要求 单链表操作&#xff0c;要求节点是结构体类型&#xff0c;实现以下功能&#xff1a; 1.尾插学生 2.任意位置插入学生 3.任意位置删除学生 4.逆置单链表 5.学生按学号排序 6.销毁单链表 二、实现过程 1.代码如下&#xff1a; &#xff08;1&#xff09;头…...

开源ids snort (windows版)

Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …...

关于 vue3 axios的封装,并发请求相关

简介 Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 请求方法别名 为了方便起见&#x…...

cpp中的namespace详解

namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性&#xff0c;它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说&#xff0c;它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…...

request库的使用 | get请求

requests 库的 get 方法用于发送 HTTP GET 请求。GET 请求通常用于请求服务器发送数据。 1、导入 requests 库&#xff1a; import requests 2、发送 GET 请求&#xff1a; 使用 requests.get() 方法发送请求。 response requests.get(urlhttp://www.jd.com) 3、查看响应…...

理想低通信道和理想带通信道的区别

一、定义与特性 理想低通信道&#xff08;可通过<MAX&#xff09;&#xff1a; 定义&#xff1a;理想低通信道允许信号的所有低频分量&#xff0c;只要其频率不超过某个上限值&#xff0c;都能够不失真地通过此信道。而频率超过该上限值的所有高频分量都不能通过该信道。特…...

LAMP架构搭建

目录 LAMP架构搭建 编译安装Apache httpd服务 1、需要的安装包 2、关闭防火墙和核心防护 3、安装环境依赖包 4、配置软件模块 5、编译及安装 6、优化配置文件路径&#xff08;可不做&#xff09; 7、添加httpd系统服务 8、修改httpd 服务配置文件 9、浏览器访问验证…...

RT-DETR

SSE represents the single-scale Transformer encoder&#xff0c;CSF represents cross-scale fusion. AIFI and CCFF are the two modules designed into 作者的 hybrid encoder 截止到发文时间的issue数&#xff0c;多吓人呐&#xff0c;不建议复现...

【算法——KMP】

1理解next数组定义&#xff1a;最长相等前后缀&#xff08;不含当前字符并且不能是整体&#xff09; 算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili next数组的值&#xff1a;假设这个i出现了不匹配就从next[i]的位置开始在再匹配 2next数组生成 看一下是怎…...

视频监控相关笔记

一、QT 之 QTreeWidget 树形控件 Qt编程指南&#xff0c;Qt新手教程&#xff0c;Qt Programming Guide 一个树形结构的节点中的图表文本 、附带数据的添加&#xff1a; QTreeWidgetItem* TourTreeWnd::InsertNode(NetNodeInfo node, QTreeWidgetItem* parent_item) { // …...

React 中,构建组件的方式

1. 函数组件&#xff08;Function Components&#xff09; 函数组件是最简单的组件形式&#xff0c;通常用于展示性的组件&#xff0c;不涉及复杂的生命周期方法。 import React from react;function Welcome(props) {return <h1>Hello, {props.name}</h1>; }exp…...

Android开发高频面试题之——Android篇

Android开发高频面试题之——Android篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Activity启动模式 standard 标准模式,每次都是新建Activity实例。singleTop 栈顶复用。如果要启动的A…...

禁用拷贝构造函数和赋值构造函数

在C中&#xff0c;禁用拷贝构造函数和拷贝赋值操作符的方式通常是为了防止类的对象被意外复制&#xff0c;这对于那些管理独占资源或不应被复制的对象尤为重要。 class LatActiveControlState : public LatState { public:LatActiveControlState() : LatState(LatS_ActiveCont…...

OneDrive for Business with Office Online 部署方案

目录 前言 部署准备 需求分析 用户需求 技术需求 环境准备 硬件要求 软件要求 许可计划 OneDrive for Business 部署 前期准备 域名配置 Azure AD 配置 安装与配置 安装 OneDrive 同步客户端 配置 OneDrive 组策略 数据迁移 Office Online 部署 前期准备 安…...

win10 win11 设置文件权限以解决Onedrive不能同步问题

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

Unity DOTS系列之IJobChunk来迭代处理数据

最近DOTS发布了正式的版本, 我们来分享一下System中如何在System中使用IJobChunk来迭代处理World中的数据&#xff0c;方便大家上手学习掌握Unity DOTS开发。 再回顾一次基于ArcheType Chunk内存管理 我们先再次回顾以下基于ArcheType的Chunk内存管理。每一类Entity都是由一些…...

哈希——哈希表

回顾/本期梗概 上期我们学习了哈希——字符串哈希&#xff08;空降链接&#xff09;&#xff0c;本期我们将学习哈希中的哈希表。 1、哈希表原理 &#xff08;1&#xff09;使用数组下标直接标记元素 哈希表&#xff08;也叫数列表&#xff09;&#xff1a;是一种高效的、通过把…...

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模…...

已经30岁了,想转行从头开始现实吗?什么样的工作算好工作?

我是29岁那年&#xff0c;完成从转行裸辞副业的职业转型。 如果你把职业生涯看成是从现在开始30岁&#xff0c;到你退休那年&#xff0c;中间这么漫长的30年&#xff0c;那么30岁转行完全来得及&#xff1b; 如果你觉得必须在什么年纪&#xff0c;什么时间内必须完成赚到几十…...

快速理解docker(一)docker 简介

在当今快速迭代的软件开发环境中&#xff0c;如何高效地部署、管理和扩展应用程序成为了开发者们面临的重大挑战。Docker&#xff0c;作为一款开源的容器化平台&#xff0c;凭借其轻量级、可移植性和易于部署的特性&#xff0c;迅速成为了解决这些挑战的热门选择。本文将带您走…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...