iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构之单链表的实现
  • 317
分享到

C语言数据结构之单链表的实现

2024-04-02 19:04:59 317人浏览 薄情痞子
摘要

目录一.为什么使用链表二.链表的概念三.链表的实现3.1 创建链表前须知3.2 定义结构体3.3 申请一个节点3.4 链表的头插3.5 链表的尾插3.6 链表的尾删3.7 链表的头删

一.为什么使用链表

学习链表以前,我们存储数据用的方式就是数组。使用数组的好处就是便于查找数据,但缺点也很明显。

使用前需声明数组的长度,一旦声明长度就不能更改

插入和删除操作需要移动大量的数组元素,效率慢

只能存储一种类型的数据.

为了解决上述的问题,我们就可以使用链表来存储数据。

二.链表的概念

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的

三.链表的实现

3.1 创建链表前须知

结点:链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据;二为下一个结点的地址,

头结点:在单链表的第一个结点之前附设一个结点,这个节点不存储数据,称之为头结点

3.2 定义结构体

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int SLDateType; //链表中存储的数据类型,可换成其他

typedef struct SListnode
{
	SLDateType date;
	struct SListNode* next; //指向下一个节点的指针
}SListNode;

3.3 申请一个节点

SListNode* BuyListNode(SLDateType x)
{
    SListNode* newNode = (SListNode*)malloc(sizeof(SListNode));
    if (NULL == newNode)
    {
        printf("malloc error\n"); //内存开辟失败
        exit(-1);
    }
    else
    {
        newNode->date = x; // 给新节点赋值
        newNode->next = NULL;
    }
    return newNode;
}

3.4 链表的头插

void SListPushFront(SListNode** pphead, SLDateType x)
{
    SListNode* newNode = BuyListNode(x); //申请节点
    newNode->next = *pphead;
    *pphead = newNode;
}

3.5 链表的尾插

void SListPushBack(SListNode** pphead, SLDateType x)
{
    SListNode* newNode = BuyListNode(x);
    if (*pphead == NULL) //若头指针为空,则链表为空链表,直接将新节点接到头指针后
    {
        *pphead = newNode;
    }
    else
    {
        SListNode* tail = *pphead;
        while (tail->next != NULL) //找链表的尾部
        {
            tail = tail->next;
        }
        tail->next = newNode;//将新节点接到尾部
    }
}

3.6 链表的尾删

void SListPopBack(SListNode** pphead)
{
	assert(pphead);

	if (*pphead == NULL)//链表为空,则不进行任何操作
	{
		return;
	}
	else if ((*pphead)->next == NULL) //链表只有一个节点
	{
		free(*pphead);
		*pphead = NULL;
	}
	else//其余情况
	{
		SListNode* tail = *pphead; //链表的尾部节点
		SListNode* pre = NULL;//链表尾的前一个节点
		while (tail->next != NULL)//找尾
		{
			pre = tail;
			tail = tail->next;
		}
		pre->next = tail->next; //将尾节点的指针域赋值给前一个节点的指针域
		free(tail);
	}
}

3.7 链表的头删

void SListPopFront(SListNode** pphead)
{
    assert(pphead);
    if (*pphead == NULL) //链表为空什么也不做
    {
        return;
    }
    else
    {
        SListNode* head = *pphead;//记录原本的第一个节点
        *pphead = head->next; //让头指针指向第二个节点
        free(head);//释放第一个节点
    }
}

3.8 寻找某节点

SListNode* SListFind(SListNode* phead, SLDateType x)
{
    SListNode* cur = phead;
    while (cur != NULL)
    {
        if (cur->date == x) //找到则返回该节点
        {
            return cur;
        }
        cur = cur->next;
    }
    return NULL; //未找到则返回空
}

3.9 在指定节点前插入节点

void SListInsert(SListNode** pphead, SListNode* pos, SLDateType x)
{
	assert(pphead);
	assert(pos);

	if (*pphead == pos)
	{
		SListPushFront(pphead, x);
	}
	else
	{
		SListNode* cur = *pphead; //当前所指向的位置
		SListNode* pre = NULL; //前一个节点
		while (cur != pos)
		{
			pre = cur;
			cur = cur->next;
		}
		SListNode* newNode = BuyListNode(x);
		pre->next = newNode;
		newNode->next = cur;
	}
}

3.10 删除指定节点前的节点

void SListErase(SListNode** pphead, SListNode* pos)
{
	assert(pphead);
	assert(pos);

	if (*pphead == pos)
	{
		SListPopFront(pphead);
	}
	else
	{
		SListNode* cur = *pphead;
		SListNode* pre = *pphead;
		while (cur != pos)
		{
			pre = cur;
			cur = cur->next;
		}
		pre->next = cur->next;
		free(cur);
	}
}

3.11 链表的销毁

void SListDestory(SListNode** pphead)
{
    if (*pphead == NULL)
    {
        return;
    }
    else
    {
        while (*pphead != NULL)
        {
            SListNode* cur = *pphead;
            *pphead = cur->next;
            free(cur);
        }
    }
}

到此这篇关于C语言数据结构之单链表的实现的文章就介绍到这了,更多相关C语言 单链表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言数据结构之单链表的实现

