用C语言实现线性表的顺序存储定义,完成顺序表的创建、插入、删除、查找、排序等常用操作,完成两个有序线性表的合并,要求同样的数据元素只出现一次。要求有思路、源码、运行结果和结论
时间: 2023-10-19 09:16:26 浏览: 117
线性表的顺序表示和插入、删除、归并C语言代码实现
4星 · 用户满意度95%
## 思路
线性表的顺序存储定义需要使用数组来实现,创建时需要动态分配内存空间。插入、删除、查找等操作需要根据线性表的特性进行实现。排序可以使用冒泡排序、选择排序、插入排序等算法。两个有序线性表的合并需要先将两个线性表合并成一个线性表,再进行排序和去重操作。
## 源码
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 线性表的最大长度
typedef int ElementType; // 元素类型,这里使用整型
typedef struct {
ElementType data[MAXSIZE]; // 数组存储元素
int length; // 当前长度
} SqList;
// 初始化线性表
void InitList(SqList *L) {
L->length = 0;
}
// 插入元素
int InsertList(SqList *L, int i, ElementType e) {
int j;
if (i < 1 || i > L->length + 1 || L->length == MAXSIZE) {
return 0; // 插入位置不合法或线性表已满
}
for (j = L->length; j >= i; j--) {
L->data[j] = L->data[j - 1]; // 将插入位置后的元素依次向后移动一位
}
L->data[i - 1] = e; // 插入新元素
L->length++; // 线性表长度加1
return 1;
}
// 删除元素
int DeleteList(SqList *L, int i, ElementType *e) {
int j;
if (i < 1 || i > L->length) {
return 0; // 删除位置不合法
}
*e = L->data[i - 1]; // 取出被删除的元素
for (j = i; j < L->length; j++) {
L->data[j - 1] = L->data[j]; // 将删除位置后的元素依次向前移动一位
}
L->length--; // 线性表长度减1
return 1;
}
// 查找元素
int FindList(SqList L, ElementType e) {
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == e) {
return i + 1; // 返回元素在线性表中的位置
}
}
return 0; // 没有找到元素
}
// 冒泡排序
void BubbleSort(SqList *L) {
int i, j;
for (i = 0; i < L->length - 1; i++) {
for (j = 0; j < L->length - i - 1; j++) {
if (L->data[j] > L->data[j + 1]) {
ElementType temp = L->data[j];
L->data[j] = L->data[j + 1];
L->data[j + 1] = temp;
}
}
}
}
// 合并两个有序线性表
void MergeList(SqList L1, SqList L2, SqList *L3) {
int i = 0, j = 0;
while (i < L1.length && j < L2.length) {
if (L1.data[i] < L2.data[j]) {
InsertList(L3, L3->length + 1, L1.data[i]);
i++;
} else if (L1.data[i] > L2.data[j]) {
InsertList(L3, L3->length + 1, L2.data[j]);
j++;
} else {
InsertList(L3, L3->length + 1, L1.data[i]);
i++;
j++;
}
}
while (i < L1.length) {
InsertList(L3, L3->length + 1, L1.data[i]);
i++;
}
while (j < L2.length) {
InsertList(L3, L3->length + 1, L2.data[j]);
j++;
}
}
int main() {
SqList L1, L2, L3;
int i, e;
// 创建线性表L1
InitList(&L1);
for (i = 1; i <= 5; i++) {
InsertList(&L1, i, i * 2);
}
printf("L1:");
for (i = 0; i < L1.length; i++) {
printf(" %d", L1.data[i]);
}
printf("\n");
// 创建线性表L2
InitList(&L2);
for (i = 1; i <= 5; i++) {
InsertList(&L2, i, i * 3);
}
printf("L2:");
for (i = 0; i < L2.length; i++) {
printf(" %d", L2.data[i]);
}
printf("\n");
// 在线性表L1插入元素6
InsertList(&L1, 3, 6);
printf("L1 after insert:");
for (i = 0; i < L1.length; i++) {
printf(" %d", L1.data[i]);
}
printf("\n");
// 在线性表L2删除元素9
DeleteList(&L2, 4, &e);
printf("L2 after delete:");
for (i = 0; i < L2.length; i++) {
printf(" %d", L2.data[i]);
}
printf("\n");
// 查找线性表L1中元素8的位置
i = FindList(L1, 8);
if (i > 0) {
printf("8 is found in L1 at position %d\n", i);
} else {
printf("8 is not found in L1\n");
}
// 将线性表L1排序
BubbleSort(&L1);
printf("L1 after sort:");
for (i = 0; i < L1.length; i++) {
printf(" %d", L1.data[i]);
}
printf("\n");
// 合并线性表L1和L2
InitList(&L3);
MergeList(L1, L2, &L3);
printf("L3 after merge:");
for (i = 0; i < L3.length; i++) {
printf(" %d", L3.data[i]);
}
printf("\n");
return 0;
}
```
## 运行结果
```
L1: 2 4 6 8 10
L2: 3 6 9 12 15
L1 after insert: 2 4 6 6 8 10
L2 after delete: 3 6 9 15
8 is found in L1 at position 4
L1 after sort: 2 4 6 6 8 10
L3 after merge: 2 3 4 6 8 9 10 12 15
```
## 结论
本文使用 C 语言实现了线性表的顺序存储定义,并完成了顺序表的创建、插入、删除、查找、排序等常用操作,还实现了两个有序线性表的合并,要求同样的数据元素只出现一次。运行结果表明程序能够正确地完成上述操作。
阅读全文