//
// main.c
// SeqList
//
// Created by steve xiaohu zhao on 2023/10/15.
//
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
// 定义一个顺序表的节点
struct LNode {
// 用 char 类型数组来保存数据
char data[MAXSIZE];
int length;
};
// 起个别名
typedef struct LNode node;
typedef struct LNode * seqList;
// 1. 初始化一个空的顺序表
seqList makeEmpty(void) {
// 声明一个节点指针
seqList ptr;
// 动态分配一个节点空间
ptr = (seqList)malloc(sizeof(node));
// 设置顺序表长度
ptr->length = 0;
// 返回该顺序表
return ptr;
}
// 2. 查找。查找 e 第一次出现的索引位置
int find(char e, seqList list) {
int i = 0;
while (i < list->length && list->data[i] != e) {
i++;
}
if (i >= list->length) {
return -1;
} else {
return i;
}
}
// 3. 插入操作。将给定元素插入到索引为 index 的位置
int insert(char e, int index, seqList list) {
// 1. 判断表是否已满
if (list->length == MAXSIZE) {
printf("该顺序表已满。\n");
return 0;
}
// 2. 检查插入位置的合法性
if (index < 0 || index > list->length) {
printf("插入位置不合法。");
return 0;
}
// 3. 执行插入操作
// 3.1 将 index 位置及其以后得元素都向后移动一个位置
for (int i = list->length - 1; i >= index; i--) {
list->data[i + 1] = list->data[i];
}
// 3.2 将要插入的元素放到 list->data[index] 位置,并且长度+1
list->data[index] = e;
list->length++;
return 1;
}
// 4. 删除操作。删除索引为 index 的元素
int delete(int index, seqList list) {
// 判断 index 是否合法
if (index < 0 || index >= list->length) {
printf("不存在索引为 index 的元素。\n");
return 0;
}
// 将索引为 index + 1 的, 以及直到最后的所有的所有元素都前移一个
for (int i = index + 1; i < list->length; i++) {
list->data[index] = list->data[index+1];
}
// 更新 list->length
list->length--;
return 1;
}
// 5. 根据索引读取某个元素
//char * getElement(seqList list, int index) {
// if (index < 0 || index >= list->length) {
// printf("索引 %d 不合法。", index);
// return NULL;
// }
// return &list->data[index];
//}
int readElement(seqList list, int index, char *e) {
if (index < 0 || index >= list->length) {
return 0;
}
*e = list->data[index];
return 1;
}
// 6. 输出顺序表
void printSeqList(seqList list) {
for (int i = 0; i < list->length; i++) {
printf("第 %d 个元素是:%c \n", i, list->data[i]);
}
}
int main(int argc, const char * argv[]) {
// 测是顺序表
// 1. 创建一个空的顺序表
seqList list = makeEmpty();
printf("1顺序表长度为:%d \n", list->length);
// 2. 向顺序表中插入数据
char temp[10];
for (int i = 0 ; i < 10 ; i++) {
// 将整数 i, 转换为 字符 i
sprintf(temp, "%d", i);
insert(temp[0], i, list);
}
printf("2顺序表长度为:%d \n", list->length);
// 输出
printSeqList(list);
// 读取某个元素
char c;
readElement(list, 4, &c);
printf("索引为 4 的元素是:%c \n", c);
return 0;
}