数据结构之线性表(3)

数据结构之线性表(3)

上文我们了解了线性表的静动态存储的相关操作,此篇我们对线性表中链表的相关操作探讨。
在进行链表的相关操作时,我们先来理解单链表是什么?

1.链表的概念及结构

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
在这里插入图片描述

//单链表的结点定义
struct SeqListNode
{datatype data;struct SLNode * next;
};
typedef struct SeqListNode SLNode;

在这里插入图片描述

单链表的基本操作:

1.头插

//头插
void SLNpushfront(SLNode** pphead,datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tmp = (SLNode*)malloc(sizeof(SLNode));tmp->data = x;tmp->next = *pphead;*pphead = tmp;}
}

2.尾插

//尾插
void SLNpushback(SLNode** pphead, datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));tail->next = newnode;newnode->data = x;newnode->next = NULL;}
}

3.头删

//头删
void SLNpopfront(SLNode** pphead)
{//1.链表中0个结点,无法删除if (*pphead == NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点if ((*pphead)->next == NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* tmp = (*pphead)->next;free(*pphead);(*pphead) = NULL;*pphead = tmp;
}

4.尾删

//尾删
void SLNpopback(SLNode** pphead)
{//1.链表中0个结点if (*pphead ==NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点,就类似于只有一个结点的头删if ((*pphead)->next ==NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* prev = NULL;SLNode* tail = (*pphead);while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;
}

5.打印

//打印
void SLNprintf(SLNode* pphead)
{while (pphead){printf("%d ", pphead->data);pphead = pphead->next;}
}

6.查找

