博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C 语言实现顺序表一

Posted on 2023-10-15 21:34  steve.z  阅读(10)  评论(0编辑  收藏  举报
//
//  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;
}