線性表的順序儲存實現
阿新 • • 發佈:2019-02-28
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;
}