C++双向链表
Posted 桃陉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++双向链表相关的知识,希望对你有一定的参考价值。
前言:
前面我们实现了 单向链表 ,也发现了它的一些局限性。
比如说:
∙ \\bullet ∙ 查找方向只能是单向的,每次只能从头查到尾
∙ \\bullet ∙ 对于删除操作,它必须借助辅助节点帮助进行删除所以为了克服这些缺点,我们引出了双向链表。
一.基本介绍
双向链表它的方向是双向的,相对于单向链表它可以实现自我删除。
双向链表的节点包含三个量,首先一个还是节点信息data,还有指向下一个节点地址的next指针,最后添加了指向前一个节点地址的pre指针。
实现思路:
∙ \\bullet ∙ 还是使用之前单链表使用的学生类进行举例,只是在Node节点类新增了pre指针。
∙ \\bullet ∙ 实现操作包括增删查改以及正反打印链表、返回链表长度等
∙
\\bullet
∙ 新增函数注意前后进行链接,查找、修改函数不变,删除函数可以自身进行删除,操作如下:node->pre->next=node->next,node->next->pre=node->pre;
∙ \\bullet ∙其他函数实现见下面具体代码。
二.代码实现
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
//学生节点
class Node
{
private:
//将信息设置为私有变量更加安全,需要专门接口函数进行查询
string id; //学号
string name; //姓名
public:
Node* next;
Node* pre;
//构造函数
Node(string id1,string name1,Node* nextval=NULL,Node* preval=NULL)
{
id=id1;
name=name1;
next=nextval;
pre=preval;
}
Node(Node* nextval=NULL,Node* preval=NULL)
{
next=nextval;
pre=preval;
}
string getId()
{
return this->id;
}
string getName()
{
return this->name;
}
void setName(string s)
{
this->name=s;
}
void print()
{
cout<<"Node{id = "<<this->id<<", name = "<<this->name<<"}"<<endl;
}
};
//链表类
class DoubleLink
{
private:
//头结点
Node* Head = new Node();
public:
//添加节点
void add(Node* node)
{
Node* temp = Head;
while(true)
{
if(temp->next==NULL)
{
break;
}
temp = temp->next;
}
//双向链接
temp->next=node;
node->pre=temp;
}
//删除指定学号学生
void del(string s)
{
Node* temp=Head->next;
if(temp->next==NULL)
{
cout<<"The list is empty!"<<endl;
return ;
}
int flag=0;
while(true)
{
if(temp==NULL)
{
break;
}
if(temp->getId()==s)
{
flag=1;
break;
}
temp=temp->next;
}
if(!flag)
{
cout<<"No match found!"<<endl;
return ;
}
//如果temp是不是最后一个,才可以执行该操作
if(temp->next!=NULL)
{
temp->next->pre=temp->pre;
}
temp->pre->next=temp->next;
}
//查找指定学号学生
void find(string s)
{
if(Head->next==NULL)
{
cout<<"The list is empty!"<<endl;
return ;
}
Node* temp=Head;
int flag = 0;
while(temp)
{
if(temp->next==NULL)
{
break;
}
if(temp->next->getId()==s)
{
flag=1;
break;
}
temp=temp->next;
}
if(!flag)
{
cout<<"This student is not exist!"<<endl;
return ;
}
cout<<"This student is exist! His/Her name is "<<temp->getName()<<endl;
}
//修改指定学生信息
void update(Node* newnode)
{
if(Head->next==NULL)
{
cout<<"The list is empty!"<<endl;
return ;
}
Node* temp=Head;
int flag = 0;
while(temp)
{
if(temp->next==NULL)
{
break;
}
if(temp->next->getId()==newnode->getId())
{
flag=1;
break;
}
temp=temp->next;
}
if(!flag)
{
cout<<"This student is not exist!"<<endl;
return ;
}
temp->next->setName(newnode->getName());
}
//正向打印链表所有节点信息
void list()
{
if(Head->next==NULL)
{
cout<<"The list is empty!"<<endl;
return ;
}
Node * temp=Head->next;
cout<<"list:"<<endl;
while(temp)
{
temp->print();
temp=temp->next;
}
}
//反向打印链表所有节点信息
void traverseList()
{
if(Head->next==NULL)
{
cout<<"The list is empty!"<<endl;
return ;
}
Node * temp=Head->next;
cout<<"traverseList:"<<endl;
//找到最后一个节点
while(1)
{
if(temp->next==NULL)
{
break;
}
temp=temp->next;
}
//反向打印
while(temp!=Head)
{
temp->print();
temp=temp->pre;
}
}
};
int main()
{
Node* stu1 = new Node("202100","amy");
Node* stu2 = new Node("202101","Jone");
Node* stu3 = new Node("202102","Mike");
Node* stu4 = new Node("202103","Hone");
Node* newnode = new Node("202103","timi");
DoubleLink link=DoubleLink();
link.add(stu1);
link.add(stu2);
link.add(stu3);
link.add(stu4);
link.del("202100");
link.find("202102");
link.update(newnode);
link.list();
link.traverseList();
system("pause");
return 0;
}
三.结果展示
以上是关于C++双向链表的主要内容,如果未能解决你的问题,请参考以下文章