陣列的應用—順序表簡化版.cpp
阿新 • • 發佈:2020-11-01
#include <stdio.h>
#include <stdlib.h>
//陣列的應用:順序表【線性表的一種儲存方式】 struct Arr { int * pBase; //儲存首地址 int len; //陣列的總長度 int cet; //cet: current efficient(當前有效元素的個數) }; void init_arr(struct Arr * pArr, int length); //init: initialize (初始化) void append_arr(struct Arr * pArr, int val); //向陣列中增加元素 bool insert_arr(struct Arr * pArr, int pos, int val); //順序表的插入 pos: position, pos的值從1開始 bool delete_arr(struct Arr * pArr, int pos, int * pVal); //順序表的刪除 void show_arr(struct Arr * pArr); //順序表的遍歷 int main() { struct Arr S; //建立順序表S: Sequence int val; int i; init_arr(&S, 10); //實現陣列的初始化 show_arr(&S); //實現輸出 for (i = 0; i < 10; i++) { scanf("%d", &val); append_arr(&S, val);//實現追加 } printf("新增元素後的陣列為:\n"); show_arr(&S); if(delete_arr(&S, 1, &val)) { printf("刪除成功! 您刪除的元素是:%d\n", val); } else { printf("刪除失敗!\n"); } printf("刪除元素後的陣列為:\n"); show_arr(&S); //實現輸出 printf("插入後的陣列為:\n"); insert_arr(&S, 1, 66); //insert_arr(&S, 6, 99); show_arr(&S); //實現輸出 return 0; }
/*——————————————————————————————————————————————————————*/ void init_arr(struct Arr * pArr, int length) //pArr = &S, *pArr = S { pArr->pBase = (int *)malloc(sizeof(int) * length); //動態分配陣列才可跨函式使用 if(NULL == pArr->pBase) { printf("動態記憶體分配失敗!"); exit(-1); //終止整個程式 } else { pArr->len = length; pArr->cet = 0; } return; //函式終止標誌 } /*——————————————————————————————————————————————————————*/ void append_arr(struct Arr * pArr, int val) { if(pArr->cet == pArr->len) //判斷陣列是否滿了 { return; //滿了結束此函式 } pArr->pBase[pArr->cet] = val; //不滿將變數val的內容加入 (pArr->cet)++; //表長加1,【cet總是比下標多1,cet可以作為要新增的下標】 } /*——————————————————————————————————————————————————————*/ void show_arr(struct Arr * pArr) { if(pArr->cet == 0) //判斷陣列是否為空 { printf("此時陣列是空的! 請新增資料元素\n"); } else { for(int i = 0; i<pArr->cet; i++) { printf("%d\t", pArr->pBase[i]); } printf("\n\n"); } } /*——————————————————————————————————————————————————————*/ bool insert_arr(struct Arr * pArr, int pos, int val)//pos是元素的位置,而不是下標的位置 { int i; //i是下標 if(pArr->cet == pArr->len) //判斷陣列是否滿了 { return false; } if(pos<1 || pos>pArr->cet+1) { return false; } for(i = pArr->cet-1; i>=pos-1; i--) //從最後一個元素迴圈到需要新增的元素 { pArr->pBase[i+1] = pArr->pBase[i]; //給需要新增的元素騰出一個位置 } pArr->pBase[pos-1] = val; (pArr->cet)++; //有效元素的個數增加了一個 return true; } /*——————————————————————————————————————————————————————*/ bool delete_arr(struct Arr * pArr, int pos, int * pVal) { int i; if(pArr->cet == 0) //判斷陣列是否為空 { return false; } if(pos<1 || pos>pArr->cet) { return false; } *pVal = pArr->pBase[pos-1]; //把需要刪除的值放到val中 for(i = pos; i<pArr->cet; i++) { pArr->pBase[i-1] = pArr->pBase[i]; } (pArr->cet)--; return true; }