现在的位置: 首页 > 综合 > 正文

链表

2012年08月07日 ⁄ 综合 ⁄ 共 7074字 ⁄ 字号 评论关闭

目标:

1.实现单向链表

2.有序链表的合并,多项式的加法运算

一.顺序链表的实现

#pragma once
#include <iostream>
using namespace std;

const int Defualt_Size = 100;

template<class Type>
class SeqList
{
public:
	SeqList(int size = Defualt_Size):
		maxSize(size),currentPos(-1){
			if (size > 0) {
				elements = new Type[maxSize];
			}
	}

	~SeqList(){
		delete [] elements;
	}

	int GetLength() const {
		return currentPos + 1;
	}

	int Find(const Type& t) const; //查找t的位置
	bool IsElement(const Type& t) const;//判断t是否在链表中
	bool Insert(const Type& t,int pos = 0);
	bool Remove(const Type& t);
	void Print() const;
	bool PushBack(const Type& t);

	int IsEmpty() { return currentPos == -1;}
	int IsFull() { return currentPos == maxSize -1;}
	Type Get(int pos) const {
		return (pos < 0 || pos > currentPos) ?
			(cout<<"can't find the element"<<endl,0) : elements[pos];
	}

private:
	Type* elements;
	const int maxSize;
	int currentPos;
};

template<class Type>
int SeqList<Type>::Find(const Type& t) const
{
	for (int i = 0; i <= currentPos;++i) {
		if (elements[i] == t) {
			return i;
		}
	}
	cout<<"can't find the element"<<endl;
	return -1;
}

template<class Type>
bool SeqList<Type>::IsElement(const Type& t) const
{
	if (Find(t) ==  -1) {
		return false;
	}
	return true;
}

template<class Type>
bool SeqList<Type>::Insert(const Type& t,int pos)
{
	if (pos < 0 || pos > currentPos + 1 || currentPos == maxSize -1) {
		cout<<"failed to insert,the operat is illegal."<<endl;
		return false;
	}
	currentPos++;
	for (int i = currentPos; i > pos; --i) {
		elements[i] = elements[i-1];
	}
	elements[pos] = t;
	return true;
}

template<class Type>
bool SeqList<Type>::Remove(const Type& t)
{
	//有bug,当有重复元素,只能删除一个
	/*int pos = Find(t);
	if (pos == -1) {
		cout<<""<<endl;
		return false;
	}
	for (int i = pos; i <= currentPos; ++i) {
		elements[i] = elements[i+1];
	}
	currentPos--;
	return true;*/
	int size = currentPos;
	for(int i = 0; i <= currentPos;) {
		if (elements[i] == t) {
			for (int j = i; j<= currentPos; ++j) {
				elements[j] = elements[j+1];
			}
			currentPos--;
			continue;//长度减少一,所以i不用自增
		}
		i++;
	}
	return true;
}

template<class Type>
void SeqList<Type>::Print() const
{
	for (int i = 0; i <= currentPos; ++i) {
		cout<<elements[i]<<" ";
	}
	cout<<endl;
}

template<class Type>
bool SeqList<Type>::PushBack(const Type& t)
{
	if (currentPos == maxSize -1) {
		return (cout<<"the list is full"<<endl,false);
	}
	elements[++currentPos] = t;
	return true;
}

测试代码:

#pragma  once

#include "SeqList.h"

int main()
{
	SeqList<int> test(19);
	test.Print();
	int array[15]={2,5,8,1,9,9,7,6,4,3,2,9,7,7,9};
	for(int i=0;i<15;i++){
		test.Insert(array[i],0);
		cout<<test.GetLength()<<endl;
	}
	cout<<test.Get(14)<<endl;
	test.Print();
	test.Insert(0,0);
	test.Print();
	test.Insert(0,1);
	test.Print();
	cout<<(test.Find(0)?"can't be found ":"Be found ")<< 0 << endl<<endl;
	test.Remove(7);
	test.Print();
	test.Remove(9);
	test.Print();
	test.Remove(0);
	test.Print();
	test.Remove(2);
	test.Print();

	SeqList<double> testdouble(5);
	testdouble.Insert(2.0,0);
	testdouble.Insert(32.213213,0);
	testdouble.Print();

	SeqList<char> testchar(5);
	testchar.Insert(2,0);
	testchar.Insert(87,0);
	testchar.Insert('c',0);
	testchar.PushBack('d');
	testchar.PushBack('d');
	testchar.PushBack('d');
	testchar.Print();
	testchar.Remove('d');
	testchar.Print();
	return 0;
}

二.单向链表的实现

结点类:
#pragma once
#include <iostream>
using namespace std;

template<class Type>
class SingleList;

template<class Type>
class ListNode
{
private:
	friend class SingleList<Type>;
	ListNode():data(),next(NULL){}
	ListNode(const Type& t,ListNode<Type>* n = NULL):data(t),next(n){}
	~ListNode(){ next = NULL;}

public:
	Type GetData() const { return data; }
	friend ostream& operator << <Type>(ostream&,const ListNode<Type>&);

private:
	Type data;
	ListNode* next;
};

template<class Type>
ostream& operator << (ostream& out,const ListNode<Type>& node)
{
	out<<node.data<<endl;
	return out;
}

链表类:

#pragma once
#include "listnode.h"

template<class Type>
class SingleList
{
public:
	SingleList():head(new ListNode<Type>){}
	~SingleList(){ 
		delete head;
	}

