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

【双链表的概念】

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

【双链表的类设计】

template<class elemType>
class dLinkList :public list<elemType>
{
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<class elemType>
dLinkList<elemType>::node* dLinkList<elemType>::move(int i) const
{
	node* p = head;
	while (i-- >= 0)
		p = p->next;
	return p;
}
//构造函数
template<class elemType>
dLinkList<elemType>::dLinkList()
{
	head = new node;//此处调用node类缺省的构造函数,此时head的prev和next都置为了空指针
	head->next = tail = new node;
	tail->prev = head;
	currentLength = 0;
}
//clear函数
template<class elemType>
void dLinkList<elemType>::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<class elemType>
void dLinkList<elemType>::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<class elemType>
void dLinkList<elemType>::remove(int i)
{
	node* pos;
	pos = move(i);
	pos->prev->next = pos->next;
	pos->next->prev = pos->prev;
	delete pos;
	currentLength--;
}
//search函数
template<class elemType>
int dLinkList<elemType>::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<class elemType>
elemType dLinkList<elemType>::visit(int i) const
{
	return move(i)->data;
}
//traverse函数
template<class elemType>
void dLinkList<elemType>::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博客icon-default.png?t=M3K6https://blog.csdn.net/qq_46480277/article/details/124523187?spm=1001.2014.3001.5501

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值