1. 程式人生 > >C++ 靜態連結串列的實現

C++ 靜態連結串列的實現

#include<iostream>
#define MAXSIZE 100
using namespace std;

struct Node 
{ 
	int data;          //結點資料
	int next;           //指向下一個結點的指標
};

class Static_List
{
private:
	Node node[MAXSIZE];                 //存放靜態連結串列的結構陣列
	int free_node;                          //空閒連結串列表頭
public:
	Static_List()
	{
		node[0].next = -1;                       //頭結點
		free_node = 1;                             //空閒連結串列第一個結點的位置
		for (int i = 1; i < MAXSIZE-1; i++)
			node[i].next = i + 1;                          //構造空閒連結串列
		node[MAXSIZE - 1].next = -1;               //空閒連結串列收尾
	}
	
	int Length();                   //計算靜態連結串列的長度
	int search(int value);       //在靜態連結串列中查詢具有給定值的結點
	int Locate(int i);            //在靜態連結串列中查詢第i個結點
	bool Append(int value);     //在靜態連結串列的表尾追加一個新結點
	bool Insert(int i, int value);      //在靜態連結串列第i個結點後插入新結點
	bool Remove(int i);           //在靜態連結串列中釋放第i個結點
	bool IsEmpty();                 //判斷連結串列空否
	void print_list();
};

int Static_List::Length()
{
	int count = 0;
	int p = node[0].next;
	while (p != -1)
	{
		p = node[p].next;
		count++;
	}
	return count;
}

int Static_List::search(int value)
{
	int p = node[0].next;
	while (node[p].data != value)
	{
		if (node[p].next == -1)
			return -1;                           //未找到
		p = node[p].next;
	}
	return p;
}

int Static_List::Locate(int i)
{
	int p = node[0].next;
	if (i < 0)
	{
		cout << "輸入錯誤" << endl;
		return -1;                    //輸入錯誤
	}
	if (i == 0)
	{
		return 0;
	}
	for (int j = 1; j < i; j++)
	{
		if (node[p].next == -1)
			return -1;                        //連結串列元素個數小於i
		p = node[p].next;
	}
	return p;
}

bool Static_List::Append(int value)
{
	if (free_node == -1)
	{
		return false;            //剩餘空間不足,無法分配
	}
	int temp = free_node;
	free_node = node[free_node].next;
	node[temp].data = value;
	node[temp].next = -1;
	int p = 0;
	while (node[p].next != -1)
	{
		p = node[p].next;
	}
	node[p].next = temp;
	return true;
}

bool Static_List::Insert(int i, int value)
{
	int p = Locate(i);
	if (free_node == -1)
		return false;                   //連結串列剩餘空間不足
	int temp = free_node;
	free_node = node[free_node].next;
	node[temp].data = value;
	node[temp].next = node[p].next;
	node[p].next = temp;
	return true;
}

bool Static_List::Remove(int i)
{
	int p = Locate(i);
	if (p == -1)
	{
		cout << "連結串列長度小於i" << endl;
		return false;
	}
	int temp = Locate(i - 1);
	node[temp].next = node[p].next;
	node[p].next = free_node;
	free_node = p;
}

bool Static_List::IsEmpty()
{
	return node[0].next == -1;
}

void Static_List::print_list()
{
	int p = node[0].next;
	while (p != -1)
	{
		cout << node[p].data << " ";
		p = node[p].next;
	}
	cout << endl;
}