【C++/數據結構】循環鏈表的基本操作

#pragma once
#ifndef _SCLIST_H_
#define _SCLIST_H_

#include <iostream>
#include <assert.h>
using namespace std;

typedef enum{FALSE,TRUE} Status;

template<class Type> class List;


template<class Type>
class ListNode
{
	friend class List<Type>;
public:
	ListNode() :data(Type()), next(NULL)
	{}
	ListNode(Type d, ListNode<Type> *n = NULL)
		: data(d), next(n)
	{}
	~ListNode()
	{}
	void setData(const Type &d)
	{
		data = d;
	}
	Type GetData()
	{
		return data;
	}
private:
	Type data;
	ListNode<Type> *next;
};

template<class Type>
class List
{
public:
	List()
	{
		ListNode<Type> *s = new ListNode<Type>;
		assert(s != NULL);
		last = first = s;
		last->next = first;
		size = 0;
	}
	~List()
	{}
public:
	Status push_back(const Type &x)
	{
		ListNode<Type> *s = new ListNode<Type>(x);
		assert(s != NULL);
		s->next = last->next;
		last->next = s;
		last = s;
		size++;
		return TRUE;
	}
	Status push_front(const Type &x)
	{
		ListNode<Type> *s = new ListNode<Type>(x);
		assert(s != NULL);
		s->next = first->next;
		first->next = s;
		if (size == 0)
		{
			last = s;
			last->next = first;
		}
		size++;
		return TRUE;
	}
	Status pop_back()
	{
		if (size == 0)
		{
			return FALSE;
		}
		ListNode<Type> *p = first;
		ListNode<Type> *q = p->next;
		while (q->next != first)
		{
			p = p->next;
			q = q->next;
		}
		delete last;
		last = p;
		last->next = first;
		size--;
		return TRUE;
	}
	Status pop_front()
	{
		if (size == 0)
		{
			return FALSE;
		}
		ListNode<Type> *p = first;
		ListNode<Type> *q = p->next;
		p->next = q->next;
		delete q;
		if (size == 1)
		{
			last = first;
			last->next = first;
		}
		size--;
		return TRUE;
	}
	Status insert_val(const Type &x)
	{
		ListNode<Type> *p = first;
		while (p->next != first && p->next->data < x)
		{
			p = p->next;
		}
		if (p->next == first)
		{
			push_back(x);
		}
		else
		{
			ListNode<Type> *s = new ListNode<Type>(x);
			s->next = p->next;
			p->next = s;
			size++;
		}
		return TRUE;
	}
	Status delete_val(const Type &x)
	{/*
		if (size == 0)
		{
			return FALSE;
		}
		ListNode<Type> *p = find(x);
		if (p == NULL)
		{
			return FALSE;
		}
		if (p == last)
		{
			pop_back();
		}
		else
		{
			ListNode<Type> *q = p->next;
			p->data = q->data;
			p->next = q->next;
			if (p->next == last)//q爲最後一個結點
			{
				last = p;
			}
			delete q;
			size--;
			return TRUE;
		}*/
		if (size == 0)
		{
			return FALSE;
		}
		ListNode<Type> *p = first;
		ListNode<Type> *q = p->next;
		while (q != first && q->data != x)
		{
			p = p->next;
			q = q->next;
		}
		if (q->next == first)
		{
			pop_back();
		}
		else
		{
			p->next = q->next;
			delete q;
			size--;
		}
		return TRUE;
	}
	ListNode<Type> *find(const Type &key) const
	{
		if (size == 0)
		{
			return NULL;
		}
		ListNode<Type> *p = first->next;
		while (p != first && p->data !=key)
		{
			p = p->next;
		}
		if (p == first)
		{
			return NULL;
		}
		return p;
	}
	ListNode<Type> *Prio(const Type &x) const
	{
		if(size==0 || size==1)
		{
			return NULL;
		}
		ListNode<Type> *p = first->next;
		ListNode<Type> *q = p->next;
		while (q->data != x)
		{
			p = p->next;
			q = q->next;
		}
		return p;
	}
	ListNode<Type> *prio(ListNode<Type> *p) const
	{
		if (p==NULL || p==first->next)
		{
			return NULL;
		}
		ListNode<Type> *s = first;
		while (s->next != p)
		{
			s = s->next;
		}
		return s;
	}
	ListNode<Type> *Next(const Type &x) const
	{
		if(size==0 || size==1)
		{
			return NULL;
		}
		ListNode<Type> *s = find(x);
		if (s == NULL)
		{
			return NULL;
		}
		return s->next;
	}
	ListNode<Type> *next(ListNode<Type> *p) const
	{
		if (p == NULL || p->next != first)
		{
			return NULL;
		}
		ListNode<Type> *s = first;
		while (s->next != p)
		{
			s = s->next;
		}
		return s;
	}
	void show_List()
	{
		ListNode<Type> *p = first->next;
		while (p != first)
		{
			cout << p->data << "->";
			p = p->next;
		}
		cout << "first" << endl;
	}
	int length()
	{
		return size;
	}
	void clear()
	{
		ListNode<Type> *p = first->next;
		while (p != first)
		{
			first->next = p->next;
			delete p;
			p = first->next;
		}
		last = first;
		last->next = first;
		size = 0;
	}
	void destroy()
	{
		clear();
		delete first;
		first = last = NULL;
	}
	Status modify_val(const Type &x, const Type &y)
	{
		ListNode<Type> *s = find(x);
		if (s == NULL)
		{
			return FALSE;
		}
		s->data = y;
		return TRUE;
	}
	void sort()
	{
		if (size == 0 || size == 1)
		{
			return;
		}
		ListNode<Type> *p = first->next;
		ListNode<Type> *q = p->next;
		last = p;
		last->next = first;
		while (q != first)
		{
			p = q;
			q = q->next;
			
			ListNode<Type> *s = first;
			while (s->next != first && p->data > s->next->data)
			{
				s = s->next;
			}
			if (s->next == first)
			{
				p->next = first;
				last->next = p;
				last = p;
			}
			else
			{
				p->next = s->next;
				s->next = p;
			}
		}
	}
	void resver()
	{
		if (size == 0 || size == 1)
		{
			return;
		}
		ListNode<Type> *p = first->next;
		ListNode<Type> *q = p->next;
		last = p;
		last->next = first;
		while (q != first)
		{
			p = q;
			q = q->next;
			p->next = first->next;
			first->next = p;
		}
	}
	Status merge(List<Type> <1, List<Type> <2)
	{
		ListNode<Type> *p = lt1.first->next;
		ListNode<Type> *q = lt2.first->next;
		ListNode<Type> *s = first;
		while (p != lt1.first && q != lt2.first)
		{
			if (p->data < q->data)
			{
				s->next = p;
				p = p->next;
				s = s->next;
			}
			else
			{
				s->next = q;
				q = q->next;
				s = s->next;
			}
		}
		while (p != lt1.first)
		{
			s->next = p;
			p = p->next;
			s = s->next;
		}
		while (q != lt2.first)
		{
			s->next = q;
			q = q->next;
			s = s->next;
		}
		s->next = first;
		size = lt1.size + lt2.size;
		return TRUE;
	}
private:
	ListNode<Type> *first;
	ListNode<Type> *last;
	size_t         size;
};
#endif


