数据结构 第三章 线性表(三)

这篇具有很好参考价值的文章主要介绍了数据结构 第三章 线性表(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构 第三章 线性表(三),数据结构,数据结构 

🚀 写在最前:在前面学习了单链表的基本操作,这篇文章学习双链表,以及双链表的一些基本操作

🚀:求个关注😀,让我们一起探索计算机的奥秘!

一、双链表

双链表一个节点含有两个指针域,前指针域指向前一个节点,后一个指针域指向后一个节点;那为什么有了单链表还需要双链表呢?因为单链表它很难找到当前节点的前一个节点,是为了方便找到当前节点的前一个节点,所以引入了双链表。双链表的示意图如下图所示。

数据结构 第三章 线性表(三),数据结构,数据结构

二、双链表的基本操作

文件结构:

文件结构如下,建有DLinkList.h,用于定义数据结构以及函;DLinkList.cpp用于实现函数的功能;test.cpp用于测试实现的函数是否好用。

数据结构 第三章 线性表(三),数据结构,数据结构

①双链表的初始化

DLinkList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>

typedef int EelentType;

typedef struct DLNode {
	EelentType data;
	DLNode* prior;       //前指针,头节点的前指针始终为空
	DLNode* next;        //后指针
}DLNode,*DLinkList;


//定义数据结构操作

//初始化双链表
bool InitDlinkList(DLinkList& L);

DLinkList.cpp

#include"DLinkList.h"

//初始化双链表
bool InitDlinkList(DLinkList& L) {
	L = (DLNode*)malloc(sizeof(DLNode));
	if (L == NULL) {
		printf("空间申请失败导致双链表初始化失败\n");
		return false;
	}
	else {
		L->next = NULL;
		L->prior = NULL;
		return true;
	}
}

test.cpp

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}

	return 0;
}

out:

初始化成功!

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 24384)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

②双链表的插入操作

DLinkList.h

//双链表的插入操作
bool DLinkListInsert(DLinkList L, int i, EelmentType e);

DLinkList.cpp 

//双链表的插入操作
bool DLinkListInsert(DLinkList L, int i, EelmentType e) {
	//申请新的节点
	DLNode* tmp = (DLNode*)malloc(sizeof(DLNode));
	if (tmp == NULL) {
		printf("空间申请失败导致插入失败\n");
		return false;
	}
	else {
		DLNode* p = L;   //指向节点的指针
		int j = 0;       //定位p指向哪个节点
		while (p != NULL && j < i - 1) {
			p = p->next;
			j++;
		}
		if (p == NULL) {
			printf("插入位置不合法\n");
			return false;
		}
		else {
			tmp->data = e;
			tmp->next = p->next;
			if (p->next!= NULL) {   //这步判断是为了防止是尾插p->next->prior是空指针
				p->next->prior = tmp;
			}
			tmp->prior = p;
			p->next = tmp;
			return true;
		}
	}
}

test.cpp

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}
	DLinkListInsert(L1, 1, 1);
	DLinkListInsert(L1, 2, 2);
	DLinkListInsert(L1, 1, 6);
	printf("位置1上的元素为:%d\n", L1->next->data);
	printf("位置2上的元素为:%d\n", L1->next->next->data);
	printf("位置3上的元素为:%d\n", L1->next->next->next->data);
	return 0;
}

out:
初始化成功!
位置1上的元素为:6
位置2上的元素为:1
位置3上的元素为:2

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 19616)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

③双链表的打印

DLinkList.h

//双链表的打印
void DLinkListPrint(DLinkList L);

DLinkList.cpp

//双链表的打印
void DLinkListPrint(DLinkList L) {
	if (L->next == NULL) {
		printf("该双双链表为空\n");
		exit;
	}
	else {
		DLNode* p = L->next;
		while (p != NULL) {
			printf("%d<----->", p->data);
			p = p->next;
		}
		printf("\n");
	}
}

test.cpp

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}
	DLinkListInsert(L1, 1, 1);
	DLinkListInsert(L1, 2, 2);
	DLinkListInsert(L1, 1, 6);
	DLinkListPrint(L1);

	return 0;
}

out:
初始化成功!
6<----->1<----->2<----->

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 5992)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

④双链表的删除

DLinkList.h

//双链表的删除
bool DLinkListDelete(DLinkList L, int i);

DLinkList.cpp

//双链表的删除
bool DLinkListDelete(DLinkList L, int i) {
	DLNode* p = L;   //使用tmp指向节点
	int j = 0;         //使用j表示指向哪个节点
	while (p != NULL && j < i - 1) {
		p = p->next;
		j++;
	}
	if (p->next == NULL || p == NULL) {
		printf("删除位置不合法\n");
		return false;
	}
	DLNode* temp = p->next;
	p->next = temp->next;
	if (temp->next != NULL) {  //这步判断是为了防止是删除的是最后一个元素
		temp->next->prior = temp->prior;
	}
	free(temp);
}

