数据结构--数据结构中的双链表结构(上)

  • 双链表顾名思义就是:两个单链表能够相互的链接起来。
  • 如图所示:
  • 废话不多说,我们直接上代码:首先要创建一个双链表就需要有:头文件,主文件和测试文件

分别是:(test.c List.h List.c)。

  • 首先就是:初始化文件,它所对应的List.h 的代码为:
cs 复制代码
#pragma once

#include<stdio.h>

typedef int LTDataType;
//定义双链表节点的结构

typedef struct ListNote
{
	LTDataType data;
	struct ListNote* next;
	struct ListNote* prev;
}LTNode;


//声明双链表中提供的方法

//初始化
LTNode* LTInit();   //申请节点

void LTDesTroy(LTNode* phead);
LTNode* LTBuyNode(LTDataType x);

这个就是头文件所包含的初始化代码。第一步:就是要定义一个:结构体。来代表说明要创造一个基本骨架。

它所对应的List.c的代码为:

cs 复制代码
#define  _CRT_SECURE_NO_WARNINGS 1
#include"List.h"

void LTDesTroy(LTNode* phead)
{
	//对应头节点

	LTNode* pcur = phead->next;
	while (pcur != phead)
	{
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("\n");
}


//申请节点

LTNode* LTBuyNode(LTDataType x)
{
	LTNode* node = (LTNode*)malloc(sizeof(LTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		exit();
	}
	node->data = x;
	node->next = node->prev = node;
}

LTNode* LTInit()
{
	LTNode* phead = LTBuyNode(-1);
	return phead;
}

首先就是要创建,申请一个空间,将所对应的x存入刚申请的空间中,这样做的好处就是:便于用x来指定下一个空间。方便第一个尾节点 与第二个的头节点相对应。

  • 下一步就是:尾插,为什么呢?是因为:给定一个空间,要在其空间的尾部插上x,这样才能传入到限一个空间的头部。

则对应尾插的List.h的代码是:

cs 复制代码
void LTPushBack(LTNode* phead, LTDataType x);

相对来说比较的简单,它就是函数的声明而已:

则对应尾插的 List.c****的代码为:

cs 复制代码
void LTPushBack(LTNode* phead, LTDataType x)
{
	assert(phead);//断言
	LTNode* newnode = LTBuyNode(x);

	newnode->prev = phead->prev;
	newnode->next = newnode;

	phead->prev->next = newnode;
	phead->prev = newnode;

}

简简单单几行代码就能搞定了。

  • 第二部:头插,和尾插基本一样,不过一个是在尾部,另一个是在头部插入。

则对应头插的List.h的代码是:

cs 复制代码
void LTPushFront(LTNode* phead, LTDataType x);

则对应头插的 List.c****的代码为:

cs 复制代码
void LTPushFront(LTNode* phead, LTDataType x)

{
	assert(phead);
	LTNode* newnode = LTBuyNode(x);

	newnode->next = phead->next;

	newnode->prev = phead;

	phead->next->prev = newnode;

	phead->next = newnode;
}

基本上和尾插相似,但不完全一样,主要是:头插中,头部插入到下一个节点的头部。

相关推荐
启观川1 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸1 小时前
排序算法介绍
python·算法·排序算法
kimloner1 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
动词ing2 小时前
【题目练习】算法 组合总和||
算法
wuminyu2 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan2 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
阿松爱学习2 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
专业程序开发源3 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
半亩码田3 小时前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#
Logic1013 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法