栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【双链表的抽象类实现】【C++代码】【插入/删除/查找/定位访问/遍历/清除功能实现】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【双链表的抽象类实现】【C++代码】【插入/删除/查找/定位访问/遍历/清除功能实现】

【双链表的概念】

        每个结点既保存直接后继结点的地址,又保存直接前驱结点的地址。

【双链表的类设计】

template
class dLinkList :public list
{
private:
	struct node
	{
		elemType data;
		node* prev, * next;
		node(const elemType& x, node* p = NULL, node* n = NULL)
		{
			data = x; 
			next = n;
			prev = p;
		}
		node():next(NULL),prev(NULL){}
		~node(){}
	};
	node* head, * tail;//头指针和尾指针
	int currentLength;
	node* move(int i)const;
public:
	dLinkList();
	~dLinkList()
	{
		clear();
		delete head;
		delete tail;
	}
	void clear();
	int length()const { return currentLength; }
	void insert(int i, const elemType& x);
	void remove(int i);
	int search(const elemType& x)const;
	elemType visit(int i)const;
	void traverse()const;
};

 【功能函数的设计】

//move函数
template
dLinkList::node* dLinkList::move(int i) const
{
	node* p = head;
	while (i-- >= 0)
		p = p->next;
	return p;
}
//构造函数
template
dLinkList::dLinkList()
{
	head = new node;//此处调用node类缺省的构造函数,此时head的prev和next都置为了空指针
	head->next = tail = new node;
	tail->prev = head;
	currentLength = 0;
}
//clear函数
template
void dLinkList::clear()
{
	node* p = head->next, * q;
	head->next = NULL;
	while (p != NULL)
	{
		q = p->next;
		delete p;
		p = q;
	}
	node* p = tail->prev, * q;
	tail->prev = NULL;
	while (p != NULL)
	{
		q = p->prev;
		delete p;
		p = q;
	}
	currentLength = 0;
}
//insert函数
template
void dLinkList::insert(int i, const elemType& x)
{
	node* pos, * tmp;
	pos = move(i);
	tmp = new node(x, pos->prev, pos);
	pos->prev->next = tmp;
	pos->prev = tmp;
	currentLength++;
}
//remove函数
template
void dLinkList::remove(int i)
{
	node* pos;
	pos = move(i);
	pos->prev->next = pos->next;
	pos->next->prev = pos->prev;
	delete pos;
	currentLength--;
}
//search函数
template
int dLinkList::search(const elemType& x) const
{
	node* p = head->next;
	int i = 0;
	while (p != NULL && p->data != x)
	{
		p = p->next;
		i++;
	}
	if (p == NULL)
		return -1;
	else
		return i;
}
//visit函数
template
elemType dLinkList::visit(int i) const
{
	return move(i)->data;
}
//traverse函数
template
void dLinkList::traverse() const
{
	node* p = head->next;
	cout << endl;
	while (p != NULL)
	{
		cout << p->data;
		p = p->next;
	}
	cout << endl;
}

         上面的代码没有写很多注释,双链表和单链表的功能函数实现比较类似,只有少部分有改动,详情可以参考下面这篇文章:

(2条消息) 【单链表】【单链表类的设计】【move函数找到第i个结点】【struct结点类】【设置表长currentLength代替每次遍历】_捡到一只姜小鱼的博客-CSDN博客https://blog.csdn.net/qq_46480277/article/details/124523187?spm=1001.2014.3001.5501

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/857335.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号