数据结构之线性表(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;
}

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

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

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

相关文章

​2020-2024 idea最新安装激活

前言&#xff1a;怎么才能既免费&#xff0c;又能使用上正式版呢&#xff01;&#xff08;不是正版用不起&#xff0c;而是‘激活’更有性价比&#xff09; 1-2 下载安装&#xff0c;此处省略 记得安装好不要打开&#xff0c;看下一步。 3.开始 3.1打开idea 首先打开idea&am…

ChatGPT Prompt技术全攻略-总结篇:Prompt工程技术的未来发展

系列篇章&#x1f4a5; No.文章1ChatGPT Prompt技术全攻略-入门篇&#xff1a;AI提示工程基础2ChatGPT Prompt技术全攻略-进阶篇&#xff1a;深入Prompt工程技术3ChatGPT Prompt技术全攻略-高级篇&#xff1a;掌握高级Prompt工程技术4ChatGPT Prompt技术全攻略-应用篇&#xf…

● 343. 整数拆分 ● 96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 3…

Opencv基本操作

Opencv基本操作 导入并使用opencv进行图像与视频的基本处理 opencv读取的格式是BGR import cv2 #opencv读取的格式是BGR import numpy import matplotlib.pyplot as plt %matplotlib inline图像读取 通过cv2.imread()来加载指定位置的图像信息。 img cv2.imread(./res/ca…

公式转换坑

在线LaTeX公式编辑器-编辑器 (latexlive.com) 这个好用 latex输入后转mathtype等 1 \mathcal{V}\{0,1,\ldots,|\mathcal{V}|-1\} 这个玩意在Word死活打不出来 使用下面的方法也不行 mathtype也不行 故换符号之 LaTeX公式与MathType公式如何快速转换-MathType中文网 如何在…

1909java内部知识管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java内部知识管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开 发环境为TOMCAT7.0,Myeclipse8.5开发&…

解决windows11开机xbox自启动

1、同时按键盘“ctrlaltdelete”键&#xff0c;在弹出页面中选择任务管理器&#xff1b; 2、点击启动应用 3、找到软件Xbox App Services&#xff0c;选择“已启用”点击右键&#xff0c;点击禁用&#xff1b;

Redis使用中的性能优化——搭建Redis的监测服务

大纲 环境安装配置Redis安装 安装配置redis_exporter编译运行直接运行以服务形式运行 安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动 测试参考资料 抛开场景和数据&#xff0c;谈论性能优化&#xff0c;就是纸上谈兵。这个系列我们将通过相关数据…

【Python深度学习】——信息量|熵

【Python深度学习】——信息量|熵 假设1. 信息量1.1 含义1.2 信息量的公式: 2. 熵Entropy2. 含义2.2 熵的计算公式:2.3 熵的作用 假设 例子&#xff1a;掷硬币 假设我们有一个公平的硬币。这个硬币有两个面&#xff1a;正面&#xff08;H&#xff09;和反面&#xff08;T&…

Netty

优势 1.API使用简单&#xff0c;开发门槛低 2.功能强大&#xff0c;预置了多种编码功能&#xff0c;支持多种主流协议&#xff1b; 3.定制能力强&#xff0c;可以通过channelHandler对通信框架进行灵活地扩展&#xff1b; 4.性能高&#xff0c;通过与其他业界主流的NIO框架对比…

C++网络编程基础

文章目录 协议局域网通信IP 地址网络通信的本质tcp 和 udp 协议网络字节序网络主机数据转化接口 协议 协议&#xff1a;收到数据后&#xff0c;多出来的那一部分&#xff0c;也叫一种 “约定”&#xff0c;一整套的自硬件到软件&#xff0c;都有协议&#xff0c;需要有人定制&a…

对象存储OSS 客户端签名直传的安全风险和解决方法

1. 前言 阿里云对象存储OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;可提供99.9999999999%&#xff08;12个9&#xff09;的数据持久性&#xff0c;99.995%的数据可用性。多种存储类型供选择&#xff0c;全面…

探索国内大模型AIGC产品

​ 人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗…

在win11系统上安装启动Hyper-V

Hyper-V 是微软公司开发的一种虚拟化技术&#xff0c;它允许一台物理计算机运行多个操作系统和应用程序&#xff0c;从而提供更好的资源利用率和系统灵活性。 win系统的linux子系统开启、android studio的虚拟环境都需要这个东西&#xff0c;而在初始的win11系统上可能没有这个…

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

题目&#xff1a; 题解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # self.next Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:…

Redis实战篇02

1.分布式锁Redisson 简单介绍&#xff1a; 使用setnx可能会出现的极端问题&#xff1a; Redisson的简介&#xff1a; 简单的使用&#xff1a; 业务代码的改造&#xff1a; private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

【数据结构与算法】使用数组实现栈:原理、步骤与应用

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f384;栈&#xff08;Stack&#xff09;是什么&#xff1f; &#x1…

鸿蒙开发 之 数据持久化

1.用户首选项 用户首选项&#xff08;Preference&#xff09;为应用提供key-value键值型的数据处理能力&#xff0c;支持应对持久化轻量级数据&#xff0c;比如小说app的字体设置背景等 1.1案例 1.index.ets import RouterInfo from ../viewmodel/RouterInfo import IndexFo…

Redis Key过期监听配置

默认情况下在Windows系统中双击redis-server.exe用的是内置的配置文件 如果希望用这两个配置文件 redis.windows.conf&#xff1a;这是用于在Windows上运行Redis服务器的标准配置文件。可以使用这个文件通过命令行启动Redis服务器。redis.windows-service.conf&#xff1a;这是…

【全开源】房屋出租出售预约系统(FastAdmin+ThinkPHP+Uniapp)

房屋出租出售预约系统&#xff1a;一站式解决房产交易难题 一款基于FastAdminThinkPHPUniapp开发的房屋出租出售预约系统&#xff0c;支持小程序、H5、APP&#xff0c;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找…