1. 程式人生 > >資料結構——靜態連結串列

資料結構——靜態連結串列

說明:嚴蔚敏的《資料結構》(C語言版)學習筆記,記錄一下,以備後面檢視。

#include <stdio.h>

const int OK = 1;  //定義正確返回
const int ERROR  = -1;  //定義錯誤的返回
const int OVERFLOW = -2; //定義溢位

#define MAXSIZE 1000  //連結串列的最大長度

//定義元素型別
typedef int ElemType;
//定義返回型別
typedef int Status;

//定義結點
typedef struct{
	ElemType data;
	int cur; //下一個元素的下標
}component, SLinkList[MAXSIZE];

//獲取連結串列元素e的下標
int LocateElem_SL(SLinkList S, ElemType e){
	int i = S[0].cur; //S[0]是頭結點
	while(i && S[i].data != e){
		i = S[i].cur;
	}
	return i;
}

//初始化一個連結串列(備用空間)
void InitSpace_SL(SLinkList &space){
	int i;
	for(i=0; i<MAXSIZE-1; ++i)
		space[i].cur = i+1;
	space[MAXSIZE-1].cur = 0;
}

//獲取頭結點
int Malloc_SL(SLinkList &space){
	int i = space[0].cur; //獲取頭結點
	//判斷備用空間連結串列非空(如果是空則i=0,直接返回0,否則返回分配結點的下標)
	if(space[0].cur) {
		//下一個結點作為頭結點
		space[0].cur = space[i].cur;
	}
	return i;
}

//顯示連結串列
void Show_SL(SLinkList &space){
 	printf("連結串列的列印結果是\n");
	int s = Malloc_SL(space); //指向頭結點
	while(space[s].cur != 0){
		s = Malloc_SL(space);
		printf("%d\n", space[s].data);
	}
	printf("\n");
}

//將下標為k的空閒結點回收到備用空間(相當於頭插法,插入備用空間)
void Free_SL(SLinkList &space, int k){
	space[k].cur = space[0].cur;
	space[0].cur = k;
}

//依次輸入集合A和集合B的元素,在一維陣列space中建立表示集合(A-B)U(B-A)
//的靜態連結串列,S為其頭指標,假裝置用空間足夠大,space[0].cur為其頭指標
void difference(SLinkList &space, int &S){
	InitSpace_SL(space);  //初始化備用空間
	S = Malloc_SL(space);  //生成S的頭結點
	int r = S;
	printf("請輸入A,B集合的元素個數,用逗號隔開\n");
	int m,n;
	scanf("%d,%d", &m, &n);
	int i,j;
	printf("請依次輸入A集合的元素並按回車\n");
	int nn;
	//給A集合新增資料
	for(j=1; j<=m; ++j){
		i = Malloc_SL(space); //取出下一個空間索引
		scanf("%d", &nn); //賦值
		space[i].data = nn;
		space[r].cur = i;  //尾插法(r指向的是最後一個結點,讓上一次最後結點指向i索引)
		r = i;     //r指向最後的節點
	}

	space[r].cur = 0;  //將最後一個結點指向空(也就是0)
	printf("請依次輸入B集合的元素\n");
	int b;
	int p;
	int k;
	for(j = 1; j<=n; ++j){
		scanf("%d", &b); //讀取並記錄到臨時變數b
		p = S;  //記錄頭結點
		k = space[S].cur;  //k指向第一個結點
		while(k != space[r].cur && space[k].data != b){
			p = k;
			k = space[k].cur; //指向下一個結點
		}
		if(k == space[r].cur){  //不存在元素b,插入到r所指結點之後
			i = Malloc_SL(space);
			space[i].data = b;
			space[i].cur = space[r].cur;
			space[r].cur = i;
		}else{  //存在元素b,刪除
			space[p].cur = space[k].cur;
			Free_SL(space, k);
			if(r == k) r = p;
		}
	}
	//指回頭指標
	space[0].cur = S;
}

int main(){
	SLinkList sl;
	int s;
	difference(sl, s);
	Show_SL(sl);
	printf("finish....\n");
	scanf("%d");
	return 0;
}

這種描述方法便於在不設“指標”型別的高階程式設計語言中使用連結串列結構,這種用陣列描述的連結串列叫靜態連結串列。