C++数据结构 ---- 双链表

这篇博客介绍了如何在C++环境下配置codeblocks,并展示了使用C++模板实现双链表的数据结构。主要内容包括双链表类的定义及在main.cpp中的应用。
摘要由CSDN通过智能技术生成

环境配置

codeblocks

windows10

项目结构

代码

DLinkListClass.cpp

#ifndef _DLINKLISTCLASS_H_
#define _DLINKLISTCLASS_H_

template <typename T>
class DLinkListNode
{
public:
	T data;
	DLinkListNode<T> *prior;
	DLinkListNode<T> *next;
};
template <typename T>
class DLinkListClass
{
public:
	DLinkListClass(void);
	~DLinkListClass(void);
	bool CreateListF(const T *a, int n) const;
	bool CreateListR(const T *a, int n) const;
	void Display(void) const;
	int ListLength(void) const;
	bool GetElem(int i, T &e) const;
	bool LocateElem(const T &e, int &i) const;
	bool ListInsert(int i, const T &e) const;
	bool ListDelete(int i) const;
protected:
private:
	DLinkListNode<T> *head;
};

template <typename T>
DLinkListClass<T>::DLinkListClass(void)
{
	head = new DLinkListNode<T>;
	head->next = nullptr;
	head->prior = nullptr;
}

template <typename T>
DLinkListClass<T>::~DLinkListClass(void)
{
	DLinkListNode<T> *p = head;

	while (nullptr != p)
	{
		p = p->next;
		delete head;
		head = p;
	}
}

template <typename T>
bool DLinkListClass<T>::CreateListF(const T *a, int n) const
{
	if (n < 0)
	{
		return false;
	}

	DLinkListNode<T> *p;

	for (int i = 0; i < n; ++i)
	{
		p = new DLinkListNode<T>;
		p->data = a[i];
		p->next = head->next;

		if (nullptr != head->next)
		{
			head->next->prior = p;
		}

		head->next = p;
		p->prior = head;
	}

	return true;
}

template <typename T>
bool DLinkListClass<T>::CreateListR(const T *a, int n) const
{
	if (n < 0)
	{
		return false;
	}

	DLinkListNode<T> *p = head;

	for (int i = 0; i < n; ++i)
	{
		p->next = new DLinkListNode<T>;
		p->next->prior = p;
		p = p->next;
		p->data = a[i];
	}

	p->next = nullptr;
	return true;
}

template <typename T>
void DLinkListClass<T>::Display(void) const
{
	DLinkListNode<T> *p = head->next;

	while (nullptr != p)
	{
		std::cout << p->data << " ";
		p = p->next;
	}

	std::cout << std::endl;
}

template <typename T>
int DLinkListClass<T>::ListLength(void) const
{
	DLinkListNode<T> *p = head->next;
	int i = 0;

	while (nullptr != p)
	{
		p = p->next;
		++i;
	}

	return i;
}

template <typename T>
bool DLinkListClass<T>::GetElem(int i, T &e) const
{
	if (i < 1)
	{
		return false;
	}

	DLinkListNode<T> *p = head->next;
	int j = 1;

	while (nullptr != p && i < j)
	{
		p = p->next;
		++j;
	}

	if (nullptr == p)
	{
		return false;
	}
	else
	{
		e = p->data;
		return true;
	}
}

template <typename T>
bool DLinkListClass<T>::LocateElem(const T &e, int &i) const
{
	DLinkListNode<T> *p = head->next;
	int j = 1;

	while (nullptr != p && e != p->data)
	{
		p = p->next;
		++j;
	}

	if (nullptr == p)
	{
		return false;
	}
	else
	{
		i = j;
		return true;
	}
}

template <typename T>
bool DLinkListClass<T>::ListInsert(int i, const T &e) const
{
	if (i < 1)
	{
		return false;
	}

	DLinkListNode<T> *p = head;
	DLinkListNode<T> *q;
	int j = 1;

	while (nullptr != p && j < i)
	{
		p = p->next;
		++j;
	}

	if (nullptr == p)
	{
		return false;
	}
	else
	{
		q = new DLinkListNode<T>;
		q->data = e;
		q->next = p->next;

		if (nullptr != p->next)
		{
			q->next->prior = p;
		}

		p->next = q;
		q->prior = p;
		return true;
	}
}

template <typename T>
bool DLinkListClass<T>::ListDelete(int i) const
{
	if (i < 1)
	{
		return false;
	}

	DLinkListNode<T> *p = head;
	DLinkListNode<T> *q;
	int j = 1;

	while (nullptr != p->next && j < i)
	{
		p = p->next;
		++j;
	}

	if (nullptr == p->next)
	{
		return false;
	}
	else
	{
		q = p->next;
		p->next = q->next;

		if (nullptr != p->next)
		{
			q->next->prior = p;
		}

		delete q;
		return true;
	}
}

#endif // _DLINKLISTCLASS_H_

main.cpp

#include <iostream>
#include "DLinkListClass.h"

using namespace std;

int main(void)
{
	DLinkListClass<int> L1;
	DLinkListClass<int> L2;
	const int n = 10;
	int a[n] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
	int i = 1;
	int e;

	L1.CreateListF(a, n);
	L2.CreateListR(a, n);

	cout << "L1: " << endl;
	L1.Display();
	cout << "L2: " << endl;
	L2.Display();

	L1.GetElem(i, e);
	cout << "L1: i = 1, e = " << e << endl;
	L2.LocateElem(e, i);
	cout << "L2: e = " << e << ", i = " << i << endl;

	L1.ListInsert(11, 0);
	L1.ListDelete(1);
	L2.ListInsert(1, 0);
	L2.ListDelete(11);

	cout << "L1: " << endl;
	L1.Display();
	cout << "L2: " << endl;
	L2.Display();

	cout << "L1.length = " << L1.ListLength() << endl;

	system("PAUSE");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值