数据结构之双向链表C语言版

本文详细介绍了如何使用C语言实现双向链表,包括节点结构体定义、链表封装、节点创建、链表创建、插入、删除及打印操作。通过实例代码展示了每个功能的实现过程,帮助读者深入理解双向链表数据结构。

数据结构之双向链表C语言版


数据结构就是用来存放数据的,有很多种数据结构,这篇文章写的是双向链表,用C语言实现。学 习数据结构的时候直接复制粘贴源代码是没什么用的。不知道数据结构内部的实现,等于没学。

双向链表长什么样?

在了解一个数据结构之前当然先了解它长什么样子,知道长什么样之后再去实现它比较轻松一点

在这里插入图片描述

上图就是双向链表的样子。每个节点都有两个指针,然后中间是存放数据的。而它的一个节点是下图的样子:

在这里插入图片描述

双向链表的节点的结构体

从双向链表的样子,就可以用一个结构体去描述它的节点:

struct Node
{
   
   
    struct Node* left;
    int data;
    struct Node* right;
};

可以使用typedef起个别名,能让我们写代码轻松一点:

typedef struct Node
{
   
   
    struct Node* left;
    int data;
    struct Node* right;
}Node,*pNode;

这个起别名的意思就是:

  • Node等价于struct Node
  • pNode等价于struct Node*

双向链表的链表再封装

一般实现双向链表的时候会再封装一个链表的结构体,使之有一个头指针指向这段链表的头节点,有一个尾指针指向这段链表的尾节点,然后一般还会有一个万金油参数,用来统计链表节点的大小。下面看一下具体的封装实现:

typedef struct List
{
   
   
    pNode firstNode;
    pNode lastNode;
    int listSize;
}List,*pList;

这样就把链表封装好了。

包含的头文件

老样子

#include <stdio.h>		//标准输入输出头文件
#include <stdlib.h>		//动态申请的头文件
#inlcude <assert.h>		//断言头文件

各个子函数的实现

子函数怎么实现的其实不是很重要,因为有很多写法,真正重要的是核心思想,把核心掌握了,学起来就比较轻松。但在正常情况下,不会把某个数据结构掌握好,还是要多写多练,这样才能把基础打牢,将来自己能顺手写一个数据结构不也是一种成就感吗。

创建节点

pNode creatNode(int data)
{
   
   
	pNode newNode = (pNode)malloc(sizeof(Node));
	assert(newNode);
	newNode->data = data;
	newNode->left = NULL;
	newNode->right = NULL;
	return newNode;
}

思路很简单,就是根据链表节点的样子封装的结构体然后对应在堆区申请这样的内存。

创建链表

pList creatList()
{
   
   
	pList head = (pList)malloc(sizeof(List));
	assert(head);
	head->firstNode = NULL;
	head->lastNode = NULL;
	head->listSize = 0;
	return head;
}

这个和节点那个是差不多的。

表头法插入数据

void push_front(pList head, int data)
{
   
   
	pNode newNode = creatNode(data);
	if (head->listSize == 0)
	{
   
   
		head->lastNode = newNode;
	}
	else
	{
   
   
		newNode->right = head->firstNode;
		head->firstNode->left = newNode;
	}
	head->firstNode = newNode;
	head->listSize++;
}

先看一下当链表还没有节点的情况:

  • 链表为空时,插入一个节点,则链表里的firstNode指针和lastNode指针都应该一起指向这个刚创建处理的newNode

不能理解的看图:

在这里插入图片描述

所以当链表为空的时候(head->listSize==0)要操作的只有三个:

  • head->firstNode=newNode;
  • head->l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值