数据结构实验一(顺序表基本操作)题目和源程序
实验内容: 1.编写程序实现顺序表的下列基本操作: (1)初始化顺序表La。 (2)将La置为空表。 (3)销毁La。 (4)在La中插入一个新的元素。 (5)删除La中的某一元素。 (6)在La中查找某元素,若找到,则返回它在La中第一次出现的位置,否则返回0。 (7)打印输出La中的元素值。 2.编写程序完成下面的操作: (1)构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列。 (2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列。 (3)假设两个顺序线性表La和Lb分别表示两个集合A和B,利用 union_Sq操作实现A=A∪B。 ### 数据结构实验一知识点解析 #### 一、实验目的与要求 本次实验旨在通过实践让学习者深入理解顺序表的基本概念及其操作,并掌握利用C语言实现这些操作的方法。具体目标包括: 1. **顺序表定义**:理解顺序表的数据结构特点,即线性表的一种存储方式,使用一段地址连续的存储单元依次存放线性表中的各个元素。 2. **基本操作实现**:学会在C语言中定义顺序表,并实现顺序表的基本操作如初始化、插入、删除、查找等。 3. **多函数程序处理**:熟悉多函数程序的编写、调试及运行流程。 #### 二、顺序表基本操作 ##### 1. 初始化顺序表La 初始化操作通常用于创建一个新的顺序表。该操作会为顺序表分配初始大小的空间,并设置长度为0。例如: ```cpp Sqlist InitList(Sqlist& L) { L.elem = (double*)malloc(LIST_INIT_SIZE * sizeof(double)); // 分配内存 if (!L.elem) exit(-2); // 存储分配失败 L.length = 0; // 当前长度为0 L.listsize = LIST_INIT_SIZE; // 初始存储容量 return L; } ``` ##### 2. 将La置为空表 将顺序表置为空表意味着将其长度设为0,但保留原有的存储空间。例如: ```cpp void ClearList(Sqlist& L) { L.length = 0; // 将长度清零 } ``` ##### 3. 销毁La 销毁操作会释放顺序表所占用的所有内存空间。例如: ```cpp void DestroyList(Sqlist& L) { free(L.elem); // 释放内存 L.elem = NULL; // 防止悬挂指针 L.length = 0; L.listsize = 0; } ``` ##### 4. 在La中插入一个新的元素 插入操作需要在指定位置或末尾插入一个新元素。例如,在末尾插入新元素可以这样实现: ```cpp bool Insert(Sqlist& L, int pos, double e) { if (pos < 1 || pos > L.length + 1) return false; // 检查插入位置是否合法 if (L.length >= L.listsize) { // 如果空间不足则扩容 L.elem = (double*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(double)); if (!L.elem) exit(-2); // 存储分配失败 L.listsize += LISTINCREMENT; } for (int i = L.length; i >= pos; i--) { // 后移元素 L.elem[i] = L.elem[i - 1]; } L.elem[pos - 1] = e; // 插入新元素 L.length++; // 表长度增加 return true; } ``` ##### 5. 删除La中的某一元素 删除操作需要根据指定位置删除一个元素,并调整后续元素的位置。例如: ```cpp bool Remove(Sqlist& L, int pos) { if (pos < 1 || pos > L.length) return false; // 检查位置是否合法 for (int i = pos; i < L.length; i++) { // 前移元素 L.elem[i - 1] = L.elem[i]; } L.length--; // 表长度减少 return true; } ``` ##### 6. 在La中查找某元素 查找操作用于寻找特定元素的位置。例如: ```cpp int Search(Sqlist& L, double e) { for (int i = 0; i < L.length; i++) { if (L.elem[i] == e) return i + 1; // 找到元素,返回位置 } return 0; // 未找到,返回0 } ``` ##### 7. 打印输出La中的元素值 输出操作用于显示顺序表中所有元素的值。例如: ```cpp void PrintList(Sqlist& L) { for (int i = 0; i < L.length; i++) { cout << L.elem[i] << " "; } cout << endl; } ``` #### 三、高级操作 ##### 1. 构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列 需要构造两个顺序表La和Lb,并确保它们的元素按非递减顺序排列。可以通过随机生成数值然后排序的方式实现。例如: ```cpp void Notdegression(Sqlist& L) { for (int i = 0; i < L.length - 1; i++) { for (int j = 0; j < L.length - i - 1; j++) { if (L.elem[j] > L.elem[j + 1]) { swap(L.elem[j], L.elem[j + 1]); // 使用C++标准库中的swap函数交换元素 } } } } ``` ##### 2. 实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列 归并操作是将两个已排序的顺序表合并成一个新的已排序顺序表。例如: ```cpp void Merger(Sqlist& La, Sqlist& Lb, Sqlist& Lc) { int i = 0, j = 0, k = 0; while (i < La.length && j < Lb.length) { if (La.elem[i] <= Lb.elem[j]) { Lc.elem[k++] = La.elem[i++]; } else { Lc.elem[k++] = Lb.elem[j++]; } } while (i < La.length) { Lc.elem[k++] = La.elem[i++]; } while (j < Lb.length) { Lc.elem[k++] = Lb.elem[j++]; } Lc.length = La.length + Lb.length; } ``` ##### 3. 利用union_Sq操作实现A=A∪B 实现两个集合的并集操作,即将两个集合合并成一个新的集合。例如: ```cpp void Union(Sqlist& A, Sqlist& B, Sqlist& C) { int i = 0, j = 0, k = 0; while (i < A.length && j < B.length) { if (A.elem[i] < B.elem[j]) { C.elem[k++] = A.elem[i++]; } else if (A.elem[i] > B.elem[j]) { C.elem[k++] = B.elem[j++]; } else { C.elem[k++] = A.elem[i++]; j++; } } while (i < A.length) { C.elem[k++] = A.elem[i++]; } while (j < B.length) { C.elem[k++] = B.elem[j++]; } C.length = k; } ``` #### 四、思考与提高 对于实现两个顺序线性表La和Lb分别表示两个集合A和B的情况,如果要实现A=A∩B(即两个集合的交集),可以采用以下步骤: 1. **初始化结果集合C**:创建一个新的顺序表C作为交集的结果。 2. **遍历集合A**:对于集合A中的每一个元素,检查它是否也在集合B中出现。 3. **添加元素到C**:如果该元素同时出现在集合B中,则将该元素添加到集合C中。 4. **重复上述过程**:直到遍历完集合A中的所有元素。 5. **返回结果集合C**:返回包含交集结果的集合C。 示例代码如下: ```cpp void Intersection(Sqlist& A, Sqlist& B, Sqlist& C) { int i = 0, j = 0, k = 0; while (i < A.length && j < B.length) { if (A.elem[i] < B.elem[j]) { i++; } else if (A.elem[i] > B.elem[j]) { j++; } else { C.elem[k++] = A.elem[i++]; j++; } } C.length = k; } ``` 以上内容涵盖了实验一的主要知识点,包括顺序表的基本操作以及更复杂的操作如归并、求并集等。通过实际编程练习,可以加深对这些概念的理解和应用能力。