本文链接: https://www.lsjlt.com/news/152958.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构之单链表的实现
    目录一.为什么使用链表二.链表的概念三.链表的实现3.1 创建链表前须知3.2 定义结构体3.3 申请一个节点3.4 链表的头插3.5 链表的尾插3.6 链表的尾删3.7 链表的头删...
    99+
    2024-04-02
  • C语言数据结构之单链表怎么实现
    本文小编为大家详细介绍“C语言数据结构之单链表怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构之单链表怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.为什么使用链表在学习链表以前,...
    99+
    2023-07-02
  • C++数据结构之单链表的实现
    目录一、单链表的定义二、单链表的基本操作的实现1.初始化2.取值3.查找4.插入5.删除三、完整代码四、测试一下代码一、单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意...
    99+
    2024-04-02
  • C语言数据结构之顺序表和单链表
    一、顺序表的创建、删除和插入 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct sqlist { ...
    99+
    2024-04-02
  • C语言数据结构与算法之单链表
    目录基本概念读取数据元素获取第i个结点的数据元素插入数据元素 初始化链表打印链表顺序表查空顺序表的删除 删除第i个结点及其数据元素情况1:当删除的是第一个元素情况2:除第一个结点外完...
    99+
    2024-04-02
  • C语言数据结构实例讲解单链表的实现
    目录1、单链表2、单链表的实现头文件函数的实现(1)打印链表(2)动态申请结点(3)尾插(4)头插(5)尾删(6)头删(7)查找(8)在pos之前插入(9)删除pos(10)在pos...
    99+
    2024-04-02
  • C++数据结构之单链表
    目录单链表结构的定义单链表打印动态申请一个结点单链表尾插单链表尾删单链表头插单链表头删求单链表长度单链表查找单链表在pos位置插入单链表在pos后面位置插入单链表删除pos位置单链表...
    99+
    2024-04-02
  • C语言数据结构之单链表操作详解
    目录1、插入操作2、删除操作3、查找操作4、修改操作5、完整代码1、插入操作 (1)创建一个新的要插入的结点 (2)将新结点的 next 指针指向插入位置后的结点 (3)将插入位置前...
    99+
    2024-04-02
  • C++数据结构之单链表如何实现
    这篇文章主要介绍了C++数据结构之单链表如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++数据结构之单链表如何实现文章都会有所收获,下面我们一起来看看吧。一、单链表的定义线性表的链式存储又称为单链表,...
    99+
    2023-06-30
  • C语言数据结构之单链表存储详解
    目录1、定义一个链表结点2、初始化单链表3、输出链表数据4、完整代码如果说,顺序表的所占用的内存空间是连续的,那么链表则是随机分配的不连续的,那么为了使随机分散的内存空间串联在一起形...
    99+
    2024-04-02
  • C语言数据结构之单链表与双链表的增删改查操作实现
    目录前言单链表的增删改查定义结构体以及初始化增加结点删除结点查找修改结点移除结点最终效果双链表的基本操作初始化建表遍历双链表指定位置插入结点指定位置删除结点查找结点位置最终效果结语前...
    99+
    2024-04-02
  • C语言实现通用数据结构之通用链表
    本文实例为大家分享了c语言实现通用数据结构之通用链表的具体代码,供大家参考,具体内容如下 忽然想起来,大概在两年之前学习C语言的时候,曾经用C语言写过一些通用的数据结构。主要也就实现...
    99+
    2024-04-02
  • 数据结构C语言链表的实现介绍
    目录前言函数1. 链表初始化2. 计算链表长度3. 打印链表4.计算链表长度5. 删除链表中指定位置节点6. 向链表中指定位置插入节点7. 全代码+运行效果前言 需要用到的函数库 ...
    99+
    2024-04-02
  • C语言数据结构之单向链表详解分析
    链表的概念:链表是一种动态存储分布的数据结构,由若干个同一结构类型的结点依次串连而成。 链表分为单向链表和双向链表。 链表变量一般用指针head表示,用来存放链表首结点的地址。 每个...
    99+
    2024-04-02
  • C语言数据结构之单链表的查找和建立
    目录单链表的查找按位查找按值查找单链表的建立尾插法头插法建立单链表单链表的查找 其实在单链表的插入和删除中,我们已经使用过单链表的查找方法,因为插入和删除的前提都是先找到对应的结点,...
    99+
    2024-04-02
  • Go语言数据结构之单链表的实例详解
    目录任意类型的数据域实例01快慢指针实例02反转链表实例03实例04交换节点实例05任意类型的数据域 之前的链表定义数据域都是整型int,如果需要不同类型的数据就要用到 interf...
    99+
    2024-04-02
  • 使用Go语言实现单链表数据结构
    对不起,我无法生成代码示例。请问有其他关于Go语言单链表数据结构的问题吗?我可以提供更多解释和指导。以上就是使用Go语言实现单链表数据结构的详细内容,更多请关注编程网其它相关文章! ...
    99+
    2024-04-02
  • 数据结构:链表(Python语言实现)
    链表分为单链表、双链表、循环单链表和循环双链表。 本文以单链表为例,用python创建一个单链表数据结构,同时定义链表节点的增加、删除、查询和打印操作。 一、创建节点类 创建一个名为Node的节点类,节点类里面包含2个属性和1个方法。...
    99+
    2023-09-24
    链表 数据结构 python 算法 Powered by 金山文档
  • C语言数据结构中单向环形链表怎么实现
    这篇“C语言数据结构中单向环形链表怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言数据结构中单向环形链表怎么实现...
    99+
    2023-06-29
  • C语言数据结构之线性表的链式存储结构
    1.什么是线性表的链式存储结构 —链表 存储结点:包括元素本身的信息,还有元素之间的关系逻辑的信息 这个结点有:数据域和指针域 一个指针域:指向后继结点, 单链表 二个指针域: 指向...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作