今天开始不用C++

用C++写了不少程序,但没有一个实用,很遗憾啊.
题目重述 根据提供的文件内容,本题要求使用 C 语言实现两个线性表 LA 和 LB 表示的集合 A 和 B 的并集运算 $A = A \cup B$。需依次将 LB 中不在 LA 中的元素插入 LA 尾部,并在每次插入后输出当前 LA 的元素。输入给出集合 A 和 B 的初始元素,输出共 $n+2$ 行($n$ 为 B 的元素个数),前两行分别输出原始集合 A 和 B,后续每行输出从 B 取出一个元素插入 A 后的新 A。 详解 我们使用顺序存储结构实现线性表,定义结构体 `SqList` 表示顺序表,包含数组 `elem` 和长度 `length`。首先读取集合 A 和 B 的元素并初始化两个线性表。然后遍历 B 中每一个元素,检查其是否已存在于 A 中(通过自定义函数 `LocateElem` 判断)。若不存在,则将其插入 A 的末尾(调用 `ListInsert` 函数),并在每次插入后输出 A 的全部元素。注意:插入操作不会重复添加相同元素。 完整 C 代码如下: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 200 // 最大容量,足够容纳 A ∪ B typedef int ElemType; // 顺序表结构 typedef struct { ElemType elem[MAXSIZE]; int length; } SqList; // 初始化线性表 void InitList(SqList *L) { L->length = 0; } // 获取第 i 个元素 (i 从 1 开始) int GetElem(SqList *L, int i, ElemType *e) { if (i < 1 || i > L->length) return 0; *e = L->elem[i - 1]; return 1; } // 查找元素 e 是否存在,比较函数 int LocateElem(SqList *L, ElemType e, int (*compare)(ElemType, ElemType)) { for (int i = 0; i < L->length; i++) { if (compare(L->elem[i], e)) return 1; } return 0; } // 比较两个元素是否相等 int equal(ElemType a, ElemType b) { return a == b; } // 在位置 i 插入元素 e (i 从 1 开始) int ListInsert(SqList *L, int i, ElemType e) { if (L->length >= MAXSIZE || i < 1 || i > L->length + 1) return 0; for (int j = L->length; j >= i; j--) { L->elem[j] = L->elem[j - 1]; } L->elem[i - 1] = e; L->length++; return 1; } // 输出线性表 void PrintList(SqList *L) { for (int i = 0; i < L->length; i++) { if (i > 0) printf(" "); printf("%d", L->elem[i]); } printf("\n"); } int main() { int m, n; ElemType e; SqList La, Lb; InitList(&La); InitList(&Lb); while (scanf("%d", &m) != EOF) { // 输入集合 A for (int i = 0; i < m; i++) { scanf("%d", &e); ListInsert(&La, La.length + 1, e); } // 输入集合 B scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &e); ListInsert(&Lb, Lb.length + 1, e); } // 输出原始集合 A 和 B PrintList(&La); PrintList(&Lb); // 遍历 LB,将不在 LA 中的元素插入 LA for (int i = 1; i <= Lb.length; i++) { GetElem(&Lb, i, &e); if (!LocateElem(&La, e, equal)) { ListInsert(&La, La.length + 1, e); } PrintList(&La); // 每次插入后输出 A } // 每组数据后输出空行 printf("\n"); // 重置线性表以处理下一组数据 La.length = 0; Lb.length = 0; } return 0; } ``` 知识点 1. **顺序表基本操作**:包括初始化、插入、查找和遍历,核心是数组下标与逻辑位置的映射。 2. **结构体封装数据**:使用 `struct` 将数据元素和长度打包,提升代码模块化与可维护性。 3. **函数指针应用**:`LocateElem` 使用函数指针实现通用比较,增强灵活性与复用性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值