顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。
总结:1:顺序表中元素中的物理存储地址是连续的。
2:线性表主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用。
3:顺序表和链表的区别是两者的物理存储地址,顺序表是连续的,链表不一定是连续的。
#include<stdio.h> //数据结构 = 结构定义+结构操作
#include<stdlib.h>
#include<time.h>
//顺序表的结构定义
typedef struct Vector{
int *data;
int size,length;
}Vector;
//初始化顺序表,返回值是相应结构类型的指针(即当前顺序表的首地址),n是初始化的容量
Vector *init(int n){
Vector *v = (Vector *)malloc(sizeof(Vector));
v -> data = (int *)malloc(sizeof(int)*n);
v -> size = n;
v -> length = 0;
return v;
}
//顺序表的插入操作。
int insert(Vector *v, int value,int index){
if(v == NULL) return 0;
if(index < 0 || index > v -> length) return 0;
if(v -> length == v -> size) return 0;
for(int i = v -> length; i > index; i--){
v -> data[i] = v -> data[i - 1];
}
v -> data[index] = value;
v -> length += 1;
return 1;
}
//顺序表的删除操作
int erase(Vector *v, int index){
if(v == NULL) return 0;
if(index < 0 || index >= v -> length) return 0;
for(int i = index + 1; i < v-> length;i++){
v -> data[i - 1] = v -> data[i];
}
v -> length -= 1;
return 1;
}
//顺序表的空间释放,当有malloc出现的时候,才需要free;
void clear(Vector *v){
if(v == NULL) return ;
free(v -> data);
free(v);
return ;
}
//打印顺序表元素
void output(Vector* v){
if(v == NULL) return ;
printf("Vector :[");
for(int i = 0; i < v -> length; i++){
i&& printf(", ");
printf("%d",v -> data[i]);
}
printf("]\n");
return ;
}
int main(){
srand(time(0));
#define max_op 20
Vector *v = init(max_op);
for(int i =0; i < max_op; i++){
int val = rand()%100;
int index = rand()%(v -> length + 3) - 1;
int op = rand()%4;
switch(op){
case 0:
case 1:
case 2:{
printf("insert %d at %d to Vector = %d\n",val, index,insert(v,val,index));
}break;
case 3:{
printf("erase a interm at %d from Vector = %d\n",index,erase(v,index));
}
break;
}
output(v);
printf("\n");
}
clear(v);
#undef max_op
return 0;
}