无头单链表基本操作的实现

2024-02-25 19:58

本文主要是介绍无头单链表基本操作的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先 . 看一下我们要实现的基本功能;,实现以下链表的基本操作

typedef int DataType;

typedef struct Node
{
struct Node* _pNext;
DataType _data;
}Node, *PNode;


//不带头结点的单链表//
// .h
// 链表初始化
void SListInit(PNode* pHead);

// 尾插
void SListPushBack(PNode* pHead, DataType data);

// 尾删
void SListPopBack(PNode* pHead);

// 头插
void SListPushFront(PNode* pHead, DataType data);

// 头删
void SListPopFront(PNode* pHead);

// 查找值为data的结点,返回该结点在链表中的位置
PNode SListFind(PNode pHead, DataType data);

// 在链表pos位置后插入结点data
void SListInsert(PNode* pHead, PNode pos, DataType data);

// 删除链表pos位置上的结点
void SListErase(PNode* pHead, PNode pos);

// 销毁单链表
void SListDestroy(PNode* pHead);

// 求链表中结点的个数
int SListSize(PNode pHead);

// 将链表中的结点清空
void SListClear(PNode* pHead);

// 获取结点
PNode BuySListNode(DataType data);

// 获取链表中的最后一个结点,返回该结点的地址
PNode SListBack(PNode pHead);

///
然后在.h中声明要实现的功能:看代码:

#include<assert.h>
#include<stdio.h>
typedef int DataType;typedef struct Node
{struct Node* _pNext;DataType _data;
}Node, *PNode;//不带头结点的单链表// 
// .h 
// 链表初始化 
void SListInit(PNode* ppHead);//新节点的申请
PNode NewNode(DataType data);// 尾插 
void SListPushBack(PNode* ppHead, DataType data);// 尾删 
void SListPopBack(PNode* ppHead);// 头插 
void SListPushFront(PNode* ppHead, DataType data);// 头删 
void SListPopFront(PNode* ppHead);// 查找值为data的结点,返回该结点在链表中的位置 
PNode SListFind(PNode pHead, DataType data);// 在链表pos位置后插入结点data 
void SListInsert(PNode* ppHead, PNode pos, DataType data);// 删除链表pos位置上的结点 
void SListErase(PNode* ppHead, PNode pos);// 销毁单链表 
void SListDestroy(PNode* ppHead);// 求链表中结点的个数 
int SListSize(PNode pHead);// 将链表中的结点清空 
void SListClear(PNode* ppHead);// 获取结点 
PNode BuySListNode(DataType data);// 获取链表中的最后一个结点,返回该结点的地址 
PNode SListBack(PNode pHead);

然后在.c文件中来实现这波功能:

#define _CRT_SECURE_NO_WARNINGS 
#include "标头.h";
void SListInit(PNode* ppHead){// 链表初始化assert(ppHead);*ppHead = NULL;
}
//新节点的申请
PNode NewNode(DataType data){PNode PNewnode = (PNode)malloc(sizeof(Node));if (NULL == PNewnode){return NULL;}PNewnode->_pNext = NULL;PNewnode->_data = data;return PNewnode;
}
// 尾插 
void SListPushBack(PNode* ppHead, DataType data){assert(ppHead);PNode pnewnode = NULL;pnewnode = NewNode(data);if (NULL == pnewnode){return NULL;}if (NULL == *ppHead){*ppHead = pnewnode;}else{PNode pcurnode = *ppHead;while (pcurnode->_pNext != NULL){pcurnode = pcurnode->_pNext;}pcurnode->_pNext = pnewnode;}
}
// 尾删 
void SListPopBack(PNode* ppHead){assert(ppHead);if (NULL == *ppHead){return NULL;}else if ((*ppHead)->_pNext == NULL){free(*ppHead);*ppHead = NULL;}else{PNode pcurnode = *ppHead;while (NULL != pcurnode->_pNext->_pNext){pcurnode = pcurnode->_pNext;}free(pcurnode->_pNext);pcurnode = NULL;}
}
// 头插 
void SListPushFront(PNode* ppHead, DataType data){assert(ppHead);PNode pnewnode = NULL;pnewnode = NewNode(data);if (NULL == pnewnode){return NULL;}pnewnode->_pNext = *ppHead;*ppHead = pnewnode;
}
// 头删 
void SListPopFront(PNode* ppHead){assert(ppHead);if (NULL == *ppHead){return NULL;}else{DataType deldata = *ppHead;*ppHead = (*ppHead)->_pNext;free(deldata);}}
// 查找值为data的结点,返回该结点在链表中的位置 
PNode SListFind(PNode pHead, DataType data){if (NULL == pHead){return NULL;}PNode pcurnode = NULL;while (pcurnode!=NULL){if (pcurnode->_data == data){return pcurnode;}}return NULL;
}
// 在链表pos位置后插入结点data 
void SListInsert(PNode* ppHead, PNode pos, DataType data){assert(ppHead);if (*ppHead == NULL || pos == NULL){return;}PNode pnewnode = NULL;pnewnode = NewNode(data);if (NULL == pnewnode){return NULL;}pnewnode->_pNext = pos->_pNext;pos->_pNext = pnewnode;}
// 删除链表pos位置上的结点 
void SListErase(PNode* ppHead, PNode pos){assert(ppHead);if (*ppHead == NULL || pos == NULL){return;}if (pos == *ppHead){SListPopFront(ppHead);}else{PNode pcurnode = *ppHead;while (pcurnode->_pNext != pos){pcurnode = pcurnode->_pNext;}pcurnode->_pNext = pos->_pNext;free(pos);}
}
// 销毁单链表 
void SListDestroy(PNode* ppHead){PNode pdelnode = NULL;assert(ppHead);while (*ppHead){pdelnode = *ppHead;*ppHead = (*ppHead)->_pNext;free(pdelnode);}
}
// 求链表中结点的个数 
int SListSize(PNode pHead){PNode pcurnode = pHead;int count = 0;while(pcurnode){count++;pcurnode = pcurnode->_pNext;}return count;
}
// 将链表中的结点清空 
void SListClear(PNode* ppHead){SListDestroy(ppHead);
}

然后,就可以写一个test.c文件来测这波功能啦(可以开个监视窗口来检测一下是否正确

这篇关于无头单链表基本操作的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746543

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand