C语言单链表

news/2024/5/5 9:32:08/文章来源:https://blog.csdn.net/knighthood2001/article/details/130455329

本节目标:

①定义单链表结构体

②初始化单链表

③单链表增加结点(头插法尾插法

④删除指定结点

⑤打印输出

目录

导入头文件

定义单链表结构体

初始化单链表

头插法

尾插法插入

删除指定结点

打印单链表

全部代码展示


导入头文件

#include <stdio.h>
#include <stdlib.h>

        <stdlib.h>中有我们需要动态分配内存的malloc()函数。

定义单链表结构体

typedef struct Node {int data;struct Node* next;
} Node;

这里我们使用typedef将struct Node命名为Node。

当然很多书以及代码中会使用到如下的

typedef struct Node {int data;struct Node* next;
} Node, *LinkList;

 这里它还定义了一个指向这个结点的指针,当然对于初学者(笔者也是初学者)来说。

使用*LinkList后,不太好理解,这里笔者就使用上述Node的版本。

初始化单链表

Node* initList() {//定义头结点Node* L = (Node*)malloc(sizeof(Node));L->data = 0;L->next = NULL;return L;

这里我们使用Node* initList()作为初始化的函数,返回的是Node类型。

首先使用malloc函数分配结点内存,sizeof表示将Node转化为对应的大小。

这样就 定义了L,当然你可以加个判断,看内存分配是否成功

接着将L的data域设置为0(这里没有明确规定需要,因为头结点的数据域可存可不存内容),L的指针域设置为NULL,最后返回L,最终初始化好了单链表。

头插法

void headInsert(Node* L, int data) {//1创建空间Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = L->next;L->next = node;//表示插入一个结点L->data++;
}

 对于初学者,可以记住传入的参数是Node* L,这里指的是传入头结点。

首先创建一个结点node;然后如下图操作

        首先将data赋值到结点中,将结点指向L的下一个结点,当然这下一个结点可以为NULL,因此不用分类讨论。最后将L指向新生成的结点,最后这步L->data++可以表示插入了一个结点。

尾插法插入

void tailInsert(Node* L, int data) {//定义头结点Node* head = L;//创建空间Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;//指针先移到第一个结点上,因为第一个是头结点L = L->next;//如果next指向存在,就说明不是最后一个结点while (L->next) {L = L->next;}L->next = node;head->data++;
}

上图下面的是尾插法:  

①由于尾插法,本文没有设置尾指针,是通过遍历的方法找到最后一个结点(L=L->next),且由于这里head->data++,因此需要在搞一个变量存头结点;

②先创建node结点,将data赋值进去,next指向NULL;

③由于第一个是头结点,我们需要L=L->next,然后在进行遍历找最后一个结点,找到后将L的next指向新生成的node结点,最后head++。

删除指定结点

void delete(Node* L, int data) {//头结点Node* pre = L;//第一个结点Node* current = L->next;while (current) {if (current->data == data) {pre->next = current->next;free(current);break;}pre = current;current = current -> next;}//头结点的数据域用来计数L->data--;
}

①首先删除结点需要找到被删除结点的前一个结点,因此我们定义一个pre;

②然后我们定义一个current,指向L的next;

③判断current是否为空,如果不为空的话,pre和current往后指向一个;

④判断结点的data是否和函数的data相同,如果相同的话,将pre的next指针指向current的下一个结点,然后将current结点释放。

⑤最后头结点的data减一。

打印单链表

void printflist(Node* L) {L = L->next;while (L) {printf("%d ", L->data);L = L->next;}printf("\n");
}

全部代码展示

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {int data;struct Node* next;
} Node;Node* initList() {//定义头结点Node* L = (Node*)malloc(sizeof(Node));L->data = 0;L->next = NULL;return L;
}
void headInsert(Node* L, int data) {//1创建空间Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = L->next;L->next = node;//表示插入一个元素L->data++;
}
void tailInsert(Node* L, int data) {//定义头结点Node* head = L;//创建空间Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;//指针先移到第一个结点上,因为第一个是头结点L = L->next;//如果next指向存在,就说明不是最后一个结点while (L->next) {L = L->next;}L->next = node;head->data++;
}
void delete(Node* L, int data) {//头结点Node* pre = L;//第一个结点Node* current = L->next;while (current) {if (current->data == data) {pre->next = current->next;free(current);break;}pre = current;current = current -> next;}//头结点的数据域用来计数L->data--;
}
void printflist(Node* L) {L = L->next;while (L) {printf("%d ", L->data);L = L->next;}printf("\n");
}
int main(){Node* L = initList();headInsert(L, 1);headInsert(L, 2);headInsert(L, 3);headInsert(L, 4);headInsert(L, 5);headInsert(L, 6);headInsert(L, 7);tailInsert(L, 8);tailInsert(L, 9);tailInsert(L, 10);printflist(L);delete(L, 5);delete(L, 1);delete(L, 10);printflist(L);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_296911.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文大模型安全性哪家强?清华团队新发布

当前大型语言模型的火爆程度我们不用再进行赘述了&#xff0c;伴随着百度文心一言打响国内商业大模型第一枪&#xff0c;华为盘古&#xff0c;阿里通义千问&#xff0c;智谱ChatGLM,科大讯飞星火等国内公司纷纷开始布局。 另一方面由于众所周知的政策原因&#xff0c;和如火如荼…

5 分钟教你如何免费用上 GPT-4

今天要分享的就是普通用户&#xff0c;没有 OpenAI 账号&#xff0c;不需要写代码&#xff0c;你依然可以免费体验 GPT-4&#xff0c;当然&#xff0c;会有一些缺点&#xff0c;本篇文章将会手把手教你怎么用上免费版的 GPT-4 以及它的一些限制。 第一步&#xff1a;打开 Stea…

Threejs进阶之十三:CSS3DRenderer与Tween.js实现粒子小球按规律变化

今天我们使用CSS3DRendererTween.js实现Threejs官方示例中的粒子小球按规律变化的效果&#xff0c;先看下最终实现的效果 先来分析下&#xff0c;这个页面的动画效果是由512个小球组合起来的四种不同变化&#xff0c;分别是曲面、立方体、随机和圆球四种变化&#xff1b;下面我…

UDP的报文结构

UDP 报文结构 基本上所有的教科书上都是这样画的图, 但实际上 UDP 报文结构不是这样的, 这样显示应该是容易排版. 正确应该如下图 : 端口号 : 每个端口号在 UDP 报文里占两个字节, 取值范围就是: 0 ~ 65535 源 ip 和源端口描述了数据从哪里来, 目的 ip 和目的端口描述了数据去哪…

文本的清洗和标准化:如何处理混乱的数据?

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

操作系统考试复习—第三章 优先级倒置 死锁问题

当前OS广泛采用优先级调度算法和抢占方式&#xff0c;然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为&#xff1a;在原本的调度算法设计中&#xff0c;高优先级进程可以抢占低优先级的CPU资源&#xff0c;先执行高优先级任务。但是存…

x265码控分析

D和R的关系 高分辨率量化 均匀量化&#xff1a;量化区间 ‘ Δ k y k − y k − 1 ‘ \Delta_ky_k-y_{k-1} ‘Δk​yk​−yk−1​‘&#xff0c;近似为常数&#xff1b;p(x)为信源概率密度函数&#xff0c;且 ‘ Δ k ‘ \Delta_k ‘Δk​‘的大小相对于p(x)的变化率充分小&…

电力NLP:指令票规范识别

文章目录 任务目的想法讲解数据集介绍1电气主语2操作任务判断数据集3操作内容判断数据集4错误词数据集 解法讲解程序、数据集下载链接 任务目的 识别调度指令票&#xff08;或者其它操作票&#xff09;是否规范。 想法讲解 按石第2014—16号定值单投入石双西线161开关6区保护…

突发!ChatGPT王炸级更新!支持GPT-4联网 Code Interpreter!

4月30日&#xff0c;OpenAI官方悄悄发布了联网版GPT-3.5。虽然名字变了&#xff0c;但使用体验却是换汤不换药&#xff0c;还是那套。 然而&#xff0c;万万没想到的是&#xff0c;刚过去没几天&#xff0c;昨天5月4日&#xff0c;鱼哥发现自己的Plus账号竟然多了一些能力&…

树莓派硬件介绍及配件选择

目录 树莓派Datasheet下载地址&#xff1a; Raspberry 4B 外观图&#xff1a; 技术规格书&#xff1a; 性能介绍&#xff1a; 树莓派配件选用 电源的选用&#xff1a; 树莓派外壳选用&#xff1a; 内存卡/U盘选用 树莓派Datasheet下载地址&#xff1a; Raspberry Pi …

C++11多线程:std::thread创建线程和std::async创建异步任务的区别,std::async创建异步任务后没有被推迟执行。

系列文章目录 文章目录 系列文章目录前言一、thread和async的区别1.1 新线程和异步任务1.2 std::async和std::thread最明显的不同&#xff0c;就是async有时候并不创建新线程。1.3 std::async和std::thread的区别1.4 std::async不确定性问题的解决 二、使用方法2.1 std::async创…

JVM学习随笔02——虚拟机内存区组成与内存溢出异常

一、Java虚拟机内存区组成图 1、程序计数器&#xff1a; 每个线程独占一个计数器&#xff0c;用来指示该线程下一条要执行的指令的地址。这一部分不会导致内存异常。PS&#xff1a;如果一个线程进入的是一般的Java方法&#xff0c;计数器指示的是下一条指令地址&#xff1b;如果…

浅谈“孔乙己”的长衫

书中的孔乙己 孔乙已是鲁迅笔下人物&#xff0c;穷困流倒还穿着象征读书人的长衫&#xff0c;迁腐、麻木。最近&#xff0c;大家自我调佩是“当代孔乙己”&#xff0c;学历成为思想负担&#xff0c;找工作时高不成低不就。 当代的“孔乙己” 如今社会&#xff0c;从小学开始每…

C# 学习abstract

abstract 顾名思义&#xff1a;抽象 从微软官方文档来看&#xff1a;abstract 修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用 abstract 修饰符来指示某个类仅用作其他类的基类&#xff0c;而不用于自行进行…

L4公司进军辅助驾驶,放话无图也能跑遍中国

作者 | Amy 编辑 | 德新 高阶智能驾驶走向规模量产&#xff0c;高精地图成为关键的门槛之一。今年&#xff0c;多家车企和智驾公司都喊出「不依赖高精地图&#xff0c;快速大规模落地」的口号。 华为、小鹏、元戎以及毫末等&#xff0c;可能是最快在国内量产 无高精图智…

服务器的基本概念与初始Ajax

1. 客户端与服务器 1.1 上网的目的 刷微博、看新闻、听歌、看电影。。。 本质目的&#xff1a;通过互联网的形式来获取和消费资源 1.2 服务器 上网过程中&#xff0c;负责存放和对外提供资源的电脑&#xff0c;叫做服务器。 1.3 客户端 上网过程中&#xff0c;负责获取…

nginx(七十三)nginx与Location响应头细节探讨

一 nginx与Location响应头细节探讨 ① 重定向和Location回顾 多种重定向跳转方式的差异 nginx之absolute_redirect、server_name_in_redirect、port_in_redirect 共同控制Location响应头 ② STS响应头导致307重定向 "第一次访问 http://www.baidu.com" 观察…

个人博客系统调试详细过程

系统功能的详细说明和源代码见以下链接:https://blog.csdn.net/shooter7/article/details/121180333相关的源码数据库文件、软件安装包可以联系博主koukou(壹壹23七2五六98) 调试过程如下&#xff1a; 文章目录 调试过程如下&#xff1a;一、数据库安装二、sql数据文件的导入三…

yolov5图像识别voc转yolo代码解析

https://github.com/ultralytics/JSON2YOLO https://blog.csdn.net/qq_51831335/article/details/127237772 目标检测数据集标签转换COCO2VOC、YOLO2VOC、JSON2YOLO <annotation><folder>VOC2007</folder><filename>000001.jpg</filename><s…

【2023/05/06】EDSAC

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第1天。 Share 去成为你本该成为的人&#xff0c;任何时候都不会太晚。 &#xff08;出处&#xff1a;乔治艾略特&#xff09; Day1 EDSAC&#xff1a;存储程序式计算机的开山之作。 part1 EDSAC&…