1. 程式人生 > >線性表的順序儲存實現

線性表的順序儲存實現

1. 基礎操作

/**
 * 初始化順序表
 */
void initList(SqList *L) {
	L->length=0;
}

/**
 * 銷燬順序表
 */
void destroyList(SqList *L) {
	L->length = -1;
}

/**
 * 置空順序表
 */
void clearList(SqList *L) {
	L->length = 0;
}

/**
 * 如果順序表為空表,則返回真,否則返回假
 */
int emptyList(SqList *L) {
	if (0 == L->length) {
		return OK;
	} else {
		return FALSE;
	}
}

/**
 * L存在,且i值合法,即1 <= i <= length, 則返回第i個元素的值
 */
int getList(SqList *L, int i)  {
	if (L->length <= 0 || i > L->length) {
		return FALSE;
	}
	return L->r[i];
}

2. 插入操作

        線性表的插入運算是指在表的第i個位置,插入一個新元素e,使長度為n的線性表變成長度為n + 1的線性表。

/**
 * 表L存在,e為合法元素值,且1 <= i <= length + 1
 * 在表L中第i個位置插入新的元素e,L的長度加1
 * 注意:本例子中,預設從下標1開始,如順序表[0,1]的長度為1
 */
int insList(SqList *L, int i, int e) {
	int j;
	if (L->length == MAXSIZE) {
		return FALSE;
	}
	if (i <= 0 || i > L->length + 1) {
		return FALSE;
	}
	if (i <= L->length) {
		for (j = L->length + 1; j >= i ; j--) {
			L->r[j + 1] = L->r[j];
		}
	}
	L->r[i] = e;
	L->length++;
	return OK;
}

3. 刪除操作

        線性表的刪除操作時指將表的第i個元素刪去,使長度為n的線性表變成長度為n-1的線性表。

/**
 * 表L存在且非空,1 <= i <= length
 * 刪除L的第i個數據元素,並用e返回其值,L的長度減1
 */
void delList(SqList *L, int i, int *e) {
	int j;
	*e = L->r[i];
	if (i < L->length) {
		for (j = i; j <= L->length; j++) {
			L->r[j] = L->r[j + 1];
		}
	}
	L->length--;
}

4. 合併操作

        兩個有序線性表,使新線性表也有序

    方法一:從線性表尾開始比較,指到其中一個線性表的表長為0,然後將另一線性表的剩餘元素移動到新線性表上

/**
 * 合併LA、LB兩個順序表
 */
int unionList(SqList *L, SqList *LA, SqList *LB) {
	if (LA->length + LB->length > MAXSIZE) {
		return FALSE;
	}
	L->length =  LA->length + LB->length;
	int i;
	for (i = LA->length + LB->length; LA->length > 0 && LB->length > 0; i--) {
		if (LA->r[LA->length] >= LB->r[LB->length]) {
			L->r[i] = LA->r[LA->length];
			LA->length--;
		} else {
			L->r[i] = LB->r[LB->length];
			LB->length--;
		}
	}
	if (LA->length > 0) {
		for (i; i > 0; i--) {
			L->r[i] = LA->r[LA->length];
			LA->length--;
		}
	} else {
		for (i; i > 0; i--) {
			L->r[i] = LB->r[LB->length];
			LB->length--;
		}
	}
	return OK;
}

    方法二:設兩個指標i,j,k分別指向待合併的線性表LA、LB、新線性表,如果LA->r[i] >= LB->r[j],則將LA->r[i]插入到新線性表中,i++,k++;否則反之,j++,k++。

/**
 * 合併LA、LB兩個順序表
 */
int unionList2(SqList *L, SqList *LA, SqList *LB) {
	if (LA->length + LB->length > MAXSIZE) {
		return FALSE;
	}
	int i = 1, j = 1, k = 1, n;
	L->length =  LA->length + LB->length;
	while (i <= LA->length && j <= LB->length) {
		if (LA->r[i] >= LB->r[j]) {
			L->r[k] = LA->r[i];
			i++;
			k++;
		} else {
			L->r[k] = LB->r[j];
			j++;
			k++;
		}
	}
	while (i <= LA->length) {
		L->r[k] = LA->r[i];
		i++;
		k++;
	}
	while (i <= LB->length) {
		L->r[k] = LB->r[j];
		j++;
		k++;
	}
	return OK;
}

完整例項:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 101
#define OK 1
#define FALSE 0
typedef struct {
	int r[MAXSIZE];
	int length;
} SqList;

