C语言实现顺序表二

发布时间 2023-10-16 20:17:59作者: steve.z

//
//  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;
}