返回

顺序表数据结构:全面解析从零实现到调试分析

后端

今天我们就来探讨一个经典的数据结构——顺序表。顺序表是一种简单而实用的数据结构,常用于存储和处理有序数据。

顺序表概述

顺序表是一个线性数据结构,它由一组连续的内存单元组成,每个单元存储一个数据元素。顺序表的元素按其在表中的位置排列,即第一个元素位于表头,最后一个元素位于表尾。

顺序表接口函数

顺序表通常提供以下基本接口函数:

  1. 初始化顺序表 :创建一个空的顺序表。
  2. 插入元素 :将一个新元素插入顺序表中的指定位置。
  3. 删除元素 :从顺序表中删除指定位置的元素。
  4. 查找元素 :在顺序表中查找指定元素的位置。
  5. 获取元素 :获取顺序表中指定位置的元素。
  6. 设置元素 :设置顺序表中指定位置的元素的值。
  7. 获取顺序表长度 :获取顺序表中元素的个数。
  8. 清空顺序表 :将顺序表中的所有元素删除。

实现顺序表

顺序表可以使用数组来实现。数组是一种连续的内存单元,可以用来存储一系列数据元素。数组的索引从0开始,因此顺序表中第一个元素的索引为0,最后一个元素的索引为顺序表长度减一。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int *data;
    int size;
    int capacity;
} SeqList;

SeqList *createSeqList(int capacity) {
    SeqList *list = (SeqList *)malloc(sizeof(SeqList));
    list->data = (int *)malloc(sizeof(int) * capacity);
    list->size = 0;
    list->capacity = capacity;
    return list;
}

void destroySeqList(SeqList *list) {
    free(list->data);
    free(list);
}

void insertElement(SeqList *list, int index, int value) {
    if (index < 0 || index > list->size) {
        printf("Invalid index.\n");
        return;
    }
    if (list->size == list->capacity) {
        // 扩容顺序表
        list->data = (int *)realloc(list->data, sizeof(int) * list->capacity * 2);
        list->capacity *= 2;
    }
    // 从后往前移动元素
    for (int i = list->size - 1; i >= index; i--) {
        list->data[i + 1] = list->data[i];
    }
    // 插入新元素
    list->data[index] = value;
    list->size++;
}

void deleteElement(SeqList *list, int index) {
    if (index < 0 || index >= list->size) {
        printf("Invalid index.\n");
        return;
    }
    // 从前往后移动元素
    for (int i = index + 1; i < list->size; i++) {
        list->data[i - 1] = list->data[i];
    }
    // 减少顺序表长度
    list->size--;
}

int findElement(SeqList *list, int value) {
    for (int i = 0; i < list->size; i++) {
        if (list->data[i] == value) {
            return i;
        }
    }
    return -1;
}

int getElement(SeqList *list, int index) {
    if (index < 0 || index >= list->size) {
        printf("Invalid index.\n");
        return -1;
    }
    return list->data[index];
}

void setElement(SeqList *list, int index, int value) {
    if (index < 0 || index >= list->size) {
        printf("Invalid index.\n");
        return;
    }
    list->data[index] = value;
}

int getSeqListLength(SeqList *list) {
    return list->size;
}

void clearSeqList(SeqList *list) {
    list->size = 0;