C++实现双向链表

下面就是我们双向链表的基本原理。


这里我们插入代码案例:头文件DoubleLink.h

#ifndef DOUBLE_LINK_HXX
#define DOUBLE_LINK_HXX

#include <iostream>
using namespace std;
//一个节点
template<class T> 
struct DNode 
{
public:
	T value;
	DNode *prev;
	DNode *next;
public:
	DNode() { }
	DNode(T t, DNode *prev, DNode *next) {
		this->value = t;
		this->prev  = prev;
		this->next  = next;
	}
};
//双向链表基本操作
template<class T> 
class DoubleLink 
{
public:
	DoubleLink();
	~DoubleLink();

	int size();//大小
	int is_empty();//判断是否为空

	T get(int index);//获取节点
	T get_first();//获取首节点
	T get_last();//获取尾节点

	int insert(int index, T t);
	int insert_first(T t);
	int append_last(T t);

	int del(int index);
	int delete_first();
	int delete_last();

private:
	int count;
	DNode<T> *phead;
private:
	DNode<T> *get_node(int index);
};

template<class T>
DoubleLink<T>::DoubleLink() : count(0)
{
	// 创建“表头”。注意:表头没有存储数据!
	phead = new DNode<T>();
	phead->prev = phead->next = phead;
	// 设置链表计数为0
	//count = 0;
}

// 析构函数
template<class T>
DoubleLink<T>::~DoubleLink() 
{
	// 删除所有的节点
	DNode<T>* ptmp;
	DNode<T>* pnode = phead->next;
	while (pnode != phead)
	{
		ptmp = pnode;
		pnode=pnode->next;
		delete ptmp;
	}

	// 删除"表头"
	delete phead;
	phead = NULL;
}

// 返回节点数目
template<class T>
int DoubleLink<T>::size() 
{
	return count;
}

// 返回链表是否为空
template<class T>
int DoubleLink<T>::is_empty() 
{
	return count==0;
}

// 获取第index位置的节点
template<class T>
DNode<T>* DoubleLink<T>::get_node(int index) 
{
	// 判断参数有效性
	if (index<0 || index>=count)
	{
		cout << "get node failed! the index in out of bound!" << endl;
		return NULL;
	}

	// 正向查找
	if (index <= count/2)
	{
		int i=0;
		DNode<T>* pindex = phead->next;
		while (i++ < index) {
			pindex = pindex->next;
		}

		return pindex;
	}

	// 反向查找
	int j=0;
	int rindex = count - index -1;
	DNode<T>* prindex = phead->prev;
	while (j++ < rindex) {
		prindex = prindex->prev;
	}

	return prindex;
}

// 获取第index位置的节点的值
template<class T>
T DoubleLink<T>::get(int index) 
{
	return get_node(index)->value;
}

// 获取第1个节点的值
template<class T>
T DoubleLink<T>::get_first() 
{
	return get_node(0)->value;
}

// 获取最后一个节点的值
template<class T>
T DoubleLink<T>::get_last() 
{
	return get_node(count-1)->value;
}

// 将节点插入到第index位置之前
template<class T>
int DoubleLink<T>::insert(int index, T t) 
{
	if (index == 0)
		return insert_first(t);

	DNode<T>* pindex = get_node(index);
	DNode<T>* pnode  = new DNode<T>(t, pindex->prev, pindex);
	pindex->prev->next = pnode;
	pindex->prev = pnode;
	count++;

	return 0;
}

// 将节点插入第一个节点处。
template<class T>
int DoubleLink<T>::insert_first(T t) 
{
	DNode<T>* pnode  = new DNode<T>(t, phead, phead->next);
	phead->next->prev = pnode;
	phead->next = pnode;
	count++;

	return 0;
}

// 将节点追加到链表的末尾
template<class T>
int DoubleLink<T>::append_last(T t) 
{
	DNode<T>* pnode = new DNode<T>(t, phead->prev, phead);
	phead->prev->next = pnode;
	phead->prev = pnode;
	count++;

	return 0;
}

// 删除index位置的节点
template<class T>
int DoubleLink<T>::del(int index) 
{
	DNode<T>* pindex = get_node(index);
	pindex->next->prev = pindex->prev;
	pindex->prev->next = pindex->next;
	delete pindex;
	count--;

	return 0;
}

// 删除第一个节点
template<class T>
int DoubleLink<T>::delete_first() 
{
	return del(0);
}

// 删除最后一个节点
template<class T>
int DoubleLink<T>::delete_last() 
{
	return del(count-1);
}

#endif

得意接下来就放入DlinkTest.cpp

#include <iostream>
#include "DoubleLink.h"
using namespace std;

// 双向链表操作int数据
void int_test()
{
	int iarr[4] = {10, 20, 30, 40};//定义一个数组

	cout << "\n开始测试 int数据" << endl;
	// 创建双向链表
	DoubleLink<int>* pdlink = new DoubleLink<int>();

	pdlink->insert(0, 20);        // 将 20 插入到第一个位置
	pdlink->append_last(10);    // 将 10 追加到链表末尾
	pdlink->insert_first(30);    // 将 30 插入到第一个位置

	// 双向链表是否为空
	cout << "is_empty()=" << pdlink->is_empty() <<endl;
	// 双向链表的大小
	cout << "size()=" << pdlink->size() <<endl;

	// 打印双向链表中的全部数据
	int sz = pdlink->size();
	for (int i=0; i<sz; i++)
		cout << "pdlink("<<i<<")=" << pdlink->get(i) <<endl;
}


int main()
{
	int_test();        // 演示向双向链表操作“int数据”。
	system("pause");
	return 0;
}
上面代码亲自敲的,并且运行成功。可复制直接使用。





  • 37
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是基于双向链表的插入数据并自动排序的 C 代码示例: ```c #include <stdio.h> #include <stdlib.h> /* 双向链表结构体 */ typedef struct node { int data; struct node *next; struct node *prev; } Node; /* 插入数据并自动排序 */ void insert(Node **head, int data) { /* 创建新节点 */ Node *new_node = (Node*) malloc(sizeof(Node)); new_node->data = data; new_node->next = NULL; new_node->prev = NULL; /* 如果链表为空,则新节点为头节点 */ if (*head == NULL) { *head = new_node; return; } /* 头节点数据比新节点数据大,新节点插入头部 */ if ((*head)->data > data) { new_node->next = *head; (*head)->prev = new_node; *head = new_node; return; } /* 查找新节点插入位置 */ Node *cur = *head; while (cur->next != NULL && cur->next->data < data) { cur = cur->next; } /* 插入新节点 */ new_node->next = cur->next; new_node->prev = cur; if (cur->next != NULL) { cur->next->prev = new_node; } cur->next = new_node; } /* 打印链表 */ void print_list(Node *head) { Node *cur = head; while (cur != NULL) { printf("%d ", cur->data); cur = cur->next; } printf("\n"); } /* 主函数 */ int main() { Node *head = NULL; insert(&head, 3); insert(&head, 1); insert(&head, 4); insert(&head, 2); insert(&head, 5); print_list(head); return 0; } ``` 在上述代码中,我们首先定义了双向链表的结构体,包括数据域 `data` 和指向前驱节点和后继节点的指针 `prev` 和 `next`。 然后,我们定义了一个 `insert` 函数来实现插入数据并自动排序。如果链表为空,则新节点为头节点;如果头节点数据比新节点数据大,则新节点插入头部;否则,我们遍历链表找到新节点的插入位置,并插入新节点。 最后,我们实现了一个 `print_list` 函数来打印链表,并在主函数中测试了我们的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值