//
// main.c
// SeqList2
//
// Created by steve xiaohu zhao on 2023/10/15.
//
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 /* 表示线性表的最大长度 */
// 定义一个顺序表节点
struct SNode {
// 用来存储书序表中的数据(动态分配数组)
char *data;
// 表示线性表的当前长度
int length;
};
// 起个别名
typedef struct SNode node;
typedef struct SNode * SeqList;
// 1. 初始化一个空线性表
int init_list(SeqList list) {
// 初始化线性表的数组
list->data =malloc(MAXSIZE * sizeof(char));
// 判断是否动态分配内存失败
if (!list->data) {
exit(-2);
}
// 设置线性表长度为 0
list->length = 0;
return 1;
}
// 2. 根据索引读取元素值
int read_data(SeqList list, int index, char *e) {
// 1. 判断索引是否合法
if (index < 0 || index >= list->length) {
return 0;
}
*e = list->data[index];
return 1;
}
// 3. 插入。
int insert_data(SeqList list, int index, char data) {
// 1. 判断线性表是否已满
if (list->length == MAXSIZE) {
printf("线性表已满。\n");
return 0;
}
// 2. 判断插入位置是否合法
if (index < 0 || index > list->length) {
printf("插入位置不合法。\n");
return 0;
}
// 3. index 及后续元素后移,并执行插入操作
for (int i = list->length - 1; i >= index; i--) {
list->data[i+1] = list->data[i];
}
// 执行插入操作
list->data[index] = data;
list->length++;
return 1;
}
// 4. 求表长
int length(SeqList list) {
return list->length;
}
// 5. 删除操作。删除指定索引处的元素
int delete_data(SeqList list, int index) {
if (!list) {
printf("链表为空.\n");
return 0;
}
// 1. 判断 index 是否合法
if (index < 0 || index >= list->length) {
printf("要删除的索引位置不合法。\n");
return 0;
}
// 2. 移动元素。
// 将 index + 1 及以后的所有元素都前移一位
for (int i = index; i < list->length; i++) {
list->data[i] = list->data[i+1];
}
// 3. list->length-- 操作
list->length--;
return 1;
}
// 打印输出该顺序表的信息
void print_list(SeqList list) {
if (!list) {
printf("该顺序表为空。\n");
return;
}
for (int i = 0; i < list->length; i++) {
printf("第 %d 个元素是:%c \n", i, list->data[i]);
}
}
int main(int argc, const char * argv[]) {
// 创建一个链表的节点
struct SNode list;
// 1. 初始化一个空的顺序表
init_list(&list);
// 2. 插入一些数据
for (int i = 0; i < 5; i++) {
insert_data(&list, i, 'a' + i);
}
// 3. 求表长
int len = length(&list);
printf("该顺序表长度为:%d\n", len);
// 4. 输出该列表信息
print_list(&list);
// 3. 根据索引找出元素
char ch;
read_data(&list, 3, &ch);
printf("索引为 3 的元素是 %c.\n", ch);
// 4. 根据索引删除某个元素
delete_data(&list, 3);
// 重新求表长
len = length(&list);
printf("删除元素后, 表长为:%d \n", len);
// 重新输出表中所有内容
print_list(&list);
printf("插入新元素 Z \n");
// 在指定索引位置插入一个新的元素
insert_data(&list, 2, 'Z');
print_list(&list);
return 0;
}