### 数据结构实验:顺序存储合并表并删除重复元素 #### 实验背景与目的 本实验主要探讨了在数据结构领域中如何对两个非递增有序的线性表进行合并,并在此基础上进一步处理合并后的表,以去除其中重复的元素。通过这一过程,学生可以深入理解顺序存储方式的特点及其在实际问题解决中的应用。 #### 实验要求 1. **输入**: - 输入包括两个非递增有序的线性表`A`和`B`。 - 表采用顺序存储的方式实现。 2. **合并操作**: - 将表`A`和表`B`合并为一个新的线性表`C`。 - 合并时保持元素的非递增顺序。 3. **删除重复元素**: - 在合并后的表`C`中,删除所有重复出现的元素,只保留一个副本。 4. **输出**: - 输出最终合并并去重后的表`C`。 #### 实验步骤解析 ##### 1. 定义顺序存储结构 首先定义了一个顺序存储结构`SqList`,它包含三个成员变量: - `ElemType *elem`:指向存储元素的数组。 - `int length`:表示当前存储的有效元素个数。 - `int listsize`:表示分配的数组大小。 ```c typedef int ElemType; typedef struct { ElemType *elem; int length; int listsize; } SqList; ``` ##### 2. 初始化列表 初始化列表的操作主要包括: - 分配内存空间。 - 设置`length`和`listsize`的初始值。 ```c void InitList(SqList *L) { L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (L->elem == NULL) exit(0); L->length = 0; L->listsize = LIST_INIT_SIZE; } ``` ##### 3. 插入元素 实现插入操作以确保列表长度增加时能够自动扩展存储空间,并将新元素插入到指定位置。 ```c int ListInsert(SqList *L, int i, ElemType e) { // 省略具体实现 } ``` ##### 4. 合并两个列表 实现合并两个非递增有序列表的功能,该函数将`A`和`B`合并为`C`,同时保持元素的非递增顺序。 ```c void Mergelist(SqList La, SqList Lb, SqList *Lc) { // 省略具体实现 } ``` ##### 5. 显示列表 提供一个显示列表内容的函数,便于调试和验证结果。 ```c void DisplayList(SqList L) { int i; printf("display LIST:\n"); for (i = 0; i < L.length; i++) { printf("%d ", *(L.elem + i)); } printf("\n"); } ``` ##### 6. 排序列表 虽然原始列表已经是非递增有序的,但在某些情况下可能需要再次排序,以确保合并后列表的正确性。 ```c void OrderList(SqList *L) { // 省略具体实现 } ``` ##### 7. 删除重复元素 实现删除重复元素的功能,确保合并后的列表`C`中没有重复元素。 ```c void deleteSameList(SqList *L) { // 省略具体实现 } ``` ##### 8. 主函数 主函数负责整个流程的控制,包括读取输入、调用相应的函数以及输出结果。 ```c void main() { // 省略具体实现 } ``` #### 总结 本实验通过具体的代码实现了两个非递增有序列表的合并及去重功能。通过对这些步骤的学习与实践,可以帮助学生更深入地理解数据结构的基本概念及其在实际问题中的应用。此外,实验还锻炼了学生的编程能力,尤其是在顺序存储结构方面的理解和应用。
#include<stdlib.h>
#define LIST_INIT_SIZE 20
#define LISTINCREA 20
typedef int ElemType;
typedef struct
{
ElemType * elem;
int length;
int listsize;
} SqList;
void InitList(SqList *L)
{
(*L).elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(L->elem==NULL) exit(0);
L->length=0;
L->listsize=LIST_INIT_SIZE;
}
int ListInsert(SqList *L, int i, ElemType e)
{ ElemType * newbase, *p, *q;
if(i<1||i>L->length+1)
return 0;
if(L->length>=(*L).listsize)
{ newbase=(ElemType *)realloc((*L).elem,(L->listsize+LISTINCREA)*sizeof(ElemType));
if(newbase==NULL)
exit(0);
(*L).elem=newbase;
L->listsize+=LISTINCREA;
- 457879872014-09-23不错的内容,讲的很明白,很好,很符合我的需要
- 嗨你我他2014-07-17不错的内容,讲的很明白
- 如风0072012-12-04很好,很符合我的需要
- 粉丝: 12
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助