链表(linked list)是一种这样的数据结构,其中的各对象按线性排列。数组的线性顺序是由数组下标决定的,然而于数组不同的是,链表的各顺序是由链表中的指针决定的。
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
双链表(doubly linked list)的每一个元素都是一个对象,每一个对象都有一个数据域和两个指针front和tail。对象中还可以包含其他辅助数据。设l为链表的一个元素,l.front指向他在链表中的后继元素,l.tail指向他的前继元素。
我们可以定义一个结构体封装这些数据
typedef struct node{int data;struct node* front;struct node* tail;}node, * lpnode;
在c++中,我们以类的形式封装了双向链表。在类中,我们定义了两个指针,一个是指向链表的头部frontnode,一个是指向了链表的尾部tailnode,另外我们还加入了cursize属性,记录节点的个数。在对象创建的过程就是链表创建的过程,我们只需要在类的构造函数中初始化参数即可。
class duplexhead {public:duplexhead() {frontnode = null;tailnode = null;cursize = 0;} lpnode createnode(int data);lpnode achnode(int data);void push_front(int data);void push_back(int data);void push_appoin(int posdata, int data);void pop_front();void pop_back();void pop_appoin(int posdata);void printbyfront();void printbytail(); protected: lpnode frontnode;lpnode tailnode;int cursize; };
在上面,我们已经知道双向链表的单体长啥样了,我们只需要给他的单体分配空间然后初始化他的参数即可。
lpnode duplexhead::createnode(int data){lpnode newnode = new node;asrt(newnode);newnode->front = nullptr;newnode->tail = nullptr;newnode->data = data;return new千层底布鞋node;}
链表的查找我们可以定义一个函数lpnode achnode(int data),当满足查找条件时,我们就返回当前节点的链表。在实际操作过程中,链表的数据域可能会有多个数据,可能要比较int 类型,可能要比较string类型等多种变化,这是我们可以在参数列表预留一个函数指针 (int) (*compardata)(lpnode data),以应对多种需求。当然,在这里为了演示方便,我们就用一个int 类型的数据代替了。
lpnode duplexhead::achnode(int data){if (!cursize){printf("链表为空,无法查找");return;}lpnode prenode = frontnode;lpnode curnode = frontnode;while (curnode != null && curnode->data != data){prenode = curnode;curnode = prenode->tail;}if (curnode == nullptr){printf("链表中没有该数据");return nullptr;} return curnode; }
插入节点,我们分为头部插入和尾部插入以及指定位置插入。而这三种插入,都可分为3步。
(1)创建新节点
(2)找到插入位置
(3)插入
我们就以制定位置插入为例,如图所示,我们只需把原来相连的两个节点断开,然后再分别用指针拼接起来,当然我们也可以调用我们的achnode来查找位置,这样就更方便一些了。
void duplexhead::push_appoin(int posdata, int data){ if (cursize == 0)return;if (frontnode->data == posdata){push_front(data);}el{lpnode prenode = frontnode;lpnode curnode = frontnode;while (curnode != null && curnode->data != posdata){prenode = curnode;curnode = prenode->tail;}if (curnode == null){printf("未找到指定位置,无法插入!\n");}el{lpnode newnode = createnode(data);prenode->tail = newnode;newnode->tail = curnode;curnode->front = newnode;newnode->front = prenode;cursize++;}}}
删除节点我们也可以分为头部删除,尾部删除,指定数据删除。他与插入节点几乎是一样的
(1)找到删除位置
(2)删灾情报告除
我们就以指定数据删除为例,我们通过while或者achnode来查找到要删除的节点,然后把他的front 指向的位置和tail指向的位置记住,就可以直接删除节点了。删除完了节点要记得把前后段的链表连接上即可。
void duplexhead::pop_appoin(int posdata){if (frontnode == null || cursize == 0){printf("链表为空无法删除!");return;}if (frontnode->data == posdata){pop_front();return;}lpnode prenode = frontnode;lpnode curnode = frontnode;while (curnode != null && curnode->data != posdata){prenode = curnode;curnode = prenode->tail;}if (curnode == null){printf("未找到指定位置无法删除!\n");}el{if (tailnode == curnode){pop_back();}el{prenode->tail = curnode->tail;//curnode改造我们的学习->tail是不是不空//当删除的表尾时候,curnode->tail等于空curnode->tail->front = prenode;free(curnode);curnode = null;cursize--;}}}
于双向链表的创建一样,我们可以把双向链表的删除放在析构函数中,实现创建和删除自动化,当对象被创建,双向链i Kisd a girl表就被创建,当对象消亡,双向链表就删除了。
duplexhead::~duplexhead(){if (!frontnode)return;lpnode pmove ; while (!pmove){pmove = frontnode->tail;delete frontnode->tail;frontnode = pmove;} }
到此这篇关于c语言类的双向链表详解的文章就介绍到这了,更多体操比赛作文相关c语言双向链表内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 15:56:40,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4e4b2bb5e9606d619a969b9d16b44d0b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C语言类的双向链表详解.doc
本文 PDF 下载地址:C语言类的双向链表详解.pdf
留言与评论(共有 0 条评论) |