针对顺序表的存储结构及各个相关算法,设计一个验证程序,完成顺序表的建立、插入、删除、查找、遍历、排序、归并等算法的设计和编程调试
时间: 2023-12-21 19:05:46 浏览: 83
以下是一个基于C语言的顺序表的实现,包括建立、插入、删除、查找、遍历、排序、归并等算法的设计和编程调试。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 定义最大容量
typedef int ElemType; // 定义元素类型
typedef struct
{
ElemType data[MAXSIZE]; // 存储数据元素
int length; // 当前长度
} SqList;
// 初始化顺序表
void InitList(SqList *L)
{
L->length = 0;
}
// 判断顺序表是否为空
int ListEmpty(SqList L)
{
if (L.length == 0)
return 1;
else
return 0;
}
// 在顺序表中查找元素
int LocateElem(SqList L, ElemType e)
{
int i;
for (i = 0; i < L.length; i++)
{
if (L.data[i] == e)
return i+1;
}
return 0;
}
// 在顺序表中插入元素
int ListInsert(SqList *L, int i, ElemType e)
{
int j;
if (L->length == MAXSIZE) // 顺序表已满
return 0;
if (i < 1 || i > L->length+1) // 插入位置不合法
return 0;
for (j = L->length; j >= i; j--)
L->data[j] = L->data[j-1];
L->data[i-1] = e;
L->length++;
return 1;
}
// 在顺序表中删除元素
int ListDelete(SqList *L, int i)
{
int j;
if (L->length == 0) // 顺序表为空
return 0;
if (i < 1 || i > L->length) // 删除位置不合法
return 0;
for (j = i; j < L->length; j++)
L->data[j-1] = L->data[j];
L->length--;
return 1;
}
// 遍历顺序表
void ListTraverse(SqList L)
{
int i;
for (i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
}
// 对顺序表进行排序
void ListSort(SqList *L)
{
int i, j;
ElemType 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
Lc->data[k++] = Lb.data[j++];
}
while (i < La.length)
Lc->data[k++] = La.data[i++];
while (j < Lb.length)
Lc->data[k++] = Lb.data[j++];
Lc->length = k;
}
int main()
{
SqList L;
InitList(&L);
ListInsert(&L, 1, 3);
ListInsert(&L, 2, 1);
ListInsert(&L, 3, 4);
ListInsert(&L, 4, 2);
printf("插入元素后的顺序表:\n");
ListTraverse(L);
printf("元素4的位置是:%d\n", LocateElem(L, 4));
ListDelete(&L, 2);
printf("删除一个元素后的顺序表:\n");
ListTraverse(L);
printf("排序后的顺序表:\n");
ListSort(&L);
ListTraverse(L);
SqList La, Lb, Lc;
InitList(&La);
InitList(&Lb);
ListInsert(&La, 1, 1);
ListInsert(&La, 2, 3);
ListInsert(&La, 3, 5);
ListInsert(&Lb, 1, 2);
ListInsert(&Lb, 2, 4);
ListInsert(&Lb, 3, 6);
printf("顺序表La:\n");
ListTraverse(La);
printf("顺序表Lb:\n");
ListTraverse(Lb);
MergeList(La, Lb, &Lc);
printf("合并后的顺序表Lc:\n");
ListTraverse(Lc);
return 0;
}
```
程序运行结果如下:
```
插入元素后的顺序表:
3 1 4 2
元素4的位置是:3
删除一个元素后的顺序表:
3 4 2
排序后的顺序表:
2 3 4
顺序表La:
1 3 5
顺序表Lb:
2 4 6
合并后的顺序表Lc:
1 2 3 4 5 6
```
可以看到,此程序实现了顺序表的建立、插入、删除、查找、遍历、排序、归并等算法,符合题目要求。
阅读全文