[C语言][数据结构][链表] 单链表的从零实现!

这篇具有很好参考价值的文章主要介绍了[C语言][数据结构][链表] 单链表的从零实现!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

零.必备知识

1.一级指针 && 二级指针

2. 节点的成员列表

    a.数据

    b.指向下一个节点的指针.

3. 动态内存空间的开辟 (malloc-calloc-realloc)

一.单链表的实现与销毁 

        1.1 节点的定义

        1.2 单链表的尾插

        1.3 单链表的头插

        1.4 单链表的尾删

        1.5 单链表的头删 

        1.6 单链表的查找

        1.7 在指定位置之前插入数据

        1.8 在指定位置之后插入数据

        1.9 删除指定位置的数据

        1.10 删除指定位置之后的数据

        1.11 销毁单链表 

二. 单链表源码

SingleList.h

SingleList.c 


零.必备知识

1.一级指针 && 二级指针

2. 节点的成员列表

    a.数据

    b.指向下一个节点的指针.

3. 动态内存空间的开辟 (malloc-calloc-realloc)


一.单链表的实现与销毁 

注:具体解释都在代码的注释中!(在代码中具体分析)

        1.1 节点的定义

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.2 单链表的尾插

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

 

        1.3 单链表的头插

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

 [C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.4 单链表的尾删

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.5 单链表的头删 

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.6 单链表的查找

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.7 在指定位置之前插入数据

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.8 在指定位置之后插入数据

        [C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

 

        1.9 删除指定位置的数据

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.10 删除指定位置之后的数据

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode

        1.11 销毁单链表 

[C语言][数据结构][链表] 单链表的从零实现!,C语言阶段相关习题总览,数据结构,c语言,链表,算法,开发语言,leetcode文章来源地址https://www.toymoban.com/news/detail-847183.html

二. 单链表源码

SingleList.h

#define  _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

// 节点的定义
typedef int SLTDateType;
typedef struct SingleListNode
{
	SLTDateType date;
	struct SingleListNode* next;
}SLTNode;

// 单链表的展示
void SLTPrint(SLTNode* phead);
// 单链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);
// 单链表的头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);
// 单链表的尾删
void SLTPopBack(SLTNode** pphead);
// 单链表的头删
void SLTPopFront(SLTNode** pphead);
// 单链表的查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x);
// 在指定位置之前插入数据
void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x);
// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x);
// 删除指定位置的数据
void SLTErase(SLTNode** pphead, SLTNode* pos);
// 删除指定位置之后的数据
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos);
// 销毁单链表
void SLTDestroy(SLTNode** pphead);

SingleList.c 