#include "SCList.h"

void main()
{
	List<int> mylist;
	List<int> youlist;
	List<int> mergelist;

	int select = 1;
	int pos;
	int item;
	system("Color 0d"); 
	while (select)
	{
		cout << "************************************" << endl;
		cout << "* [0]  quit_system [1] push_back   *" << endl;
		cout << "* [2]  push_front  [3] show_list   *" << endl;
		cout << "* [4]  pop_back    [5] pop_front   *" << endl;
		cout << "* [6]  insert_val  [7] delete_val  *" << endl;
		cout << "* [8]  merge       [9] next        *" << endl;
		cout << "* [10] find       [11] sort        *" << endl;
		cout << "* [12] resver     [13] length      *" << endl;
		cout << "* [14] clear      [15] destroy     *" << endl;
		cout << "* [16] modify_val [17] prio        *" << endl;
		cout << "************************************" << endl;
		cout << "請選擇:>";
		cin >> select;
		switch (select)
		{
		case 1:
			cout << "請輸入要插入的數據(-1結束):>";
			while (cin >> item, item != -1)
			{
				mylist.push_back(item);
			}
			break;
		case 2:
			cout << "請輸入要插入的數據(-1結束):>";
			while (cin >> item, item != -1)
			{
				mylist.push_front(item);
			}
			break;
		case 3:
			system("cls");
			mylist.show_List();
			system("pause");
			break;
		case 4:
			mylist.pop_back();
			break;
		case 5:
			mylist.pop_front();
			break;
		case 6:
			cout << "請輸入要插入的值:>";
			cin >> item;
			mylist.insert_val(item);
			break;
		case 7:
			cout << "請輸入要刪除的值:>";
			cin >> item;
			mylist.delete_val(item);
			break;
		case 8:
			for (int i = 1; i < 10; i += 2)
			{
				mylist.push_back(i);
			}
			for (int i = 2; i < 10; i += 2)
			{
				youlist.push_back(i);
			}
			mergelist.merge(mylist, youlist);
			mergelist.show_List();
			break;
		case 9:
			cout << "請輸入要查找的值:>";
			cin >> item;
			cout << "所在查找值的後繼爲:" << mylist.Next(item) << endl;
			break;
		case 10:
			cout << "請輸入要查找的值:>";
			cin >> item;
			cout << "該值指針爲:" << mylist.find(item) << endl;
			break;
		case 11:
			mylist.sort();
			break;
		case 12:
			mylist.resver();
			break;
		case 13:
			cout << "線性表的長度爲:" << mylist.length() << endl;
			break;
		case 14:
			mylist.clear();
			break;
		case 15:
			mylist.destroy();
			break;
		case 16:
			cout << "請輸入要修改的值:>";
			cin >> item;
			cout << "請輸入修改後的值:>";
			cin >> pos;
			mylist.modify_val(item, pos);
			break;
		case 17:
			cout << "請輸入要查找的值:>";
			cin >> item;
			cout << "所在查找值的前驅爲:" << mylist.Prio(item) << endl;
			break;
		default:
			break;
		}
	}
}


運行界面如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章