英特爾和 AMD 官方確認,已暫停向俄羅斯和白俄羅斯供貨
阿新 • • 發佈:2022-03-04
順序表
1、什麼是順序表
順序表是將表中的資料依次存放在計算機記憶體中一組地址連續的儲存單元中的一種資料結構,可以將順序表看成一個可以動態改變大小的陣列。
資料元素物理儲存的相鄰關係來反映資料元素之間邏輯上的相鄰關係,順序表是線性表的一種,也就是採用順序儲存結構的線性表簡稱為"順序表"。
順序表的儲存特點是:只要確定了起始位置 ,資料可以通過指定位置得到:首地址+(位置*偏移大小)
2、順序表的定義
#define MAX_SIZE 128 //順序表的元素大小 typedef int Type //型別的定義,這裡用Type替代int是為了後續改變型別方便 struct Array { Type *data; //儲存陣列的指標 int length; //順序表裡元素的個數 int capacity; //順序表記憶體空間大小 };
3、順序表的功能實現
3.1 構造一個空的順序表
//3.1構造一個空的順序表
Array* arr_init()
{
Array* temp = (Array*)malloc(sizeof(Array)); //結構體初始化
if (temp == NULL)
{
printf("順序表開闢空間失敗");
return NULL;
}
temp->data = (Type*)calloc(1,sizeof(Type)); //資料域初始化
temp->lenth = 0;
return temp;
}
3.2 銷燬順序表
void arr_free(Array* arr) { if (arr != NULL) { if(arr->data != NULL) free(arr->data); //釋放順序表資料域 free(arr); //釋放整個順序表 } else { printf("順序表為空"); } }
3.3 重置為空表
void arr_clear(Array* arr) { if (arr == NULL) { printf("\n順序表為空:檔案位置:%s 函式:%s 行數:%d \n",__FILE__,__FUNCTION__,__LINE__); //如果報錯,輸出錯誤資訊 return; } else { for (int i = 0; i < arr->lenth; ++i) { arr->data[i] = 0; //順序表置空(元素置0) } arr->data = (Type*)realloc(arr->data, sizeof(Type)); //順序表資料域置0 arr->lenth = 0; } /* * 或者先free,再開闢 * free(arr->data); * arr->data = (Type*)calloc(1,sizeof(Type)) * arr->lenth = 0; */ }
3.4 判斷是否為空表
int arr_empty(Array* arr)
{
if (arr->lenth == 0)
{
printf("順序表資料為空");
return 1;
}
return 0;
}
3.5 返回第i個數據元素的值
Type arr_get(Array* arr, int i)
{
if (arr == NULL)
{
printf("\n順序表為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (arr->data == NULL)
{
printf("\n順序表資料域為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
arr_empty(arr);
if (i > arr->lenth)
{
printf("\n位置有誤:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
return arr->data[i - 1];
}
3.6 插入順序表元素
void arr_push(Array* arr, Type val)
{
if (arr == NULL)
{
printf("\n順序表為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (arr->data == NULL)
{
printf("\n順序表資料域為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
arr->lenth++; //長度+1
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth); //順序表資料域記憶體擴大
arr->data[arr->lenth - 1] = val; //尾插
}
3.7 在順序表指定位置插入新的資料元素
void arr_insert(Array* arr, int index, Type val)
{
if (arr == NULL)
{
printf("\n順序表為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (arr->data == NULL)
{
printf("\n順序表資料域為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
arr_empty(arr);
if (index > arr->lenth)
{
printf("\n插入位置有誤:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
int i = arr->lenth++;
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth);
for (int j = arr->lenth - 1; j > index -1; --j) //把插入資料之後的元素向後移動
{
arr->data[j] = arr->data[j-1];
}
arr->data[index-1] = val;
}
3.8 刪除順序表指定位置的資料元素,並返回元素的值
Type arr_remove(Array* arr, int index)
{
if (arr == NULL)
{
printf("\n順序表為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (arr->data == NULL)
{
printf("\n順序表資料域為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (index > arr->lenth)
{
printf("\n插入位置有誤:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
arr_empty(arr);
int temp = arr->data[index - 1]; //記錄被刪除元素
for (int i = index - 1; i < arr->lenth; ++i)
{
arr->data[i] = arr->data[i + 1];
}
arr->lenth--;
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth);
return temp;
}
3.9 輸出順序表
void arr_out(Array* arr)
{
if (arr == NULL)
{
printf("\n順序表為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
if (arr->data == NULL)
{
printf("\n順序表資料域為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return;
}
arr_empty(arr);
for (int i = 0; i < arr->lenth; ++i)
{
printf(T, arr->data[i]);
}
}
3.10 從尾部刪除順序表
Type arr_pop(Array* arr)
{
if (arr == NULL)
{
printf("\n順序表為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
if (arr->data == NULL)
{
printf("\n順序表資料域為空:檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
return NULL;
}
arr_empty(arr);
int temp = arr->data[arr->lenth - 1];
arr->lenth--;
arr->data = (Type*)realloc(arr->data, sizeof(Type) * arr->lenth);
return temp;
}
當然也可以用巨集定義替代報錯
#define Error(str) printf("\n%s 檔案位置:%s 函式:%s 行數:%d \n", __FILE__, __FUNCTION__, __LINE__);
//這樣只需要在程式碼裡寫Error("順序表為空 ");了