归并La和Lb得到新的线性表Lc.pdf
线性表的实现和操作 线性表是一种基本的数据结构,它是由零个或多个数据元素组成的有限序列。线性表可以分为顺序线性表和链式线性表两种实现形式,本文主要介绍顺序线性表的实现和操作。 1. 顺序线性表的定义 顺序线性表是一种顺序存储的线性表,每个元素占用连续的存储空间。顺序线性表的定义如下: ```c typedef struct { ElemType *elem; int length; int listsize; } SqList; ``` 其中,`elem` 是一个指向元素的指针,`length` 是线性表的长度,`listsize` 是线性表的存储容量。 2. 顺序线性表的初始化 顺序线性表的初始化是指创建一个空的顺序线性表。初始化操作的实现如下: ```c int InitList(SqList *L) { (*L).elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (!(*L).elem) exit(OVERFLOW); (*L).length = 0; (*L).listsize = LIST_INIT_SIZE; return OK; } ``` 初始化操作首先分配了存储空间,然后将线性表的长度和存储容量初始化为0和LIST_INIT_SIZE。 3. 顺序线性表的销毁 顺序线性表的销毁是指释放线性表所占用的存储空间。销毁操作的实现如下: ```c int DestroyList(SqList *L) { free((*L).elem); (*L).elem = NULL; (*L).length = 0; (*L).listsize = 0; return OK; } ``` 销毁操作释放了线性表所占用的存储空间,并将线性表的长度和存储容量初始化为0。 4. 顺序线性表的清空 顺序线性表的清空是指将线性表重置为空表。清空操作的实现如下: ```c int ClearList(SqList *L) { (*L).length = 0; return OK; } ``` 清空操作只是将线性表的长度初始化为0。 5. 顺序线性表的空判断 顺序线性表的空判断是指判断线性表是否为空表。空判断操作的实现如下: ```c int ListEmpty(SqList L) { if (L.length == 0) return TRUE; else return FALSE; } ``` 空判断操作返回 TRUE 表示线性表为空,否则返回 FALSE。 6. 顺序线性表的长度获取 顺序线性表的长度获取是指获取线性表中的数据元素个数。长度获取操作的实现如下: ```c int ListLength(SqList L) { return L.length; } ``` 长度获取操作直接返回线性表的长度。 7. 顺序线性表的元素获取 顺序线性表的元素获取是指获取线性表中的某个元素的值。元素获取操作的实现如下: ```c int GetElem(SqList L, int i, ElemType *e) { if (i < 1 || i > L.length) exit(ERROR); *e = *(L.elem + i - 1); return OK; } ``` 元素获取操作首先检查索引是否合法,然后返回线性表中第 i 个元素的值。 8. 顺序线性表的元素定位 顺序线性表的元素定位是指获取线性表中第一个与某个元素相等的元素的位序。元素定位操作的实现如下: ```c int LocateElem(SqList L, ElemType e) { ElemType *p = L.elem; int i = 1; while (i <= L.length && (*p != e)) { p++; i++; } if (i <= L.length) return i; else return 0; } ``` 元素定位操作返回线性表中第一个与某个元素相等的元素的位序,如果不存在,则返回 0。 9. 顺序线性表的前驱元素获取 顺序线性表的前驱元素获取是指获取某个元素的前驱元素。前驱元素获取操作的实现如下: ```c int PriorElem(SqList L, ElemType cur_e, ElemType *pre_e) { int i = 2; ElemType *p = L.elem + 1; while (i <= L.length && *p != cur_e) { p++; i++; } if (i > L.length) return INFEASIBLE; else { *pre_e = *--p; return OK; } } ``` 前驱元素获取操作返回某个元素的前驱元素,如果不存在,则返回 INFEASIBLE。 10. 顺序线性表的后继元素获取 顺序线性表的后继元素获取是指获取某个元素的后继元素。后继元素获取操作的实现如下: ```c int NextElem(SqList L, ElemType cur_e, ElemType *next_e) { int i = 1; ElemType *p = L.elem; while (i < L.length && *p != cur_e) { i++; p++; } if (i == L.length) return INFEASIBLE; else { *next_e = *++p; return OK; } } ``` 后继元素获取操作返回某个元素的后继元素,如果不存在,则返回 INFEASIBLE。 11. 顺序线性表的元素插入 顺序线性表的元素插入是指在线性表中插入新的元素。元素插入操作的实现如下: ```c int ListInsert(SqList *L, int i, ElemType e) { // ... } ``` 元素插入操作将在下一节中介绍。 顺序线性表是一种基本的数据结构,具有初始化、销毁、清空、空判断、长度获取、元素获取、元素定位、前驱元素获取、后继元素获取、元素插入等多种操作。