线性表是由相同数据元素的n个数据元素组成的有限序列,线性表按照存储结构,可以分为顺序表和链表两种类型。
顺序表是线性表的一种顺序存储形式
线性表是逻辑结构,表示元素之间一对一的相邻关系顺序表是存储结构,是指用一组连续的存储单元,依次存储线性表中的数据元素,这样使得数据在物理空间位置上也是连续的。顺序表通常用一维数组实现,其可以是静态(栈、静态存储区、全局存储区等),也可以是动态分配(占用堆内存)的。 顺序表最主要的特点是可以进行随机访问,即通过索引可以在O(1)时间复杂度内访问其任意元素。但顺序表的删除和插入元素则较为不便,需移动较多元素才能保持其逻辑和物理上的连续性。
顺序表常见的操作有:
函数功能init(vector, size)初始化长度为size的vectorinsert(vector,loc,value)将value插入vector的loc位置expand(vector)将vector进行扩容remove(vector,index)将index所对应的元素从vector移除search(vector, value)在vector查找value,返回下标print(vector)打印vector的每个元素clear(vector)清除顺序表vector顺序表的构造
#include <stdio.h> #include <stdlib.h> #define ERROR 0 #define OK 1 typedef struct Vector { int size, length; int *data; } Vector; void init(Vector *vector, int size) { vector->size = size; vector->length = 0; vector->data = (int *)malloc(sizeof(int) * size); } void expand(Vector *vector) { int *old_data = vector->data; vector->size = vector->size * 2; vector->data = (int *)malloc(sizeof(int) * vector->size); for (int i = 0; i < vector->length; ++i) { vector->data[i] = old_data[i]; } free(old_data); } //length为从1开始的长度,而loc和index等都为从0开始的位置索引值 int insert(Vector *vector, int loc, int value) { if (loc < 0 || loc > vector->length) { return ERROR; } if (vector->length >= vector->size) { //return ERROR; expand(vector); } for (int i = vector->length; i > loc; --i) { vector->data[i] = vector->data[i - 1]; } vector->data[loc] = value; vector->length++; return OK; } int search(Vector *vector, int value) { for (int i = 0; i < vector->length; ++i) { if (vector->data[i] == value) { return i; } } return -1; } int delete_node(Vector *vector, int index) { if (index < 0 || index >= vector->length) { return ERROR; } for (int i = index + 1; i < vector->length; ++i) { vector->data[i - 1] = vector->data[i]; } vector->length = vector->length - 1; return OK; } void print(Vector *vector) { for (int i = 0; i < vector -> length; ++i) { if (i > 0) { printf(" "); } printf("%d", vector -> data[i]); } printf("\n"); } void clear(Vector *vector) { free(vector->data); free(vector); } int main() { Vector *a = (Vector *)malloc(sizeof(Vector)); init(a, 100); printf("%d\n", insert(a, 0, 1)); printf("%d\n", insert(a, 0, 2)); print(a); printf("%d\n", delete_node(a, 1)); print(a); printf("%d\n", search(a, 0)); printf("%d\n", search(a, 1)); clear(a); return 0; }