实现线性表的顺序存储定义,完成顺序表的创建、插入、删除、查找、排序等常用操作,完成两个有序线性表的合并,要求同样的数据元素只出现一次。C语言实现
时间: 2023-10-19 18:12:37 浏览: 116
顺序存储定义:
```
#define MaxSize 50 // 定义线性表的最大长度
typedef struct {
int data[MaxSize]; // 存储元素的数组
int length; // 当前线性表的长度
} SqList;
```
顺序表的创建:
```
void CreateList(SqList *L, int n) {
int i;
printf("请输入线性表中的元素:\n");
for (i = 0; i < n; i++) {
scanf("%d", &L->data[i]);
}
L->length = n;
}
```
顺序表的插入:
```
int InsertList(SqList *L, int pos, int e) {
int i;
if (pos < 1 || pos > L->length + 1) { // 判断插入位置是否合法
return 0;
}
if (L->length >= MaxSize) { // 判断线性表是否已满
return 0;
}
for (i = L->length - 1; i >= pos - 1; i--) { // 将插入位置后的元素后移
L->data[i + 1] = L->data[i];
}
L->data[pos - 1] = e;
L->length++;
return 1;
}
```
顺序表的删除:
```
int DeleteList(SqList *L, int pos) {
int i;
if (pos < 1 || pos > L->length) { // 判断删除位置是否合法
return 0;
}
for (i = pos; i < L->length; i++) { // 将删除位置后的元素前移
L->data[i - 1] = L->data[i];
}
L->length--;
return 1;
}
```
顺序表的查找:
```
int SearchList(SqList L, int e) {
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == e) {
return i + 1; // 返回查找到的元素位置
}
}
return 0; // 未找到返回0
}
```
顺序表的排序:
```
void SortList(SqList *L) {
int i, j, temp;
for (i = 0; i < L->length - 1; i++) {
for (j = i + 1; j < L->length; j++) {
if (L->data[i] > L->data[j]) {
temp = L->data[i];
L->data[i] = L->data[j];
L->data[j] = temp;
}
}
}
}
```
有序线性表的合并:
```
void MergeList(SqList *La, SqList *Lb, SqList *Lc) {
int i = 0, j = 0, k = 0;
while (i < La->length && j < Lb->length) { // 两个线性表都未扫描完
if (La->data[i] < Lb->data[j]) {
Lc->data[k++] = La->data[i++];
} else if (La->data[i] > Lb->data[j]) {
Lc->data[k++] = Lb->data[j++];
} else { // 相等的情况
Lc->data[k++] = La->data[i++];
j++;
}
}
while (i < La->length) { // La未扫描完
Lc->data[k++] = La->data[i++];
}
while (j < Lb->length) { // Lb未扫描完
Lc->data[k++] = Lb->data[j++];
}
Lc->length = k; // Lc的长度为k
// 去除重复元素
for (i = 0; i < Lc->length - 1; i++) {
for (j = i + 1; j < Lc->length; j++) {
if (Lc->data[i] == Lc->data[j]) {
DeleteList(Lc, j);
j--;
}
}
}
}
```
阅读全文