//查找
SLNode* SLNfind(SLNode* phead, datatype x)
{SLNode* cur = phead;while (cur != NULL){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}

7.指定位置插入

//指定位置插入
void SLNinsert(SLNode** pphead, SLNode* pos, datatype x)
{if (pos == *pphead){SLNpushfront(pphead, x);//若pos==*pphead,就等同于头插}else{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;}
}

7.指定位置删除

void SLNdeleate(SLNode** pphead, SLNode* pos)
{if (pos == *pphead){SLNpopfront(pphead);//若pos==*pphead,就等同于头删}else{SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
//单链表结点的定义
struct SeqListNode
{datatype data;struct SLNode* next;
};
typedef struct SeqListNode SLNode;
//头插
void SLNpushfront(SLNode** pphead,datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tmp = (SLNode*)malloc(sizeof(SLNode));tmp->data = x;tmp->next = *pphead;*pphead = tmp;}
}
//尾插
void SLNpushback(SLNode** pphead, datatype x)
{//1.不存在其他结点if (*pphead == NULL){SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;*pphead = newnode;}else{//2.存在其他结点SLNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));tail->next = newnode;newnode->data = x;newnode->next = NULL;}
}
//头删
void SLNpopfront(SLNode** pphead)
{//1.0个结点,无法删除if (*pphead == NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点if ((*pphead)->next == NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* tmp = (*pphead)->next;free(*pphead);(*pphead) = NULL;*pphead = tmp;
}
//尾删
void SLNpopback(SLNode** pphead)
{//1.链表中0个结点if (*pphead ==NULL){printf("链表中没有结点,无法删除\n");exit(-1);}//2.链表中只有一个结点,就类似于只有一个结点的头删if ((*pphead)->next ==NULL){free(*pphead);(*pphead) = NULL;}//3.链表中有一个以上结点SLNode* prev = NULL;SLNode* tail = (*pphead);while (tail->next != NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;
}
//打印
void SLNprintf(SLNode* pphead)
{while (pphead){printf("%d ", pphead->data);pphead = pphead->next;}
}
//指定位置插入
void SLNinsert(SLNode** pphead, SLNode* pos, datatype x)
{if (pos == *pphead){SLNpushfront(pphead, x);}else{SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));newnode->data = x;newnode->next = NULL;SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;}
}
//指定位置删除
void SLNdeleate(SLNode** pphead, SLNode* pos)
{if (pos == *pphead){SLNpopfront(pphead);}else{SLNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}
//查找
SLNode* SLNfind(SLNode* phead, datatype x)
{SLNode* cur = phead;while (cur != NULL){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
int main()
{SLNode* plist = NULL;SLNpushfront(&plist, 1);SLNpushfront(&plist, 2);SLNpushfront(&plist, 3);SLNpushback(&plist, 4);SLNpushback(&plist, 5);SLNpushback(&plist, 6);SLNpushback(&plist, 7);SLNpopfront(&plist);SLNpopback(&plist);SLNprintf(plist);return 0;
}

以上就是单链表中最简单的一种结构的相关操作啦,谢谢大家支持。
在这里插入图片描述

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

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

相关文章

【UCOS-III】中断管理

引言&#xff1a;中断是学习 C/OS-III 的过程中一个重要的部分&#xff0c;任务切换、系统时钟节拍等等&#xff0c;都是利用 中断来完成的&#xff0c;并且&#xff0c;既然是 RTOS&#xff0c;那么对中断的响应也应该是十分迅速的。C/OS-III 有一 套中断管理的方法&#xff0…

echarts组件x轴坐标显示不全解决方法

1.旋转: 修改前: option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun,Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [120, 200, 150, 80, 70, 110, 130,120, 200, 150, 80, 70, 1…

每日一练——删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; int removeDuplicates(int* nums, int numsSize) {int i 0;int j 0;while(numsSize--){if(nums[i] ! nums[j]){i;nums[i] nums[j];j;}else j;}return i 1; }

Golang | Leetcode Golang题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; func detectCycle(head *ListNode) *ListNode {slow, fast : head, headfor fast ! nil {slow slow.Nextif fast.Next nil {return nil}fast fast.Next.Nextif fast slow {p : headfor p ! slow {p p.Nextslow slow.Next}return p}}r…

AI数据分析:根据Excel表格数据绘制柱形图

工作任务&#xff1a;将Excel文件中2013年至2019年间线上图书的销售额&#xff0c;以条形图的形式呈现&#xff0c;每个条形的高度代表相应年份的销售额&#xff0c;同时在每个条形上方标注具体的销售额数值 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#…

eNSP学习——RIP的路由引入

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建公司B的RIP网络 3、优化公司B的 RIP网络 4、连接公司A与公司B的网络 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PDF版_ensp…

[Leetcode]同时进行正向和逆向迭代匹配解决回文链表问题

题目链接:234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题解&#xff1a; currentNode 指针是先到尾节点&#xff0c;由于递归的特性再从后往前进行比较。frontPointer 是递归函数外的指针。若 currentNode.val ! frontPointer.val 则返回 false。…

876. 链表的中间结点-链表

876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 快慢指针 class Solution { public:ListNode* middleNode(ListNode* head) {ListNode* slow head;ListNode* fast head;while(fast ! nullptr && fast->next ! nullptr){slow slow->next;fast …

用MATLAB绘制地球围绕太远运动而月球围绕地球运动

绘制 MATLAB代码: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% 初始化参数 num_frames 1000; % 动画帧数 G200; dt 0.01; % 时间步长% 设置太阳、地球和月球的初始位置和半径 sun_position [0, 0]; earth_radius …

Leetcode881. 救生艇

Every day a Leetcode 题目来源&#xff1a;881. 救生艇 解法1&#xff1a;贪心 排序 双指针 排序后&#xff0c;使用双指针分别指向数组首尾&#xff0c;每次取两个指针指向的元素之和与 limit 比较&#xff0c;如果小于等于 limit&#xff0c;则两个指针同时向中间移动一…

Android Studio历史版本

android studio的历史版本

HQL面试题练习 —— 累加刚好超过各省GDP40%的地市名称

目录 1 题目2 建表语句3 题解 1 题目 现有各省地级市的gdp数据&#xff0c;求从高到底累加刚好超过各省GDP40%的地市名称&#xff0c;临界地市也需要。例如&#xff1a; 浙江省的杭州24% 宁波 20% ,杭州宁波44% 大于40% 取出杭州、宁波 江苏省的苏州19% 南京 14% 无锡 12%&am…

2.nginx常用命令

使用nginx命令需要进入nginx目录里面执行。 /usr/local/nginx/sbin/ 查看nginx的版本号 启动nginx ./nginx 关闭nginx ./nginx -s stop 查看nginx的是否运行的命令 重新加载nginx 针对配置目录中配置文件nginx.cnf修改后需要重新加载 /usr/local/nginx/conf/nginx.cnf …

【数学】各种图面积公式的推导

Hello&#xff01;大家好&#xff0c;我是学霸小羊&#xff0c;今天讲讲面积公式。 1.长方形 长方形是 由无数条 长度为长方形的长&#xff08;或宽&#xff09;的线 组成的图形&#xff0c;这些线有多少根&#xff0c;我们不知道&#xff0c;只需要知道他们垒成了一个由高 宽…

Mysql执行一条语句都有哪些操作

Mysql的执行流程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层&#xff0c; Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包括连接器&#xff0c;查询缓存、解析器、预处理器、优化器、执行器等。另外&#xf…

鸿蒙轻内核M核源码分析系列十九 Musl LibC

LiteOS-M内核LibC实现有2种&#xff0c;可以根据需求进行二选一&#xff0c;分别是musl libC和newlibc。本文先学习下Musl LibC的实现代码。文中所涉及的源码&#xff0c;均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_m 获取。LiteOS-M内核提供了和内核相关的…

基于小波样条框架的一维时间序列信号降噪方法(MATLAB R2018A)

1952年&#xff0c;DUFFIN在研究非调和Fourier级数时引入了Hilbert空间中框架的概念&#xff0c;然而并没有引起很大的反响。1986年&#xff0c;DAUBECHIES研究发现利用框架可以将L2(R)中的函数展开成类似标准正交基的级数&#xff0c;并且用框架研究函数时所需的条件要比用标准…

多态的应用——数组多态

介绍 ai查询 在Java中&#xff0c;动态数组通常通过ArrayList类来实现&#xff0c;它是Java集合框架&#xff08;Java Collections Framework&#xff09;的一部分。ArrayList是一个可调整大小的数组实现&#xff0c;提供了比标准数组更多的灵活性和功能。 以下是使用ArrayLis…

基于51单片机的MQ-2烟雾报警设计

随着现代家庭用火、用电量的增加,家庭烟雾发生的频率越来越高。烟雾报警器也随之被广泛应用于各种场合。本课题所研究的无线多功能烟雾报警器采用STC89C51为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环…

前端技术回顾系列 08|TS 泛型基础

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对你有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供一些动力。 上篇内容回顾:枚举(Enums) 在上篇文章中,我们详细回顾了 TypeScript 中的 枚举(Enums)。 枚举 是一…