C語言實現List的資料結構(很詳細的註釋)
阿新 • • 發佈:2019-01-04
- 新建一個list.c檔案
#include <stdio.h>
#include <malloc.h> //動態分配記憶體
#include <stdlib.h> //exit 函式
#include <stdbool.h> //布林值函式
struct Arr
{
int *pBase;//儲存的是陣列第一個元素的地址
int len;//陣列能容納的最大元素的個數
int cnt;//有效陣列個數
//自動增長因子
};
void show_arr(struct Arr *pArr);//顯示,分號不能省
void init_arr(struct Arr *pArr, int length);//初始化陣列
bool is_empty(struct Arr *pArr);//判斷是否為空陣列
bool append_arr(struct Arr *pArr, int val);//追加,可能成功,可能失敗
bool is_full(struct Arr *pArr);//是否滿了
bool delete_arr(struct Arr *pArr, int pos, int *pVal);//刪除某個元素
bool insert_arr(struct Arr *pArr, int pos, int val); // 插入一條資料 pos的值從1開始
void sort_arr(struct Arr *pArr);//排序
void innversion_arr(struct Arr *pArr);//倒置
int main(void)
{
printf("%s\n", "start");
struct Arr arr;
init_arr(&arr,6);
append_arr(&arr, 1);
append_arr(&arr, 21);
append_arr(&arr, 3);
append_arr(&arr, 4);
insert_arr(&arr,5 ,6);
append_arr(&arr, 5);
int val;
int posi = 2;
/** 刪除其中一個元素 **/
/* if (delete_arr(&arr, posi, &val)) {
printf("刪除成功元素為");
printf("%d\n",val);
}
else {
printf("%s\n""刪除失敗");
}
*/
sort_arr(&arr);
innversion_arr(&arr);
show_arr(&arr);
/*int len;
printf("%s\n","please input 請輸入你需要分配的陣列長度:len=");
scanf("%d",&len);
//(int?*)為強制轉換,強制使pArr指向前四個位元組。
int *pArr = (int *)malloc(sizeof(int)*len);*/
printf("%s\n", "end");
getchar();
return 0;
}
void innversion_arr(struct Arr *pArr)//倒置
{
int i = 0;
int j = pArr->cnt - 1;
int t;
while (i<j)
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
++i;
--j;
}
return;
}
void sort_arr(struct Arr *pArr)//排序,氣泡排序,比較相鄰的2個元素大小,再替換位置
{
int i, j, t;
for (i = 0; i < pArr->cnt; ++i)
{
for (j = i + 1; j < pArr->cnt; ++j)
{
if (pArr->pBase[i] > pArr->pBase[j])
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
}
}
}
}
bool insert_arr(struct Arr *pArr, int pos, int val) { //pos的值從1開始
int i;
if (is_full(pArr))
return false;
if (pos<1 || pos>pArr->cnt + 1) //判斷要插入的位置是否小於1 或者大於有效陣列個數加一的(就是不連續的插入位置) 返回false
return false;
for (i = pArr->cnt - 1; i >= pos - 1; --i)//插入資料時從最後一個開始到pos-1陣列的位置向後面移動一個位置
{
pArr->pBase[i + 1] = pArr->pBase[i];//pos位置之後的向後移動一個位置
}
pArr->pBase[pos - 1] = val; //插入新增的資料
(pArr->cnt)++; //有效個數加一
}
bool delete_arr(struct Arr *pArr, int pos, int *pVal) {
int i;
if (is_empty(pArr))
return false;//指標為空
if (pos<1 || pos > pArr->cnt)
return false;//沒有這個位置
*pVal = pArr->pBase[pos - 1];//賦值給pVal
for (i = pos; i<pArr->cnt; ++i)
{
pArr->pBase[i - 1] = pArr->pBase[i];//pos位置之後的向前移動一個位置
}
(pArr->cnt)--; //刪除一個元素後有效個數減去一個
return true;
}
bool append_arr(struct Arr *pArr, int val)//追加,可能成功,可能失敗
{
//滿時返回false
if (is_full(pArr))
return false;
//不滿時追加
pArr->pBase[pArr->cnt] = val;
(pArr->cnt)++;
return true;
}
bool is_full(struct Arr *pArr)//是否滿了
{
if (pArr->cnt == pArr->len) {
printf("%s\n", "當前分配的陣列長度已滿");
return true;
}
else
{
return false;
}
}
void show_arr(struct Arr *pArr)//顯示
{
// if(陣列為空)
// 提示使用者陣列為空
// else
// 輸出陣列有效內容
if (is_empty(pArr)) //
{
printf("陣列為空!\n");
}
else
{
for (int i = 0; i<pArr->cnt; i++)
printf("%d\n", pArr->pBase[i]);
printf("\n");
}
}
bool is_empty(struct Arr *pArr)//是否為空
{
if (0 == pArr->cnt)
return true;
else
return false;
}
void init_arr(struct Arr *pArr, int length) {
//分配初始化陣列
pArr->pBase = (int*)malloc(sizeof(int)*length);
if (NULL == pArr->pBase)
{
printf("free error 動態記憶體分配失敗!\n");
exit(-1);//終止整個程式
}
else
{
pArr->len = length;
pArr->cnt = 0;
printf("free 動態記憶體分配成功!\n");
}
return;
}