线性表
- 线性表是由相同类型数据元素组成的有限序列
- 线性表受存储空间限制,线性表不能无限存储
- 从逻辑上看,线性表的元素按顺序依次排列
顺序表
顺序表是线性表的一种顺序存储形式,换句话说线性表是逻辑结构,顺序表是存储结构,是指用一组连续的存储单元,依次存储线性表中的数据元素,从而逻辑上相邻的数据元素物理位置上也相邻。
顺序表通常用一维数组来实现,一维数组可以是静态分配也可以是动态分配。
顺序表最主要是可以随机访问,时间复杂度O(1)
顺序表不足之处插入和删除需要移动大量元素,保持逻辑和物理上的连续性。
顺序表占用的空间大小与元素存储顺序无关,只与存储元素个数有关。
初始化顺序表
#include<stdio.h>
#include<stdlib.h>
typedef struct Vector{
int size,length;
int *data;
}
void init(Vector *vector,int size){
vector->size = size;
vector->length = 0;
vector->data = (int *)malloc(sizeof(int) * size);
}
void clear(Vector *vector){
free(vector->data);
free(vector);
}
int main(){
Vector *a = (Vector *)malloc(sizeof(Vector));
init(a, 100);
clear(a);
return 0;
}
顺序表插入
#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 clear(Vector *vector){
free(vector->data);
free(vector);
}
//扩容
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);
}
//插入数据
int insert(Vector *vector,int loc, int value){
if(loc < 0 || loc > vector->length){
return ERROR;
}
if(vector->length >= vector->size){
expand(vector);
}
for(int i = vector->length; i > loc; i--){
vector->data[i] = vector->data[i - 1];
}
vector->data[loc] = value;
vector->length++;
}
int main(){
Vector *a = (Vector *)malloc(sizeof(Vector));
init(a,200);
int loc,value;
scanf("%d %d",&loc,&value);
insert(a,loc,value);
clear(a);
return 0;
}
顺序表按值查找
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--;
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");
}