#define  _CRT_SECURE_NO_WARNINGS
#include "SingleList.h"
// 单链表的展示
void SLTPrint(SLTNode* phead)
{
	SLTNode* pcur = phead; //current 当前的,现在的  currect 正确的
	while (pcur != NULL) {
		printf("%d->", pcur->date);
		pcur = pcur->next;
	}
	printf("NULL\n");
}
// 节点的创造
SLTNode* SLTCreat(SLTDateType x)
{
	SLTNode* newNode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newNode == NULL) {
		printf("创建失败!\n");
		exit(1);
	}
	newNode->date = x;
	newNode->next = NULL;
	return newNode;
}
// 单链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	// 创建节点
	SLTNode* newNode = SLTCreat(x);
	// 没有节点
	if ((*pphead) == NULL) {
		(*pphead) = newNode;
	}
	else { // 有一个或多个节点
		SLTNode* pcur = (*pphead);
		while (pcur->next != NULL) {
			pcur = pcur->next;
		}
		pcur->next = newNode;
	}
}
// 单链表的头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* pcur = (*pphead);
	// 创建节点
	SLTNode* newNode = SLTCreat(x);
	// 没有节点
	if ((*pphead) == NULL) {
		(*pphead) = newNode;
	}
	else { // 有一个或者多个节点
		newNode->next = (*pphead);
		(*pphead) = newNode;
	}
}
// 单链表的尾删
void SLTPopBack(SLTNode** pphead)
{
	assert(pphead && (*pphead));
	SLTNode* pcur = (*pphead);
	SLTNode* prev = (*pphead);
	// 只有一个节点
	if (pcur->next == NULL) {
		free(*pphead);
		(*pphead) = NULL;
		pcur = NULL;
		prev = NULL;
	}
	else { // 有多个节点
		while (pcur->next != NULL) {
			prev = pcur;
			pcur = pcur->next;
		}
		free(pcur);
		pcur = NULL;
		prev->next = NULL;
	}
}
// 单链表的头删
void SLTPopFront(SLTNode** pphead)
{
	assert(pphead && (*pphead));
	SLTNode* pcur = (*pphead);
	// 只有一个节点
	if (pcur->next == NULL) {
		free(*pphead);
		(*pphead) = NULL;
		pcur = NULL;
	}
	else { //有多个节点
		(*pphead) = (*pphead)->next;
		free(pcur);
		pcur = NULL;
	}
}
// 单链表的查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x)
{
	SLTNode* pcur = phead;
	while (pcur != NULL) {
		if (pcur->date == x) {
			printf("找到了!\n");
			return pcur;
		}
		pcur = pcur->next;
	}
	printf("找不到!\n");
	return NULL;
}
// 在指定位置之前插入数据
void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead);
	SLTNode* pcur = (*pphead);
	// 创建节点
	SLTNode* newNode = SLTCreat(x);
	// 头插
	if (pos == (*pphead) || (*pphead) == NULL) {
		SLTPushFront(pphead, x);
	}
	else { //正常插入
		while (pcur->next != NULL) {
			if (pcur->next == pos) {
				newNode->next = pcur->next;
				pcur->next = newNode;
				break;
			}
			pcur = pcur->next;
		}
	}
}
// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead);
	// 创建节点
	SLTNode* newNode = SLTCreat(x);
	if ((*pphead) == NULL || pos == (*pphead)) {
		// 尾插
		SLTPushBack(pphead, x);
	}
	else { //正常插入
		SLTNode* pcur = (*pphead);
		while (pcur->next != NULL) {
			if (pcur == pos) {
				newNode->next = pcur->next;
				pcur->next = newNode;
				break;
			}
			pcur = pcur->next;
		}
	}
}
// 删除指定位置的数据
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && (*pphead));
	// 处理特殊情况(头删)
	if ((*pphead) == pos) {
		SLTPopFront(pphead);
	}
	else {
		SLTNode* prev = (*pphead);
		SLTNode* pcur = (*pphead);
		while (pcur != NULL) {
			if (pcur == pos) {
				prev->next = pcur->next;
				free(pcur);
				pcur = NULL;
				prev = NULL;
				break;
			}
			prev = pcur;
			pcur = pcur->next;
		}
	}
}
// 删除指定位置之后的数据
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && (*pphead));
	SLTNode* pcur = (*pphead);
	while (pcur->next != NULL) {
		if (pcur == pos) {
			SLTNode* tmp = pcur->next;
			pcur->next = pcur->next->next;
			free(tmp);
			tmp = NULL;
			break;
		}
		pcur = pcur->next;
	}
}
// 销毁单链表
void SLTDestroy(SLTNode** pphead)
{
	assert(pphead && (*pphead));
	SLTNode* pcur = (*pphead);
	SLTNode* prev = (*pphead);
	while (pcur != NULL) {
		prev = pcur;
		pcur = pcur->next;
		free(prev);
	}
	prev = NULL;
	(*pphead) = NULL;
}