	void MakeEmpty();
	int GetLength();
	//查找第n个t
	ListNode<Type>* Find(const Type& t,int n) const;
	ListNode<Type>* Find(int) const;
	bool Insert(const Type&,int pos = 0);
	bool Modify(const Type&,int pos = -1) const;
	bool Remove(int pos = 0);
	void RemoveAll(const Type&);
	Type Get(int pos) const;
	void Print() const;

private:
	ListNode<Type>* head; //表头
};

template<class Type>
void SingleList<Type>::MakeEmpty()
{
	ListNode<Type>* current = head;
	while (head->next)	{
		current = head->next;
		head->next = current->next;
		delete current;
	}
}

template<class Type>
int SingleList<Type>::GetLength()
{
	ListNode<Type>* pMove = head;
	int cout = 0;
	while (pMove) {
		pMove = pMove->next;
		cout++;
	}
	return cout;
}


template<class Type>
ListNode<Type>* SingleList<Type>::Find(const Type& t,int n) const
{
	if (n < 1) {
		cout<<"The n is invalid."<<endl;
		return NULL;
	}

	ListNode<Type>* pMove = head;
	int count = 0;
	while (count != n && pMove) {
		pMove = pMove->next;
		if (pMove->data == t) {
			count++;
		}
	}

	if (!pMove) {
		cout<<"Can't find the element of "<<n<<" times."<<endl;
		return NULL;
	}

	return pMove;
}

//从表头开始
template<class Type>
ListNode<Type>* SingleList<Type>::Find(int n) const
{
	if (n < 0) {
		cout<<"the input is invalid."<<endl;
		return NULL;
	}

	ListNode<Type>* pMove = head;
	for (int i = 0; i < n && pMove; ++i) {
		pMove = pMove->next;
	}

	if (!pMove) {
		cout<<"the n is out of boundary"<<endl;
		return NULL;
	}

	return pMove;
}

template<class Type>
bool SingleList<Type>::Insert(const Type& t,int pos = 0)
{
	if (pos < 0) {
		cout<<"the input is invalid."<<endl;
		return false;
	}

	ListNode<Type>* pMove = head;
	for (int i = 0; i < pos && pMove; ++i) {
		pMove = pMove->next;
	}

	if (!pMove) {
		cout<<"the pos is out of boundary."<<endl;
		return false;
	}
	ListNode<Type>* pNode = new ListNode<Type>(t);
	pNode->next = pMove->next;
	pMove->next = pNode;
	return true;
}

template<class Type>
bool SingleList<Type>::Modify(const Type& t,int pos) const
{
	if (pos < 0) {
		cout<<"the pos is out of boundary."<<endl;
		return false;
	}
	ListNode<Type>* pMove = head->next;
	for (int i = 0; i < pos && pMove; ++i) {
		pMove = pMove->next;
	}
	if (!pMove) {
		cout<<"the pos is out of boundary."<<endl;
		return false;
	}
	pMove->data = t;
	return true;
}


template<class Type>
bool SingleList<Type>::Remove(int pos)
{
	if (pos < 0) {
		cout<<"the pos is out of boundary."<<endl;
		return false;
	}

	ListNode<Type>* pMove = head;
	ListNode<Type>* pNext = head;
	int count = 0;
	while (count < pos - 1 && pMove) {
		pMove = pMove->next;
		count++;
	}
	if (!pMove) {
		cout<<"fail to remove emelemt."<<endl;
		return false;
	}
	pNext = pMove->next;
	pMove->next = pNext->next;
	delete pNext;
	return true;
}

template<class Type>
void SingleList<Type>::RemoveAll(const Type& value)
{
	ListNode<Type>* pMove = head;
	ListNode<Type>* pNext = head->next;
	while (pNext) {
		if (pNext->data == value) {
			pMove->next = pNext->next;
			delete pNext;
			pNext = pMove->next;
			continue;
		}
		pMove = pMove->next;
		pNext = pNext->next;
	}
}

template<class Type>
Type SingleList<Type>::Get(int pos) const
{
	if (pos < 0) {
		cout<<"the pos is out of boundary."<<endl;
		return NULL;
	}
	ListNode<Type>* pMove = head;
	for (int i = 0; i < pos && pMove; ++i) {
		pMove = pMove->next;
	}
	if (!pMove) {
		cout<<"the pos is out of boundary."<<endl;
		return NULL;
	}
	return pMove->data;
}

template<class Type>
void SingleList<Type>::Print() const
{
	ListNode<Type>* pMove = head->next;
	cout<<"head--->";
	while (pMove) {
		cout<<pMove->data<<"--->";
		pMove = pMove->next;
	}
	cout<<"end"<<endl;
}
	

测试代码:

#include "singlelist.h"

int main()
{
	SingleList<float> test;
	test.Insert(1);
	test.Insert(2);
	test.Insert(3);
	test.Insert(4);
	test.Insert(5);
	cout<<"the Length of the list is "<<test.GetLength()<<endl;
	test.Print();
	test.Modify(300,1);
	test.Print();
	SingleList<int> list;
	for(int i=0;i<20;i++){
		list.Insert(i*3,i);
	}
	for(int i=0;i<5;i++){
		list.Insert(3,i*3);
	}
	cout<<"the Length of the list is "<<list.GetLength()<<endl;
	list.Print();

	list.Remove(5);
	cout<<"the Length of the list is "<<list.GetLength()<<endl;
	list.Print();

	list.RemoveAll(3);
	cout<<"the Length of the list is "<<list.GetLength()<<endl;
	list.Print();

	cout<<"The third element is "<<list.Get(3)<<endl;

	cout<<*list.Find(18,1)<<endl;

	list.Find(100);

	list.MakeEmpty();
	cout<<"the Length of the list is "<<list.GetLength()<<endl;
	list.Print();

	return 0;
}

抱歉!评论已关闭.