(1)初始化顺序表L
(2)依次采用插尾法插入a,b,c,d,e元素
(3)输出顺序表l:a b c d e
(4)顺序表L的长度=5
(5)顺序表L为 非空
(6)顺序表的第3个元素=c
(7)元素a的位置=1
(8)在第4个元素位置上插入f元素
(9)输出顺序表L:a b c f d e
(10)删除l的第3个元素
(11)输出线性表L:a b f d e
(12)释放顺序表L
### 线性表实现详解
#### 一、线性表概述
线性表是数据结构中最基本且最常见的数据组织形式之一,它是由相同类型的若干数据元素构成的序列。线性表中的每个元素都有唯一的前驱和后继(除了第一个元素没有前驱,最后一个元素没有后继)。本篇文章将详细介绍如何通过C语言实现一个简单的顺序表,并通过实例来展示其基本操作。
#### 二、顺序表定义与初始化
顺序表是一种存储结构,它将线性表的数据元素按照逻辑顺序存储在一个连续的内存空间中。为了便于管理,我们定义了一个结构体`list`,其中包含两个成员:一个字符数组`data`用于存储数据元素,一个整型变量`length`用于记录当前表中的元素数量。在本例中,我们使用了宏定义`#define maxn 50`来指定数组的最大容量。
```cpp
typedef struct {
elemtype data[maxn]; // elemtype定义为char类型
int length; // 当前表的长度
} list;
```
初始化顺序表`L`时,需要为其分配内存,并将长度设为0。
```cpp
void init_list(list*& l) {
l = (list*)malloc(sizeof(list)); // 动态分配内存
l->length = 0; // 初始长度为0
}
```
#### 三、顺序表的基本操作
1. **判断顺序表是否为空**:通过比较顺序表的长度是否为0来判断。
```cpp
int list_empty(list*& l) {
return (l->length == 0); // 如果长度为0,则表示为空
}
```
2. **插入元素**:在指定位置插入一个新元素,需要考虑插入位置的有效性和表是否已满。
```cpp
int list_insert(list*& l, int i, elemtype e) {
int j;
if (i < 1 || i > l->length + 1) return 0; // 检查位置有效性
i--; // C数组索引从0开始
for (j = l->length; j > i; j--) // 将插入位置之后的元素向后移动
l->data[j] = l->data[j - 1];
l->data[i] = e; // 插入新元素
l->length++; // 表长度增加
return 1; // 成功插入
}
```
3. **获取指定位置的元素**:根据位置返回该位置上的元素。
```cpp
void getelem(list*& l, int i, elemtype& e) { // 将第i个元素赋值给e
if (i < 1 || i > l->length) return; // 检查位置有效性
e = l->data[i - 1]; // 获取元素
}
```
4. **查找元素位置**:查找给定元素在表中的位置。
```cpp
int locateelem(list*& l, elemtype e) { // 查找e的位置
int i;
for (i = 0; i < l->length; i++)
if (e == l->data[i]) return i + 1; // 返回位置
return 0; // 未找到
}
```
5. **删除指定位置的元素**:从表中移除指定位置的元素,并调整后续元素的位置。
```cpp
void list_delete(list*& l, int i) { // 删除第i个元素
if (i < 1 || i > l->length) return; // 检查位置有效性
for (i--; i < l->length - 1; i++) // 将删除位置之后的元素向前移动
l->data[i] = l->data[i + 1];
l->length--; // 表长度减少
}
```
6. **打印顺序表**:输出表中所有元素。
```cpp
void print_list(list*& l) {
int i;
if (list_empty(l)) return; // 如果表为空则不输出
for (i = 0; i < l->length; i++)
printf("%c", l->data[i]); // 输出每个元素
printf("\n"); // 换行
}
```
#### 四、示例运行
接下来,我们将执行一系列操作来展示上述基本操作的功能。
1. **初始化顺序表L**:
```cpp
list *l;
init_list(l); // 初始化顺序表
```
2. **插入元素a, b, c, d, e**:
```cpp
list_insert(l, 1, 'a'); // 插入'a'到位置1
list_insert(l, 2, 'b'); // 插入'b'到位置2
list_insert(l, 3, 'c'); // 插入'c'到位置3
list_insert(l, 4, 'd'); // 插入'd'到位置4
list_insert(l, 5, 'e'); // 插入'e'到位置5
print_list(l); // 输出当前顺序表
```
3. **输出顺序表L**:`a b c d e`
```cpp
printf("顺序表L: ");
print_list(l); // 输出顺序表
```
4. **获取并输出顺序表L的长度**:
```cpp
printf("顺序表L的长度=%d\n", l->length);
```
5. **判断顺序表L是否为空**:
```cpp
printf("顺序表L为%s\n", (list_empty(l) ? "空" : "非空"));
```
6. **获取并输出顺序表的第3个元素**:
```cpp
elemtype e;
getelem(l, 3, e);
printf("顺序表的第3个元素=%c\n", e);
```
7. **获取并输出元素a的位置**:
```cpp
printf("元素a的位置=%d\n", locateelem(l, 'a'));
```
8. **在第4个元素位置上插入f元素**:
```cpp
list_insert(l, 4, 'f');
print_list(l); // 输出当前顺序表
```
9. **删除顺序表的第3个元素**:
```cpp
list_delete(l, 3);
print_list(l); // 输出当前顺序表
```
10. **释放顺序表L**:
```cpp
destroy_list(l); // 释放顺序表
```
以上步骤详细展示了如何在C语言中实现一个简单的顺序表,并演示了基本的操作流程。通过这些操作,我们可以更好地理解顺序表的特性和实现方式。