到了这里,关于[C语言][数据结构][链表] 单链表的从零实现!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一起学数据结构(3)——万字解析:链表的概念及单链表的实现

    上篇文章介绍了数据结构的一些基本概念,以及顺序表的概念和实现,本文来介绍链表的概念和单链表的实现,在此之前,首先来回顾以下顺序表的特点: 1. 顺序表是一组地址连续的存储单元依次存储的线性表的数据结构,逻辑上:顺序表中相邻的数据元素,其物理次序也是

    2024年02月13日
    浏览(54)
  • 数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)

    目录  一.什么是链表 二.链表的实现 节点的插入 头插法 尾插法 指定位置插入 节点的删除 删除第一次出现的节点 删除所有节点 节点的查找 链表的清空 链表的长度 前言: 在上一篇文章中,我们认识了线性数据结构中的顺序表,而本篇文章则是介绍线性数据结

    2024年02月05日
    浏览(61)
  • 数据结构:单链表的实现(C语言)

    个人主页 : 水月梦镜花 个人专栏 : 《C语言》 《数据结构》 本博客将要实现的无头单向不循环链表。 我们将节点定义为如下结构: 其成员变量有data,next。 将int重命名为STLDataType,方便我们以后修改数据域的内容。 动态申明一个空间,来放置数据。如下: 将data的内容置

    2024年02月14日
    浏览(59)
  • 数据结构——单链表的实现(c语言版)

    前言           单链表作为顺序表的一种,了解并且熟悉它的结构对于我们学习更加复杂的数据结构是有一定意义的。虽然单链表有一定的缺陷,但是单链表也有它存在的价值, 它也是作为其他数据结构的一部分出现的,比如在图,哈希表中。 目录 1.链表节点的结构 2.头插

    2024年02月13日
    浏览(59)
  • <数据结构> 链表 - 单链表(c语言实现)

    哨兵位结点也叫哑节点。哨兵位结点 也是头结点 。该节点 不存储有效数据,只是为了方便操作 (如尾插时用带哨兵位的头结点很爽,不需要判空)。 有哨兵位结点的链表,第一个元素应该是链表第二个节点(head - next,head为哨兵位结点)对应的元素。 有哨兵位结点的链表

    2023年04月11日
    浏览(134)
  • 【数据结构】单链表的增删查改(C语言实现)

    在上一节中我们提到了顺序表有如下缺陷: 在头部/中间的插入与删除需要挪动数据,时间复杂度为O(N),效率低; 增容需要申请新空间,可能会拷贝数据,释放旧空间,会有不小的消耗; 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容

    2024年02月06日
    浏览(62)
  • 【数据结构】单链表的基本操作 (C语言版)

    目录 一、单链表 1、单链表的定义: 2、单链表的优缺点: 二、单链表的基本操作算法(C语言) 1、宏定义 2、创建结构体 3、初始化 4、插入 4、求长度 5、清空 6、销毁  7、取值 8、查找 9、删除 10、头插法创建单链表 11、尾插法创建单链表 三、单链表的全部代码(C语言)

    2024年01月22日
    浏览(59)
  • 【数据结构】C语言实现单链表的基本操作

    大家好,很高兴又和大家见面啦!!! 在上一篇中,我们详细介绍了单链表的两种创建方式——头插法与尾插法,相信大家现在对这两种方式都已经掌握了。今天咱们将继续介绍单链表的基本操作——查找、插入与删除。在开始今天的内容之前,我们先通过尾插法创建一个单

    2024年02月03日
    浏览(65)
  • 【数据结构】 循环单链表的基本操作 (C语言版)

    目录 一、循环单链表 1、循环单链表的定义: 2、循环单链表的优缺点: 二、循环单链表的基本操作算法(C语言)    1、宏定义  2、创建结构体 3、循环单链表的初始化  4、循环单链表的插入 5、求单链表长度 6、循环单链表的清空 7、循环单链表的销毁 8、循环单链表的取

    2024年01月22日
    浏览(60)
  • C语言简单的数据结构:单链表的有关算法题(2)

    接着我们介绍后面的三道题,虽然代码变多了但我们的思路更加通顺了 题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/ 创建新链表,遍历原链表,将节点值小的进行尾插到新链表中 这里要多次进行对NULL的判断,开始传入列表,中间newHead的判断,循环出来一个为NULL的判断

    2024年04月15日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包