仅为个人学习过程的记录
顺序表可以随机访问,即通过表头和元素编号进行访问。
#include <stdio.h>
#include <stdlib.h>
//定义顺序表的结构体
typedef struct vector{
int size; //顺序表总容量
int length //顺序表当前个数
int*data;
} Vector;
//初始化顺序表
void init(Vector *vector, int size) {
//需要顺序表的容量大小
vector->size=size;
//初始化的顺序表数量为0;
vector->length=0;
//需要通过malloc动态分配空间
vector->data=(int*)malloc(sizeof(int)*size);
}
注意,malloc动态分配内存,需要手动释放,用free函数
//删除顺序表,手动释放内存,避免泄漏
void clear(Vector *vector) {
//释放数据以及指针指向的内存空间
free(vector->data);
free(vector);
}
//插入顺序表元素,由于顺序表vector,插入位置loctaion,插入数值value
int insert(Vector *vector, int location, int value) {
//注意需先进行边界条件的判断
if(location<0||location>vector->length){
return 0;
}
//判断是否顺序表已满
if(vector->length>=vector->size){
return 0;
}
//进行元素的插入
for(int i=vector->length,i>location;--i){
vector->data[i]=vector->data[i-1];
}
vector->data[location]=value;//插入元素
vector->length++;
return 1; //插入成功
}
当顺序表满时,需要对顺序表进行扩容,一般为之前的2倍,顺序表扩容函数
void expand(Vector *vector) {
//接收原来的顺序表数据
int *old_data=vector->data;
//扩大容量为原2倍
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 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 -1; } for(int i=index+1;i<vector->length;i++){ vector->data[i-1]=vector->data[i]; } vector->length--; return 1;}
//打印顺序表
void print(Vector*vector) { for(int i=0;i<vector->length;++i){ if(i>0){ printf(" "); } printf("%d",vector->data[i]); } printf("\n"); }
int main() {
Vector *a = (Vector *)malloc(sizeof(Vector));
init(a, 10);
return 0;
综上,实现了顺序表的初始化,插入,删除,扩容,查找,遍历等功能。