1. 程式人生 > >C語言實現List的資料結構(很詳細的註釋)

C語言實現List的資料結構(很詳細的註釋)

  • 新建一個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; }