双向链表(插入,删除,追加,正反向遍历,查找。。。)

#include <iostream>
#include <stdexcept>
using namespace std;
class List
{
public:
	List(void) : m_head(NULL), m_tail(NULL), m_size(0){}
	~List(void)
	{
		for(Node* node = m_head; m_head; m_head = node)
		{
			node = m_head->m_next;
			delete m_head;
		}
	}
	//在Index处插入元素
	void insert(int data, size_t index)
	{
		//如果下标超过元素个数,则追加在链表最后
		if(index >= m_size)
		{
			append(data);
			return;
		}
		Node* temp = new Node(data);
		//如果下标为0,则插入在头节点
		if(0 == index)
		{
			temp->m_next = m_head;
			m_head->m_prev = temp;
			m_head = temp;
			++m_size;
			return;
		}
		size_t count = 1;
		//其它情况
		for(Node* node = m_head->m_next; node; node = node->m_next)
		{
			if(index == count)
			{
				temp->m_next = node;
				temp->m_prev = node->m_prev;
				node->m_prev->m_next = temp;
				node->m_prev = temp;
				++m_size;
				return;
			}
			++count;
		}
	}
	//在链表尾部追加元素
	void append(int data)
	{
		Node* node = new Node(data);
		if(!m_head)
			m_head = node;
		else
		{
			node->m_prev = m_tail;
			m_tail->m_next = node;
		}
		m_tail = node;
		++m_size;
	}
	//删除元素
	void erase(size_t index)
	{
		if(!m_head)
			throw UnderFlow();
		//首先查找要删除的元素
		Node*& node = find(index, m_head);
		node->m_prev->m_next = node->m_next;
		node->m_next->m_prev = node->m_prev;
		delete node;
		node = NULL;
	}
	//查找元素
	int& find(size_t index)
	{
		Node*& node = find(index, m_head);
		return node->m_data;
	}
	//正向遍历
	void forward ()const
	{
		if(!m_head)
			throw UnderFlow();
		for(Node* node = m_head; node; node = node->m_next)
		{
			cout << node->m_data << ' ';
		}
		cout << endl;
	}
	//反向遍历
	void backward()const
	{
		if(!m_tail)
			throw UnderFlow();
		for(Node* node = m_tail; node; node = node->m_prev)
		{
			cout << node->m_data << ' ';
		}
		cout << endl;
	}
	//链表元素个数
	size_t size()
	{
		return m_size;
	}
	//重载下标操作符,作为左值
	int& operator[] (size_t index)
	{
		if(index >= m_size)
			throw OverFlow();
		Node*& node = find(index, m_head);
		return node->m_data;
	}
	//重载下标操作符,作为右值
	const int& operator[] (size_t index)const
	{
		//去常属性后,调用上面下标重载
		return const_cast<List&>(*this) [index];
	}
private:
	//链表每个节点
	class Node
	{
	public:
		Node(int data=0, Node* prev=NULL, Node* next=NULL):
			m_data(data), m_prev(prev), m_next(next){}
		int m_data;
		Node* m_prev;
		Node* m_next;
	};
	//下溢异常类
	class UnderFlow : public exception
	{
	public:
		const char* what() throw()
		{
			return "下溢异常!";
		}
	};
	//下标越界!
	class OverFlow : public exception
	{
	public:
		const char* what() throw()
		{
			return "下标越界!";
		}
	};
	Node*& find(size_t index, Node* head)
	{
		if(index >= m_size)
			throw OverFlow();
		size_t count = 0;
		for(Node*& node = head; node; node = node->m_next)
		{
			if(index == count)
				return node;
			++count;
		}
	}
	Node* m_head;
	Node* m_tail;
	size_t m_size;
};
int main()
{
	List list;
	list.append(10);
	list.append(20);
	list.append(30);
	list.append(40);
	list.append(50);
	list.append(60);
	list.append(70);
	cout << "元素个数:" << list.size() << endl;
	list.forward();
	list.backward();
	list.insert(100, 0);
	list.insert(150, 11);
	cout << "元素个数:" << list.size() << endl;
	list.forward();
	list.backward();
	cout << "第5个元素是:" << list.find(5) << endl;
	list.erase(5);
	cout << "删除第5个元素后:";
	list.forward();
	list[5] = 876;
	list.forward();
	cout << "第5个元素是:" << list[5] << endl;
	return 0;
}

时间: 2024-10-23 13:53:25

双向链表(插入,删除,追加,正反向遍历,查找。。。)的相关文章

JAVA带表头的双向链表插入,删除,查找操作

1.建立双向链表的结点Node2.建立类Linkedlist,成员head是指向表头的引用,在linkedlist中定义链表的操作方法.ps:插入删除操作要判断pos,如果在表尾,要特判防止出现空引用. public class Node {//建立双向链表的结点 public Node left; public Node right; public int data; public Node(){ this.left=null; this.right=null; this.data=0; }

顺序表 初始化 插入 删除 查找 合并 交换 判断为空 求长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(SqList) #define MLC (Li

JavaScript之jQuery-3 jQuery操作DOM(查询、样式操作、遍历节点、创建插入删除、替换、复制)

一.jQuery操作DOM - 查询 html操作 - html(): 读取或修改节点的HTML内容,类似于JavaScript中的innerHTML属性 文本操作 - text(): 读取或修改节点的文本内容,类似于JavaScript中的textContent属性 值操作 - val(): 读取或修改节点的value属性值,类似于 JavaScript 中的value值 属性操作 - attr(): 读取或者修改节点的属性 - removeAttr(): 删除节点的属性 二.jQuery操作

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

转 :asp教程.net c#数组遍历、排序、删除元素、插入、随机元素 数组遍历

asp教程.net c#数组遍历.排序.删除元素.插入.随机元素数组遍历 short[] sts={0,1,100,200};for(int i=0;i<sts.lenght;i++){  if(sts[i]>50) {  .....  }} 数组随机元素 public  hashtable  noorder(int count)         {             arraylist mylist = new arraylist();             hashtable ha

二叉搜索树的创建 &amp;&amp; 查找 &amp; 插入 &amp; 删除

二叉搜索树的删除: 在删除之前需要从树中查找到这个节点,然后再针对情况来判断如何删除. 分为三种情况,首先是此节点没有孩子节点,此节点有一个孩子节点,此节点有两个孩子节点 void Delete(BinTree*& root,int value) { BinTree* delnode= NULL; if(root == NULL) return ; BinTree* temp = root; BinTree* parent =NULL; while(temp!=NULL) { if(temp-&g

leveldb源码分析--插入删除流程

由于网络上对leveldb的分析文章都比较丰富,一些基础概念和模型都介绍得比较多,所以本人就不再对这些概念以专门的篇幅进行介绍,本文主要以代码流程注释的方式. 首先我们从db的插入和删除开始以对整个体系有一个感性的认识,首先看插入: Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) { WriteBatch batch; //leveldb中不管单个插入还是多个插入都是以Wri

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)

静态链表 初始化 定位 Malloc Free 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define MAX_SIZE 1000;//表最大空间 /* //线性表的基本操

AVL树非递归插入删除思路

AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文<An algorithm for the organization of information>中发表了它. 节点的平衡因子是它的左子树的高度减去它的右子树的