双向链表的实现

#include "Node.h"
#include <iostream>
using namespace std;
class LinkedList
{
private:
	int listLength;//链表长度
	bool isEmpty;//记录链表是否为空表
	Node *headNode;
public:
	LinkedList();//构造函数
	int getListLength(){return listLength;}
	void addElem();//向链表中添加元素,表尾
	void printList();//打印链表
	void clearList();//清空链表,即释放所有节点内存
	void addElemToHead(int);//向链表表头添加一个元素
	void addElemToTail(int);//向链表表尾添加一个元素
	Node *getPtr(int index);//返回链表中从表头起第index个元素的指针,0<=index<listLength
	
	void deleteElem1(int index);//删除从表头起第index个元素,
	void deleteElem2(int number);//删除链表中元素为number的所有节点
	void deleteElem3(int number);//删除链表中从表头起第一个等于number的节点
	
	void search(int number);//在链表中查找关键字等于number的节点,并输出其所在位置
	void insertElem(int index,int number);//向链表的第index处插入元素number,

};

//构造函数
LinkedList::LinkedList()//
{
	headNode = new Node;//新节点next和prev为NULL
	listLength = 0;
	isEmpty = true;
}

//向链表中添加元素,表尾
void LinkedList::addElem()
{
	int num;
	char whetherContinue;
	do{
		cout << "please input an elem you want to add to the list:";
		cin >> num;
		if(isEmpty)
		{
			this->headNode->setElem(num);
			this->isEmpty = false;//表不为空
		}
		else{
			Node *tempNode = new Node;
			tempNode->setElem(num);
			if(headNode->getNextPtr()!=NULL)
				headNode->getNextPtr()->setPrev(tempNode);
			tempNode->setNext(headNode->getNextPtr());
			tempNode->setPrev(headNode);
			headNode->setNext(tempNode);
		}
		this->listLength = listLength + 1;//链表长度加一
		cout << "continue to add elem to the list ? (y/n):";
		cin >> whetherContinue;
	}while(whetherContinue=='y'||whetherContinue=='Y');
}

//打印链表
void LinkedList::printList()
{
	if(this->isEmpty)
		cout << "the list is empty." << endl;
	else{
		cout << "the list is :";
		Node *temp = this->headNode;
		while(temp!=NULL)
		{
			cout << " " << temp->getElem();
			temp = temp->getNextPtr();
		}
		cout << endl;
	}
}

//清空链表,即释放所有节点内存,
void LinkedList::clearList()
{
	if(!this->isEmpty)//当表不是空表时进行清空操作
	{
		Node *temp;//删除操作一定是删除一个节点,!!!
		                   //直接删除节点的指针是错误的
		while(headNode!=NULL)
		{
			temp = headNode->getNextPtr();
			delete headNode;
			this->headNode = temp;
		}
		//因为头节点已经清空内存,因此需要新建
		headNode = new Node;
		headNode->setNext(NULL);
		headNode->setPrev(NULL);
		this->isEmpty = true;
		this->listLength = 0;//空表的两个属性
	}
}

//向链表表头添加一个元素
void LinkedList::addElemToHead(int num)
{
	if(this->isEmpty)//如果是空表
	{
		this->headNode->setElem(num);
		isEmpty = false;//表中有元素,不为空
		this->listLength = 1;
	}
	else{
		Node *tempNode = new Node;
		
		tempNode->setElem(this->headNode->getElem());
		this->headNode->setElem(num);
		tempNode->setNext(this->headNode->getNextPtr());
		tempNode->setPrev(this->headNode);
		if(this->headNode->getNextPtr()!=NULL)
			this->headNode->getNextPtr()->setPrev(tempNode);
		this->headNode->setNext(tempNode);
		
		this->listLength = this->listLength + 1;
	}
}

//向链表表尾添加一个元素
void LinkedList::addElemToTail(int num)
{
	if(this->isEmpty)
	{
		headNode->setElem(num);
		this->isEmpty = false;
	}
	else
	{
		Node *tailNode = this->getPtr(listLength);//仔细想想为什么不new一个空间呢,别名!!!
		Node *addedNode = new Node;
		addedNode->setElem(num);
		addedNode->setPrev(tailNode);
		tailNode->setNext(addedNode);
	}
	this->listLength = listLength + 1;
}

//返回链表中从表头起第index个元素的指针,0<index<listLength,以及空表NULL指针
Node *LinkedList::getPtr(int index)//已知index大于0且小于等于listLength,,,
{
	if(this->isEmpty)//空表情况下
		return NULL;
	else{
		int count = 0;
		Node *temp;
		do{
			if(count==0)//赞咯,我真机智
				temp = headNode;
			else
				temp = temp->getNextPtr();
			count++;
		}while(count<index);
		return temp;
	}
}

