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

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

相关文章

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me