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

数据结构------单向链表。

一.实现单向链表的头插,头删,尾插,尾删,按位置插,按位置删,按位置修改,按元素查找,按元素修改,按元素删除,单链表的逆置,查找倒数第几个元素,释放内存。

头文件:head.h

 #ifndef __HEAD_H__                                                         #define __HEAD_H__                                                         #include <stdio.h>                                                         #include <string.h>                                                        #include <stdlib.h>                                                        typedef int datatype;                                                      enum passble{success,false=-1};                                            typedef struct Node                                                        {                                                                          datatype data;                                                         struct Node* next;                                                     }*Linklist;                                                                Linklist Create_Node();                                                    Linklist head_insert(Linklist head,datatype element);                      void show(Linklist head);                                                  Linklist head_delete(Linklist head);                                       Linklist tail_insert(Linklist head,datatype element);                      Linklist tail_delete(Linklist head);                                       int getlen(Linklist head);                                                 Linklist pos_insert(Linklist head,int pos,datatype element);               Linklist delete_index(Linklist head,int pos);                              Linklist change_index(Linklist head,int pos,datatype element);             int find_index(Linklist head,int pos);                                     int value(Linklist head,datatype element);                                 Linklist change_value(Linklist head,datatype element,datatype data1);      Linklist delete_value(Linklist head,datatype element);                     int find_value(Linklist head,int pos);                                     Linklist swap(Linklist head);                                              void free_list(Linklist head);                                             #endif                                                                     

测试文件(test.c)

#include"head.h"//创建节点
Linklist Create_Node()
{Linklist s=(Linklist)malloc(sizeof(struct Node));if(NULL==s)return NULL;s->data=0;s->next=NULL;return s;
}
//头插
Linklist head_insert(Linklist head,datatype element)
{Linklist s=Create_Node();s->data=element;if(NULL==head)head=s;else{s->next=head;head=s;}return head;
}//头删
Linklist head_delete(Linklist head)
{if(NULL==head)return NULL;Linklist p=head;head=head->next;free(p);p=NULL;return head;
}//尾插
Linklist tail_insert(Linklist head,datatype element)
{Linklist s=Create_Node();s->data=element;if(NULL==head){head=s;}{Linklist p=head;while(p->next){p=p->next;}p->next=s;}return head;
}//尾删
Linklist tail_delete(Linklist head)
{if(NULL==head)return NULL;else if(head->next==NULL){free(head);head=NULL;}else{Linklist p=head;while(p->next->next!=NULL){p=p->next;}free(p->next);p->next=NULL;}return head;
}//计算链表的长度
int getlen(Linklist head)
{int count=0;Linklist p=head;while(p){count++;p=p->next;}return count;
}//按位置插入值
Linklist pos_insert(Linklist head,int pos,datatype element)
{Linklist s=Create_Node();s->data=element;Linklist p=head;if(pos<1||pos>getlen(head)+1)return head;if(pos==1){head=head_insert(head,element);return head;}for(int i=1;i<pos-1;i++){p=p->next;}s->next=p->next;p->next=s;return head;
}//按位置删除
Linklist delete_index(Linklist head,int pos)
{if(pos<1||pos>getlen(head))return head;if(pos==1){head=head_delete(head);return head;}Linklist p=head;for(int i=1;i<pos-1;i++){p=p->next;}Linklist del=p->next;p->next=del->next;free(del);del=NULL;return head;
}//按位置修改
Linklist change_index(Linklist head,int pos,datatype element)
{//判断修改的位置是否合法if(pos<1||pos>getlen(head)){return head;}Linklist p=head;for(int i=1;i<pos;i++){p=p->next;}p->data=element;return head;}//按位置查找返回值
int find_index(Linklist head,int pos)
{if(NULL==head)return 0;if(pos<1||pos>getlen(head)){return 1 ;}Linklist p=head;for(int i=1;i<pos;i++){p=p->next;}return p->data;
}//按值查找返回位置
int value(Linklist head,datatype element)
{if(NULL==head)return 0;Linklist p=head;for(int i=1;i<=getlen(head);i++){if(p->data==element){return i;}p=p->next;}return 0;
}//按值修改
Linklist change_value(Linklist head,datatype element,datatype data1)
{int j=value(head,element);head=change_index(head,j,data1);return head;
}//按值删除
Linklist delete_value(Linklist head,datatype element)
{int j=value(head,element);head=delete_index(head,j);return head;
}//查找倒数第几个元素的值
int find_value(Linklist head,int pos)
{if(NULL==head)return 0;if(pos<1||pos>getlen(head))return 1;Linklist p=head;Linklist q=head;for(int i=1;i<pos;i++){p=p->next;}while(p->next){p=p->next;q=q->next;}return q->data;
}//单链表的逆置
Linklist swap(Linklist head)
{if(NULL==head)return head;if(getlen(head)==1)return head;Linklist p=head->next;head->next=NULL;while(p){Linklist s=p;p=p->next;s->next=head;head=s;}return head;
}//释放内存
void free_list(Linklist head)
{Linklist s=head;while(s){s=s->next;head=head_delete(head);}return ;
}//输出
void show(Linklist head)
{if(NULL==head){return;}Linklist p=head;while(p!=NULL){printf("%d\t",p->data);p=p->next;}putchar(10);
}

主文件(main.c)

#include"head.h"
int main(int argc, const char *argv[])
{//头插Linklist head=NULL;int n;datatype element;printf("请输入头插要插入几个数据:");scanf("%d",&n);for(int i=0;i<n;i++){printf("请输入头插插入的数据:");scanf("%d",&element);head=head_insert(head,element);}head=head_delete(head);      //头删show(head);//尾插printf("请输入尾插要插入几个数据:");scanf("%d",&n);for(int i=0;i<n;i++){printf("请输入尾插插入的数据:");scanf("%d",&element);head=tail_insert(head,element);}head=tail_delete(head);       //尾删show(head);int pos;                     //任意位置插printf("请输入要插入数据的位置:");scanf("%d",&pos);printf("请输入插入的数据:");scanf("%d",&element);head=pos_insert(head,pos,element);show(head);/*								//任意位置删printf("请输入要删除数据的位置:");scanf("%d",&pos);head=delete_index(head,pos);show(head);//任意位置修改printf("请输入要修改数据的位置:");scanf("%d",&pos);printf("请输入修改后的值:");scanf("%d",&element);head=change_index(head,pos,element);show(head);//按位置查找printf("请输入要查找的位置:");scanf("%d",&pos);datatype data=find_index(head,pos);if(data==0){printf("链表为空\n");}else if(data==1){printf("输入不合理\n");}else{printf("查找位置的值为:%d\n",data);}//按值查找返回位置printf("请输入要查找的值:");scanf("%d",&element);pos=value(head,element);if(pos==0){printf("没有这个元素\n");}else{printf("要查找的值的位置为:%d\n",pos);}//按值修改datatype data1;//修改后的值printf("请输入要修改的元素:");scanf("%d",&element);printf("请输入修改后的值:");scanf("%d",&data1);head=change_value(head,element,data1);show(head);
*///按值删除printf("请输入要删除的元素:");scanf("%d",&element);head=delete_value(head,element);show(head);//查找倒数第几个元素的值printf("请输入倒数的位置:");scanf("%d",&pos);int k=find_value(head,pos);if(k==0){printf("链表不存在");}else if(k==1){printf("输入的位置不合理");}else{printf("%d\n",k);}//单链表的逆置head=swap(head);printf("链表逆置后的结果为:\n");show(head);//释放内存free_list(head);return 0;
}

运行结果:

相关文章:

数据结构------单向链表。

一.实现单向链表的头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删&#xff0c;按位置插&#xff0c;按位置删&#xff0c;按位置修改&#xff0c;按元素查找&#xff0c;按元素修改&#xff0c;按元素删除&#xff0c;单链表的逆置&#xff0c;查找倒数第几个元素&…...

(.text+0x1b): undefined reference to `main‘

使用vscode Linux g编译出现 /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/Scrt1.o: in function _start: (.text0x1b): undefined reference to main collect2: error: ld returned 1 exit status make: *** [makefile:3: put] Error 1一定记得…...

各类系统Pycharm安装教程

各类系统Pycharm安装教程 一、安装前的准备 1. 系统要求 操作系统: Windows:Windows 10 或更高版本(64位)。macOS:macOS 10.14 或更高版本。Linux:Ubuntu 18.04+、Fedora 30+ 等主流发行版。硬件要求: 内存:至少 4GB(推荐 8GB 以上)。磁盘空间:至少 2.5GB 可用空间…...

算法——结合实例了解Minimax算法(极小化极大算法)

计算机科学中最有趣的事情之一就是编写一个人机博弈的程序。有大量的例子&#xff0c;最出名的是编写一个国际象棋的博弈机器。但不管是什么游戏&#xff0c;程序趋向于遵循一个被称为Minimax算法&#xff0c;伴随着各种各样的子算法在一块。本篇将简要介绍 minimax 算法&#…...

cornerstone3D学习笔记-MPR

最近在研究如何利用cornerstone3D (v1.70.13) 来实现MPR功能&#xff0c;找到它的一个demo -- volumeBasic, 运行效果如下图 看了下主程序的示例代码&#xff0c;非常简单&#xff0c;可以说corestone3D这个库把很多细节都封装起来了&#xff0c;使得调用者可以很简单的快速实…...

向量数据库是什么?「向量数据库详解」

目录 向量数据库详解 一、定义与核心概念 二、核心技术与组件 三、应用场景 四、与传统数据库的对比 五、典型技术框架 六、优缺点分析 七、AI领域的最新应用案例 八、总结 向量数据库详解 一、定义与核心概念 向量数据库是专门用于存储、检索和处理向量数据的数据库…...

C++ Primer 函数匹配

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

Dav_笔记14:优化程序提示 HINTs -4

指定全局表提示 指定表的提示通常是指发生提示的DELETE&#xff0c;SELECT或UPDATE查询块中的表&#xff0c;而不是指语句引用的任何视图中的表。 如果要为显示在视图中的表指定提示&#xff0c;Oracle建议使用全局提示&#xff0c;而不是在视图中嵌入提示。 您可以使用包含具…...

功率因素和电费的关系

功率因数与电费之间存在直接的关系&#xff0c;具体体现在功率因数调整电费上。 功率因数调整电费的定义 功率因数调整电费是指根据用户功率因数的水平高低&#xff0c;对用户的电费进行减收或增收的费用。这种调整机制旨在鼓励用户提高功率因数&#xff0c;减少无功功率的消…...

桥接模式 Bridge Pattern

桥接模式Abstraction 和 Implementor 的理解 在图书馆看到一本 通过电商项目真正实战《贯穿设计模式》。拿起来翻到了 桥接模式&#xff0c;感觉味道不对&#xff0c;和我印象中不一样。 感谢这位同学提供的源码 贯穿设计模式-适配器模式桥接模式_-CSDN博客GitHub - WeiXiao…...

C# SpinLock 类 使用详解

总目录 前言 SpinLock 是 C# 中一种轻量级的自旋锁&#xff0c;属于 System.Threading 命名空间&#xff0c;专为极短时间锁竞争的高性能场景设计。它通过忙等待&#xff08;自旋&#xff09;而非阻塞线程来减少上下文切换开销&#xff0c;适用于锁持有时间极短&#xff08;如…...

Ubuntu 安装 OpenCV (C++)

版本详情&#xff1a; Ubuntu: 22.04 5.15.0-133-generic gcc: 11.4.0 g: 11.4.0 OpenCV: 4.7.0 1. 卸载 OpenCV 进入原先编译 opencv 的 build 目录&#xff0c;在该目录下打开终端&#xff0c;执行以下代码&#xff08;如果 build 已经删除了&#xff0c;可以重新编译一…...

推荐两个比较好用的流程图js库

React Flow 和 Logic Flow 是两个用于构建流程图的 JavaScript 库&#xff0c;适用于不同的场景和需求。以下是它们的简要介绍和对比&#xff1a; React Flow React Flow 是一个基于 React 的流程图库&#xff0c;专注于构建高度可定制的节点和边。它适用于需要复杂交互和数据…...

前端模板引擎

前言 正常渲染拿到数据后渲染&#xff0c;三步走&#xff1a;格式化数据、编译模板、渲染数据 如下例 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…...

Linux /dev/null

/dev/null 是 Linux 和类 Unix 系统中一个特殊且非常有用的设备文件&#xff0c;也被称为空设备。下面为你详细介绍它的特点、用途和使用示例。 特点 写入丢弃&#xff1a;当向 /dev/null 写入数据时&#xff0c;这些数据会被立即丢弃&#xff0c;不会被保存到任何地方&#…...

ubuntu安装docker 无法拉取问题

sudo docker run hello-world [sudo] ubuntu 的密码&#xff1a; Unable to find image hello-world:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awai…...

深入理解Kubernetes:容器编排的中流砥柱

Kubernetes容器编排 在云原生技术蓬勃发展的当下&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;已成为容器编排领域的事实标准&#xff0c;为现代应用的部署、管理与扩展提供了强大支持。 K8s的核心优势之一是其卓越的容器编排能力 在传统应用部署模式下&#xff0c;…...

长尾词SEO优化软件:企业官网流量提升的软件【实测】

搜索引擎流量中68%来自长尾关键词&#xff08;数据来源&#xff1a;Ahrefs 2025&#xff09;&#xff0c;但83%企业仍困于「高价值长尾词难挖掘内容生产跟不上」的双重困境。当同行用智能工具批量布局「孕妇防辐射服哪个牌子好」等精准词时&#xff0c;手动分析数据的你可能还在…...

用自己的数据训练yolov11目标检测

文章目录 概要理论知识整体架构流程架构优化多任务支持多参数体量 操作实操环境配置数据准备数据标注数据放置路径 训练预测 概要 YOLOv11 是 Ultralytics 团队于 2024 年 9 月 30 日发布的最新目标检测模型&#xff0c;延续了 YOLO 系列实时推理特性&#xff0c;同时通过架构优…...

gsoap实现webservice服务

gsoap实现webservice服务 在实现Web服务时&#xff0c;使用gSOAP是一个很好的选择&#xff0c;因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C语言开发的库&#xff0c;它支持SOAP协议的各种版本&#xff0c;包括SOAP 1.1和SOAP 1.2。下面是如何使用gSO…...

相比于WebSocket,SSE更适合轻量级

一、 前言 项目首页有一个待办任务数量和消息提醒数量的展示&#xff08;单向数据的展示 &#xff09;&#xff0c;之前使用了定时器&#xff0c;每隔十秒钟发送一次请求到后端接口拿数据&#xff0c;这也就是我们常说的轮询做法。 1. 轮询的缺点 我们都知道轮询的缺点有几种…...

项目2 数据可视化--- 第十五章 生成数据

数据分析是使用代码来探索数据内的规律和关联。 数据可视化是通过可视化表示来 探索和呈现数据集内的规律。 好的数据可视化&#xff0c;可以发现数据集中未知的规律和意义。 一个流行的工具是Matplotlib&#xff0c;他是一个数据绘图库&#xff1b; 还有Plotly包&#xff…...

【Maven私服配置】

Maven私服配置 对于一些中央的pom&#xff0c;应该配置对应的mirror镜像访问 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirr…...

QT (四)模型/视图 QFileSystemModel,QStringListModel,QStandardItemModel

思考&#xff1a;QTableWidget 在某种程度上可以等价为QStandardItemModel&#xff0c;同理&#xff0c;其他的功能也有类似的等价&#xff0c;但是以当前的QTableWidget 和QStandardItemModel为例的话&#xff0c;两者都是用于实现建立表格的相关组件&#xff0c;只不过QStand…...

BSD实现:单播

分用单播数据报 如果程序执行到这里&#xff0c;说明程序并没有执行多播操作&#xff0c;那么大概率是单播。 维护缓存指针 udp_last_inpcb是上一次接收数据报的端口的控制块指针&#xff0c;维护该指针的依据是许多程序往往具有时间局部性&#xff0c;也就是&#xff1a;经…...

. Unable to find a @SpringBootConfiguration(默认软件包中的 Spring Boot 应用程序)

解决&#xff1a; 新建一个包即可 问题&#xff1a; 默认软件包中的 Spring Boot 应用程序。 原因&#xff1a; 默认包的定义 &#xff1a; 如果一个 Java 类没有使用 package 声明包名&#xff0c;则该类会被放置在默认包中。Spring Boot 遵循 Java 的包管理约定&#xff…...

【前端知识】浏览器兼容方案polyfill

浏览器兼容方案polyfill 什么是 Polyfill&#xff1f;Polyfill 的作用Polyfill 的工作原理1. **特性检测**2. **加载 Polyfill**3. **模拟实现** Polyfill 的常见场景Polyfill 的使用方式Polyfill 的优缺点优点缺点 常见的 Polyfill 库总结 什么是 Polyfill&#xff1f; Polyf…...

互信息的定义与公式

互信息 定义公式 从条件熵中我们知道&#xff0c;当获取的信息和要研究的食物”有关系时“&#xff0c;这些信息才能帮助我们消除不确定性。如何衡量获取信息和要研究事物“有关系”呢&#xff1f;比如常识告诉我们&#xff0c;一个随机事件“今天深圳下雨”和另一个随机事件“…...

(算法基础——树)——python树结构使用指南

1. 树的定义与实现 树是一种非线性数据结构&#xff0c;常用于解决层次化数据问题&#xff08;如路径搜索、二叉树遍历等&#xff09;。以下是树的两种常见实现方式&#xff1a; (1) 类&#xff08;Class&#xff09;实现 class TreeNode:def __init__(self, val0, leftNone…...

【小白学AI系列】NLP 核心知识点(七)Embedding概念介绍

Embedding&#xff08;嵌入&#xff09; 是自然语言处理&#xff08;NLP&#xff09;中非常重要的概念。简单来说&#xff0c;embedding 是一种将离散的、稀疏的、不可直接计算的对象&#xff08;比如词、字符或句子&#xff09;转换为 密集的、连续的向量表示 的技术。 这个向…...