test.cpp文章来源地址https://www.toymoban.com/news/detail-852489.html

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}
	DLinkListInsert(L1, 1, 1);
	DLinkListInsert(L1, 2, 2);
	DLinkListInsert(L1, 1, 6);
	DLinkListPrint(L1);         //6 < ----->1 < ----->2 < ----->
	
	DLinkListDelete(L1, 3);
	DLinkListPrint(L1);         //6 < ----->1 < ----->
	
	DLinkListInsert(L1, 1, 17);
	DLinkListDelete(L1, 2);
	DLinkListPrint(L1);         //17 < ----->1 < ----->
	return 0;
}

out:

初始化成功!
6<----->1<----->2<----->
6<----->1<----->
17<----->1<----->

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 7084)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

到了这里,关于数据结构 第三章 线性表(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • (浙大陈越版)数据结构 第三章 树(中) 二叉搜索树和平衡二叉树

    目录 4.1.1 二叉搜索树及查找 什么是二叉搜索树 定义 二叉搜索树特殊函数集: 查找操作:Find 算法思想 代码实现 补:查找最大和最小元素 4.1.2 二叉搜索树的插入 插入操作:Insert 算法思想 代码实现 例题 4.1.3 二叉搜索树的删除 删除操作:delete 算法思想 情况1:删除叶节点

    2024年02月08日
    浏览(55)
  • 线性代数 第三章 向量

    一、运算 加法、数乘、内积 施密特正交化 二、线性表出 概念:如果 ,则称可由线性表出(k不要求不全为0) 判定: 非齐次线性方程组 有解 无关,相关 如果两个向量组可以互相线性表出,则称这两个 向量组等价 。向量组等价,向量组的秩相等(反过来不成立,秩相等向

    2024年02月07日
    浏览(46)
  • 线性代数---第三章向量

    2024年02月12日
    浏览(69)
  • 线性代数强化第三章

    目录 一,关于A伴随,A逆与初等矩阵  二,分块矩阵 三,矩阵方程 ​    如何证明行列式的值不能是0;    此秩为1.              法一:  法二:      不用看是列变换还是行变换,我们需要从秩不变的性质去解题                         左乘同行右乘同列,再加负号

    2024年02月11日
    浏览(44)
  • 高等数学:线性代数-第三章

    矩阵的初等变换 下面三种变换称为矩阵的初等变换 对换两行(列),记作 r i ↔ r j ( c i ↔ c j ) r_{i} leftrightarrow r_{j} (c_{i} leftrightarrow c_{j}) r i ​ ↔ r j ​ ( c i ​ ↔ c j ​ ) 以数 k ≠ 0 k ne 0 k  = 0 乘某一行(列)中的所有元,记作 r i × k ( c i × k ) r_{i} times k ( c_{i}

    2024年02月11日
    浏览(46)
  • 【机器学习】第三章线性模型练习题及答案

    一. 单选题(共21题,63分) 1.【单选题】以下哪组变量之间存在线性回归关系? A. 正三角形的边长与周长 B. 学生的性别与他的成绩 C. 正方形的边长与面积 D. 儿子的身高与父亲的身高 正确答案: A 2.【单选题】下列关于线性回归分析中的残差(Residuals)说法正确的是? A. 以上说法

    2024年02月03日
    浏览(54)
  • <<数值分析>> 第三章线性方程组的迭代解法

            线性方程组的理论求解公式——,在实际应用中面临着两大问题,1是计算过程复杂,2是无法保证算法的稳定性。同时初始数据存在误差,需要寻求能达到精度要求的、操作和计算过程相对简单的求解方法—— 迭代法。    目录 一.迭代法的基本思想 二.基本迭代

    2024年01月25日
    浏览(53)
  • 线性代数(主题篇):第三章:向量组 、第四章:方程组

    1.概念 § 3 §3 §3 向量组 { ①部分相关,整体相关 ②整体无关,部分无关 ③低维无关,高维无关 ④高维相关,低维相关 begin{cases} ①部分相关,整体相关\\\\ ②整体无关,部分无关\\\\ ③低维无关,高维无关\\\\ ④高维相关,低维相关 end{cases} ⎩ ⎨ ⎧ ​ ① 部分相关,整体相关

    2024年02月15日
    浏览(52)
  • 【计算机视觉:算法和应用】第三章:图像处理——3.2线性滤波

    【计算机视觉:算法和应用】第二章:图像形成——2.1 几何图元与变换_Lu.马夋的博客-CSDN博客 【计算机视觉:算法和应用】第二章:图像形成——2.2相机辐射成像-CSDN博客 【计算机视觉:算法和应用】第二章:图像形成——2.3数码相机-CSDN博客 【计算机视觉:算法和应用】

    2024年02月03日
    浏览(51)
  • 第三章,矩阵,09-线性方程组解的判断与求法、矩阵方程

    玩转线性代数(21)线性方程组解的判断与求法的笔记,相关证明以及例子见原文 对n元线性方程组 A x = b Ax=b A x = b ,A为系数矩阵, B = ( A ∣ b ) B=(A|b) B = ( A ∣ b ) 为增广矩阵,则有 (1) A x = b Ax=b A x = b 无解 ⇔ R ( A ) R ( A , b ) Leftrightarrow R(A)lt R(A,b) ⇔ R ( A ) R ( A , b ) ; (2)

    2024年02月13日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包