資料結構 - 順序表
阿新 • • 發佈:2022-03-27
1、
#include<stdio.h> #include<stdlib.h> #include<time.h> //型別重新命名 typedef struct Vector { int *data; int size, length; }Vector; //初始化1個儲存n個元素的順序表 Vector* init(int n) { //申請一個順序表的空間 Vector* vec = (Vector*)malloc(sizeof(Vector)); //申請順序表中連續儲存區的儲存空間 vec->data = (int*)malloc(sizeof(int) * n); vec->size = n; vec->length = 0; return vec; } //順序表的插入操作(順序表,插入位置,插入值) int insert(Vector* vec,int ind,int val) { //排除異常 if (vec == NULL)return 0; if (vec->length == vec->size)return 0; if (ind < 0 || ind > vec->length)return 0; //將插入位置後方資料後移一位 for (int i = vec->length; i > ind; i--) { vec->data[i] = vec->data[i - 1]; } vec->data[ind] = val; vec->length += 1; return 1; } //順序表的刪除操作(順序表,位置) int erase(Vector* vec, int ind) { //排除異常 if (vec == NULL)return 0; if (vec->length == vec->size)return 0; if (ind < 0 || ind >= vec->length)return 0; //將後方位置元素向前移動一位 for (int i = ind + 1; i < vec->length; i++) { vec->data[i - 1] = vec->data[i]; } vec->length -= 1; return 1; } //輸出順序表 void output(Vector* vec) { printf("Vector(%d) = [", vec->length); for (int i = 0; i < vec->length; i++) { if (i != 0)printf(", "); printf("%d", vec->data[i]); } printf("]\n"); return; } //順序表的銷燬操作 void clear(Vector* vec) { if (vec == NULL)return; //先順序表銷燬資料區 free(vec->data); //再順序表銷燬本身空間 free(vec); return; } //主函式 int main() { //傳入當前時間作為隨機數種子 srand(time(0)); //隨機操作20組數 #define MAX_OP 20 Vector* vec = init(MAX_OP); int op, ind, val; for (int i = 0; i < MAX_OP; i++) { op = rand() % 2;//得到的 op 為0或1 ind = rand() % (vec->length + 1);//隨機數索引 val = rand() % 100;//0-100之內隨機生成一個值 //判斷操作功能 0:插入、1:刪除 switch (op) { case 0: { printf("insert %d at %d to vector = %d\n", val, ind, insert(vec, ind, val)); } break; case 1: { printf("erase item at %d from vector = %d\n", ind, erase(vec, ind)); } break; } output(vec); } return 0; }
2、上述程式碼只能儲存最大為20個空間的資料,故一下程式碼進行升級可以擴容操作
#include<stdio.h> #include<stdlib.h> #include<time.h> //型別重新命名 typedef struct Vector { int *data; int size, length; }Vector; //初始化1個儲存n個元素的順序表 Vector* init(int n) { //申請一個順序表的空間 Vector* vec = (Vector*)malloc(sizeof(Vector)); //申請順序表中連續儲存區的儲存空間 vec->data = (int*)malloc(sizeof(int) * n); vec->size = n; vec->length = 0; return vec; } //對順序表擴容操作 int expand(Vector* vec) { int new_size = vec->size * 2; int* p = (int*)realloc(vec->data, sizeof(int) * new_size);//重新分配 if (p == NULL) return 0; vec->size = new_size; vec->data = p; return 1; } //順序表的插入操作(順序表,插入位置,插入值) int insert(Vector* vec,int ind,int val) { //排除異常 if (vec == NULL)return 0; if (vec->size == vec->length) { if (!expand(vec))return;//分配空間失敗則return printf("expand vector size to %d success\n", vec->size); } if (ind < 0 || ind > vec->length)return 0; //將插入位置後方資料後移一位 for (int i = vec->length; i > ind; i--) { vec->data[i] = vec->data[i - 1]; } vec->data[ind] = val; vec->length += 1; return 1; } //順序表的刪除操作(順序表,位置) int erase(Vector* vec, int ind) { //排除異常 if (vec == NULL)return 0; if (vec->length == vec->size)return 0; if (ind < 0 || ind >= vec->length)return 0; //將後方位置元素向前移動一位 for (int i = ind + 1; i < vec->length; i++) { vec->data[i - 1] = vec->data[i]; } vec->length -= 1; return 1; } //輸出順序表 void output(Vector* vec) { printf("Vector(%d) = [", vec->length); for (int i = 0; i < vec->length; i++) { if (i != 0)printf(", "); printf("%d", vec->data[i]); } printf("]\n"); return; } //順序表的銷燬操作 void clear(Vector* vec) { if (vec == NULL)return; //先順序表銷燬資料區 free(vec->data); //再順序表銷燬本身空間 free(vec); return; } //主函式 int main() { //傳入當前時間作為隨機數種子 srand(time(0)); //隨機操作20組數 #define MAX_OP 20 Vector* vec = init(1); int op, ind, val; for (int i = 0; i < MAX_OP; i++) { op = rand() % 2;//得到的 op 為0或1 ind = rand() % (vec->length + 1);//隨機數索引 val = rand() % 100;//0-100之內隨機生成一個值 //判斷操作功能 0:插入、1:刪除 switch (op) { case 0: { printf("insert %d at %d to vector = %d\n", val, ind, insert(vec, ind, val)); } break; case 1: { printf("erase item at %d from vector = %d\n", ind, erase(vec, ind)); } break; } output(vec); printf("\n"); } return 0; }
自此完成