//删除从表头起第index个元素
void LinkedList::deleteElem1(int index)
{
	if(listLength==0)
		cout << "the list is empty,cann't delete elem." << endl;
	else if(index<=0||index>listLength)
		cout << "the index beyond the range of list,cann't delete elem." << endl;
	else{
		Node *elemNode = this->getPtr(index);
		//链表只有一个节点的情况
		if(elemNode->getPrevPtr()==NULL && elemNode->getNextPtr()==NULL)
		{
			delete headNode;
			headNode = new Node;//新建表头节点
			this->headNode->setNext(NULL);
			headNode->setPrev(NULL);
			this->listLength = 0;
			this->isEmpty = true;
		}
		//elemNode位于表头
		else if(elemNode->getPrevPtr()==NULL&&elemNode->getNextPtr()!=NULL)
		{
			headNode = headNode->getNextPtr();
			headNode->setPrev(NULL);
			delete elemNode;
			listLength = listLength - 1;
		}
		//elemNode位于表尾
		else if(elemNode->getPrevPtr()!=NULL&&elemNode->getNextPtr()==NULL)
		{
			Node *tail = this->getPtr(listLength);
			tail->getPrevPtr()->setNext(NULL);
			delete tail;
			listLength = listLength - 1;
		}
		//elemNode位于表中
		else{
			elemNode->getPrevPtr()->setNext(elemNode->getNextPtr());
			elemNode->getNextPtr()->setPrev(elemNode->getPrevPtr());
			delete elemNode;
			listLength = listLength - 1;
		}
	}
}

//删除链表中元素为number的所有节点
void LinkedList::deleteElem2(int number)
{
	if(isEmpty)
	{	
		cout << "the list is empty." << endl;
		return;
	}
	bool exist = false;
	Node *temp = this->headNode;
	Node *tempNext;
	int length = this->listLength;
	for(int i=1;i<=length;i++)
	{
		tempNext = temp->getNextPtr();
		if(temp->getElem()==number)
		{
			exist = true;
			if(this->listLength==1)//表中只有一个元素,且和number相等
			{	
				delete this->headNode;
				headNode = new Node;//申请新的内存区域
				headNode->setNext(NULL);
				headNode->setPrev(NULL);
				this->isEmpty = true;
			}
			else{//表中有两个或者以上元素时,且temp位于表头
				if(temp->getPrevPtr()==NULL&&temp->getNextPtr()!=NULL)
				{
					delete headNode;
					headNode = tempNext;
					headNode->setPrev(NULL);
				}
				//temp为表尾时
				else if(temp->getPrevPtr()!=NULL&&temp->getNextPtr()==NULL)
				{
					temp->getPrevPtr()->setNext(NULL);
					delete temp;
				}
				else{
					temp->getPrevPtr()->setNext(temp->getNextPtr());
					temp->getNextPtr()->setPrev(temp->getPrevPtr());
					delete temp;
				}
			}
			this->listLength = listLength - 1;
		}
		temp = tempNext;
	}
	if(!exist)//当exist为false时,即表中没有元素和number相等时
		cout << number << " is not in the list." << endl;
	else
		cout << number << " has been deleted from the list." << endl;
}

//删除链表中从表头起第一个等于number的节点
void LinkedList::deleteElem3(int number)
{
	if(isEmpty)
	{	
		cout << "the list is empty." << endl;
		return;
	}
	Node *temp = headNode;
	Node *tempNext;
	int length = listLength;
	for(int i=1;i<=length;i++)
	{
		tempNext = temp->getNextPtr();
		if(temp->getElem()==number)
		{
			if(listLength==1)
			{
				delete headNode;
				headNode = new Node;//申请节点内存空间
				headNode->setNext(NULL);
				headNode->setPrev(NULL);
				this->isEmpty = true;
				listLength = 0;
			}
			else{//表中有两个或两个以上节点,
				//temp为表头时,
				if(temp->getPrevPtr()==NULL&&temp->getNextPtr()!=NULL)
				{
					delete headNode;
					headNode = tempNext;
					headNode->setPrev(NULL);
				}
				//temp为表尾时
				else if(temp->getPrevPtr()!=NULL&&temp->getNextPtr()==NULL)
				{
					temp->getPrevPtr()->setNext(NULL);
					delete temp;
				}
				else{
					temp->getPrevPtr()->setNext(temp->getNextPtr());
					temp->getNextPtr()->setPrev(temp->getPrevPtr());
					delete temp;
				}
				listLength = listLength - 1;
			}
			break;
		}
		temp = tempNext;
	}
	if(length==listLength)//未在表中找到number
		cout << number << " is not in the list." << endl;
	else
		cout << "first finded elem " << number << " has been deleted from the list." << endl;
}

