返回
顺序表数据结构:全面解析从零实现到调试分析
后端
2023-12-31 08:33:23
今天我们就来探讨一个经典的数据结构——顺序表。顺序表是一种简单而实用的数据结构,常用于存储和处理有序数据。
顺序表概述
顺序表是一个线性数据结构,它由一组连续的内存单元组成,每个单元存储一个数据元素。顺序表的元素按其在表中的位置排列,即第一个元素位于表头,最后一个元素位于表尾。
顺序表接口函数
顺序表通常提供以下基本接口函数:
- 初始化顺序表 :创建一个空的顺序表。
- 插入元素 :将一个新元素插入顺序表中的指定位置。
- 删除元素 :从顺序表中删除指定位置的元素。
- 查找元素 :在顺序表中查找指定元素的位置。
- 获取元素 :获取顺序表中指定位置的元素。
- 设置元素 :设置顺序表中指定位置的元素的值。
- 获取顺序表长度 :获取顺序表中元素的个数。
- 清空顺序表 :将顺序表中的所有元素删除。
实现顺序表
顺序表可以使用数组来实现。数组是一种连续的内存单元,可以用来存储一系列数据元素。数组的索引从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;