void print(SqList L);
void initList(SqList *L);
void destroyList(SqList *L);
void clearList(SqList *L);
int emptyList(SqList *L);
int locateList(SqList *L, int e);
int getList(SqList *L, int e);
int insList(SqList *L, int i, int e);
void delList(SqList *L, int i, int *e);
int unionList(SqList *L, SqList *LA, SqList *LB);
int unionList2(SqList *L, SqList *LA, SqList *LB);
int main(int argc, char *argv[]) {
	SqList list, list1, list2;
	int result, deleteNum;
	printf("初始化順序表:\n");
	initList(&list);
	initList(&list1);
	printf("長度為:%d\n", list.length);
	for (int i = 1; i <= 6; i++) {
		list.r[i] = i * 3;
		list.length++;
	}
	for (int i = 1; i <= 4; i++) {
		list1.r[i] = i * 2;
		list1.length++;
	}
	printf("順序表的內容:\n");
	print(list);
	if (insList(&list, 6, 2)) {
		printf("插入成功\n");
		printf("插入元素後的順序表的內容:\n");
		print(list);
	} else {
		printf("插入失敗\n");
	}
	delList(&list, 6, &deleteNum);
	printf("刪除的數字是:%d\n", deleteNum);
	printf("刪除後的順序表的內容:\n");
	print(list);
	printf("順序表LB的內容:\n");
	print(list1);
	printf("順序表合併後的內容:\n");
	unionList(&list2, &list, &list1);
	print(list2);
	destroyList(&list);
	return 0;
}

/**
 * 列印函式
 */
void print(SqList L) {
	for (int i = 1; i <= L.length; i++) {
		printf("%d\t", L.r[i]);
	}
	printf("\n");
}

/**
 * 初始化順序表
 */
void initList(SqList *L) {
	L->length=0;
}

/**
 * 銷燬順序表
 */
void destroyList(SqList *L) {
	L->length = -1;
}

/**
 * 置空順序表
 */
void clearList(SqList *L) {
	L->length = 0;
}

/**
 * 如果順序表為空表,則返回真,否則返回假
 */
int emptyList(SqList *L) {
	if (0 == L->length) {
		return OK;
	} else {
		return FALSE;
	}
}

/**
 * L存在,且i值合法,即1 <= i <= length, 則返回第i個元素的值
 */
int getList(SqList *L, int i)  {
	if (L->length <= 0 || i > L->length) {
		return FALSE;
	}
	return L->r[i];
}

/**
 * 表L存在,e為合法元素值,且1 <= i <= length + 1
 * 在表L中第i個位置插入新的元素e,L的長度加1
 * 注意:本例子中,預設從下標1開始,如順序表[0,1]的長度為1
 */
int insList(SqList *L, int i, int e) {
	int j;
	if (L->length == MAXSIZE) {
		return FALSE;
	}
	if (i <= 0 || i > L->length + 1) {
		return FALSE;
	}
	if (i <= L->length) {
		for (j = L->length + 1; j >= i ; j--) {
			L->r[j + 1] = L->r[j];
		}
	}
	L->r[i] = e;
	L->length++;
	return OK;
}

/**
 * 表L存在且非空,1 <= i <= length
 * 刪除L的第i個數據元素,並用e返回其值,L的長度減1
 */
void delList(SqList *L, int i, int *e) {
	int j;
	*e = L->r[i];
	if (i < L->length) {
		for (j = i; j <= L->length; j++) {
			L->r[j] = L->r[j + 1];
		}
	}
	L->length--;
}

/**
 * 合併LA、LB兩個順序表
 */
int unionList(SqList *L, SqList *LA, SqList *LB) {
	if (LA->length + LB->length > MAXSIZE) {
		return FALSE;
	}
	L->length =  LA->length + LB->length;
	int i;
	for (i = LA->length + LB->length; LA->length > 0 && LB->length > 0; i--) {
		if (LA->r[LA->length] >= LB->r[LB->length]) {
			L->r[i] = LA->r[LA->length];
			LA->length--;
		} else {
			L->r[i] = LB->r[LB->length];
			LB->length--;
		}
	}
	if (LA->length > 0) {
		for (i; i > 0; i--) {
			L->r[i] = LA->r[LA->length];
			LA->length--;
		}
	} else {
		for (i; i > 0; i--) {
			L->r[i] = LB->r[LB->length];
			LB->length--;
		}
	}
	return OK;
}

/**
 * 合併LA、LB兩個順序表
 */
int unionList2(SqList *L, SqList *LA, SqList *LB) {
	if (LA->length + LB->length > MAXSIZE) {
		return FALSE;
	}
	int i = 1, j = 1, k = 1, n;
	L->length =  LA->length + LB->length;
	while (i <= LA->length && j <= LB->length) {
		if (LA->r[i] >= LB->r[j]) {
			L->r[k] = LA->r[i];
			i++;
			k++;
		} else {
			L->r[k] = LB->r[j];
			j++;
			k++;
		}
	}
	while (i <= LA->length) {
		L->r[k] = LA->r[i];
		i++;
		k++;
	}
	while (i <= LB->length) {
		L->r[k] = LB->r[j];
		j++;
		k++;
	}
	return OK;
}