void LinkedList::search(int number)
{
	if(this->isEmpty)
		cout << "the list is empty,"<< number << " cann't be find in the list." << endl;
	else{
		LinkedList indexList = LinkedList();//创建一个链表对象用以存储可能出现的下标
		Node *temp = headNode;
		int count = 0;
		while(temp!=NULL)
		{
			count = count + 1;
			if(temp->getElem()==number)
			{
				indexList.addElemToTail(count);
			}
			temp = temp->getNextPtr();
		}
		if(indexList.getListLength()!=0)
		{
			cout << "the elem's index that elem equal with " << number << " is :" << endl;
			temp = indexList.headNode;
			while(temp!=NULL)
			{	
				cout << temp->getElem() << " ";
				temp = temp->getNextPtr();
			}
			cout << endl;
		}
	}
}

//向链表的第index处插入元素number,
void LinkedList::insertElem(int index,int number)
{
	if(listLength==0)
	{	
		if(index==1)//空表中插入元素
		{	
			headNode->setElem(number);
			this->isEmpty = false;
			this->listLength = 1;
		}
		else
			cout << "insert error." << endl;
		return;
	}
	if(index<=0||index>listLength)
	{
		cout << "index beyond the list size." << endl;
		return;
	}
	if(index==1)//index为1,就是向表头添加元素
	{
		this->addElemToHead(number);
		return;
	}
	if(index==listLength)//向原来表的表尾添加元素,变成倒数第二个了
	{
		Node *newNode = new Node;
		Node *tailNode = this->getPtr(listLength);//原来的表尾指针
		newNode->setElem(number);
		newNode->setPrev(tailNode->getPrevPtr());
		newNode->setNext(tailNode);
		tailNode->getPrevPtr()->setNext(newNode);
		tailNode->setPrev(newNode);
		listLength = listLength + 1;
		return;
	}
	//向一定长度的链表中添加,至少为3?
	Node *newNode = new Node;
	Node *tempNode;
	for(int i=1;i<=index;i++)
	{
		if(i==1)
			tempNode = headNode;
		else
			tempNode = tempNode->getNextPtr();
	}
	newNode->setElem(number);
	newNode->setNext(tempNode);
	newNode->setPrev(tempNode->getPrevPtr());
	tempNode->getPrevPtr()->setNext(newNode);
	tempNode->setPrev(newNode);
	listLength = listLength + 1;
}
#include <cstdlib>

class Node
{
private:
	int elem;
	Node *next;
	Node *prev;
public:
	Node();
	int getElem();
	void setNext(Node *);
	void setPrev(Node *);
	Node *getNextPtr();
	Node *getPrevPtr();
	void setElem(int);//改变节点中存放的值
};

Node::Node()
{
	this->next = this->prev = NULL;
}
int Node::getElem()
{
	return this->elem;
}
Node *Node::getNextPtr()
{
	return this->next;
}
Node *Node::getPrevPtr()
{
	return this->prev;
}
void Node::setNext(Node *n)
{
	this->next = n;
}
void Node::setPrev(Node *p)
{
	this->prev = p;
}
void Node::setElem(int k)
{
	elem = k;
}
//LinkedList.cpp
#include "LinkedList.h"
int main()
{
	LinkedList list = LinkedList();
	cout << "the initialize of list has finished." << endl;
	list.addElem();
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;
	
	cout << "clear the list." << endl;
	list.clearList();
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;

	list.addElem();
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;

	cout << "add 8 to the head of list." << endl;
	list.addElemToHead(8);
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;
	
	cout << "add 90  to the tail of list." << endl;
	list.addElemToTail(90);
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;

	cout << "search 8 from the list." << endl;
	list.search(8);

	cout << "delete the first elem that equal with 8." << endl;
	list.deleteElem3(8);
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;

	cout << "delete all the elem that equal with 8." << endl;
	list.deleteElem2(8);
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;

	cout << "insert 90 to the list that index is 3." << endl;
	list.insertElem(3,90);
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;

	cout << "delete the node's that index is 3" << endl;
	list.deleteElem1(3);
	list.printList();
	cout << "the length of list is :" << list.getListLength() << endl;

	system("pause >> cout");
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值