在很多的環境下無法使用官方庫,可以自己寫數據結構,進行使用。
上圖可以看到:儲存地址是連續的,表示可以通過(某一結點的地址+偏移量)直接存取其他結點。
順序表的特點:隨機存取(通過表頭元素地址和元素的標號,在O(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);
}
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;
}
插入元素(複雜度分析):
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 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, 5);
int n, col, data;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &col, &data);
insert(a,col,data);
}
clear(a);
return 0;
}
第二道題
int main() {
Vector *a = (Vector *)malloc(sizeof(Vector));
init(a, 20);
int m, t,index,value,feiwu;
scanf("%d", &m);
for(int i = 0; i < m; i++){
scanf("%d", &t);
switch(t){
case 1 :
scanf("%d%d", &index, &value);
feiwu = insert(a,index,value);
break;
case 2 :
scanf("%d", &index);
feiwu = delete_node(a,index);
break;
case 3 :
scanf("%d", &value);
feiwu = search(a,value);
break;
case 4 :
print(a);
break;
}
}
free(a);
return 0;
}