1. 程式人生 > >資料結構之靜態單鏈表

資料結構之靜態單鏈表

靜態連結串列L儲存
遊標 cur 5 2 3 4 0 6 7 .... 1
資料 data   A C D E     .....  
下標 0 1 2 3 4 5 6 ..... 999

L[0].cur放置空閒連結串列的第一個節點下標

L[MAXSIZE-1].cur放置第一個元素開始位置的下標

//靜態連結串列結構
typedef struct  {
	int data;
	int cur;//遊標
}Component, staticLinkList[MAXSIZE];
在元素C之前插入元素B之後
遊標 cur 6 5 3 4 0 2 7 .... 1
資料 data   A C D E B   .....  
下標 0 1 2 3 4 5 6 ..... 999
void ListInsert(staticLinkList L, int i, int e) {
	int j, k, l;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置錯誤!" << endl;
	}
	j = Malloc_SLL(L);//獲取連結串列後的第一個空位置下標
	if (j) {//準備插入操作
		L[j].data = e;
		for (l = 1; l <= i - 1; l++) {
			k = L[k].cur;
		}//迴圈直到找到第i個元素的前一個元素

		L[j].cur = L[k].cur;//例如在C之前插入B,則遍歷到A,把A的cur賦值給B的cur
		L[k].cur = j;//把B的下標賦值給A的cur
	}
}
刪除第3個元素C之後
遊標 cur 2 5 6 4 0 2 7 .... 1
資料 data   A   D E B   .....  
下標 0 1 2 3 4 5 6 ..... 999
void ListDelete(staticLinkList L, int i) {
	int j, k;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置錯誤!" << endl;
	}
	for (j = 1; j <= i - 1; j++) {
		k = L[k].cur;//例如刪除第3個元素,迴圈2次,k=1,k=5
	}
	j = L[k].cur;//j=2
	L[k].cur = L[j].cur;
	Free_SLL(L, j);

}
void Free_SLL(staticLinkList L, int k) {
	L[k].cur = L[0].cur;
	L[0].cur = k;

}

----------------------總結-----------------------

優點:在插入和刪除操作時,只需要修改遊標,不需要移動元素,從而改進了在順序儲存結構中插入和刪除操作需要移動大量元素的缺點

缺點:沒有解決連續儲存分配帶來的表長難以確定的問題

 

總體原始碼:

#include<iostream>
#define MAXSIZE 1000
using namespace std;
typedef struct  {
	int data;
	int cur;//遊標
}Component, staticLinkList[MAXSIZE];
void InitList(staticLinkList space);//初始化
int Malloc_SLL(staticLinkList space);//獲取空閒分量的下標
void Free_SLL(staticLinkList L,int k);
void ListInsert(staticLinkList L,int i,int e);//在第i個位置前插入元素e
void ListDelete(staticLinkList L, int i);//刪除連結串列第i個元素
void traversal(staticLinkList L);
int ListLength(staticLinkList L);
int main() {
	staticLinkList L;
	InitList(L);
	for (int i = 1; i <= 4; i++) {
		ListInsert(L, i, i*2);
	}
	traversal(L);
	cout << "該靜態連結串列的長度為:" << ListLength(L) << endl;
	ListDelete(L, 2);
	cout << "----------刪除第2個元素之後-------" << endl;
	traversal(L);
	cout << "該靜態連結串列的長度為:" << ListLength(L) << endl;
	return 0;
}
void InitList(staticLinkList space) {
	for (int i = 0; i < MAXSIZE - 1; i++) {
		space[i].cur = i + 1;
	}
	space[MAXSIZE - 1].cur = 0;
}
int Malloc_SLL(staticLinkList space) {
	int i = space[0].cur;
	if (space[0].cur) {
		space[0].cur=space[i].cur;
	}
	return i;
}
void ListInsert(staticLinkList L, int i, int e) {
	int j, k, l;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置錯誤!" << endl;
	}
	j = Malloc_SLL(L);//獲取連結串列後的第一個空位置下標
	if (j) {//準備插入操作
		L[j].data = e;
		for (l = 1; l <= i - 1; l++) {
			k = L[k].cur;
		}//迴圈直到找到第i個元素的前一個元素

		L[j].cur = L[k].cur;//例如在C之前插入B,則遍歷到A,把A的cur賦值給B的cur
		L[k].cur = j;//把B的下標賦值給A的cur
	}
}
int ListLength(staticLinkList L) {
	int k = L[MAXSIZE - 1].cur;
	int m = 0;
	while (k!=0) {
		k = L[k].cur;
		++m;
	}
	return m;
}
void traversal(staticLinkList L) {
	int k = L[MAXSIZE - 1].cur;
	int e;
	cout << "該靜態連結串列遍歷得:";
	while (k != 0) {
		e = L[k].data;
		cout << e << "   ";
		k = L[k].cur;
	}
	cout << endl;
}
void ListDelete(staticLinkList L, int i) {
	int j, k;
	k = MAXSIZE - 1;
	if (i<1 || i>ListLength(L) + 1) {
		cout << "插入位置錯誤!" << endl;
	}
	for (j = 1; j <= i - 1; j++) {
		k = L[k].cur;//例如刪除第3個元素,迴圈2次,k=1,k=5
	}
	j = L[k].cur;//j=2
	L[k].cur = L[j].cur;
	Free_SLL(L, j);

}
void Free_SLL(staticLinkList L, int k) {
	L[k].cur = L[0].cur;
	L[0].cur = k;

}