資料結構:順序表的基本操作和還原
阿新 • • 發佈:2018-12-10
實現順序表的基本操作
三、實驗內容
定義順序表(可用結構體實現)、所需要的符號常量以及在該順序表上所進行的操作(用函式實現)初始化、插入新元素、刪除指定元素、查詢(返回指定元素位置)、檢索指定位置的元素。
要求:1、在主函式中呼叫各個函式實現相應操作,首先定義順序表物件L,呼叫函式對順序表進行初始化,再通過多次插入方式動態建立一個長度為10的順序表(可通過在迴圈中呼叫插入函式來實現。之後再進行刪除、查詢、檢索指定元素操作。
2、事先寫出演算法和程式,並加上相應註釋。
3、主函式中可通過輸出語句實現友好提示操作。
4、具體設計結果參考如下圖所示:
根據上面這些實驗要求,我結合郝斌老師資料結構視訊上的程式碼,完成了這次作業。
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAXSIZE 10 struct Arr { int * pBase; //儲存的是陣列第一個元素的地址 int len; //陣列所能容納的最大元素的個數 int cnt; //當前陣列有效元素的個數 }; void init_arr(struct Arr *pArr, int length); //建立順序表 bool append_arr(struct Arr * pArr); //輸入數值 void show_arr(struct Arr * pArr); //輸出 bool delete_arr(struct Arr * pArr, int pos, int * pVal); //刪除 bool insert_arr(struct Arr * pArr, int pos, int val); //插入 注:pos為第pos個數 bool search_val(struct Arr * pArr, int pos); bool search_pos(struct Arr * pArr, int val); int main (void) { Arr arr; int val; //臨時存放輸入的值 int pos; init_arr(&arr, MAXSIZE); //建立長度存放10個整型數的順序表 for(int i = 1; i <= 10; i++){ //向表中新增值 printf("please input the %d th list elme:", i); append_arr(&arr); } printf("表長為:%d\n", MAXSIZE); //顯示錶長 show_arr(&arr); delete_arr(&arr, pos, &val); show_arr(&arr); insert_arr(&arr, pos, val); show_arr(&arr); search_val(&arr, pos); search_pos(&arr, val); return 0; } void init_arr(struct Arr *pArr, int length) { length = MAXSIZE; pArr->pBase = (int *)malloc(sizeof(int) * length); //建立動態陣列 pArr->cnt=0; //給cnt初始化 return; } bool append_arr(struct Arr * pArr) { int val; scanf("%d", &val); //輸入val值 pArr->pBase[pArr->cnt] = val; //val賦值給動態陣列中的儲存單元 (pArr->cnt)++; //cnt的最終結果為 MAXSIZE = 10 return true; } void show_arr(struct Arr * pArr) { for (int j = 0; j < pArr->cnt; j++){ printf("%d ", pArr->pBase[j]); } //for迴圈輸出 printf("\n"); } bool delete_arr(struct Arr * pArr, int pos, int * pVal) { if(pos < 1 || pos > pArr->cnt) { //位置pos小於1或大於cnt均無效 printf("無效位置\n"); return false; } printf("請輸入刪除元素的位置:"); scanf("%d", &pos); *pVal = pArr->pBase[pos-1]; //pos-1為該數的下標 for (int i=pos; i < pArr->cnt; ++i){ pArr->pBase[i-1] = pArr->pBase[i]; //前移一位 } pArr->cnt--; //有效位數減1 printf("刪除的位置:%d\n", pos); printf("刪除元素的值為:%d\n", *pVal); printf("刪除後的表: "); return true; } bool insert_arr(struct Arr * pArr, int pos, int val) { if(pos < 1 || pos > pArr->cnt) { //位置pos小於1或大於cnt均無效 printf("無效位置\n"); return false; } printf("請輸入插入元素的位置:"); scanf("%d", &pos); printf("請輸入插入元素的值:") ; scanf("%d", &val); for(int i = pArr->cnt-1;i >= pos-1; i-- ){ //只能從後往前 pArr->pBase[i+1] = pArr->pBase[i]; } pArr->pBase[pos-1] = val; (pArr->cnt)++; printf("插入以後的表:"); return true; } bool search_val(struct Arr * pArr, int pos) { if(pos < 1 || pos > pArr->cnt) { //位置pos小於1或大於cnt均無效 printf("無效位置\n"); return false; } printf("要檢索的元素的位置:"); scanf("%d", &pos); printf("該元素的值為:%d\n", pArr->pBase[pos-1]); return true; } bool search_pos(struct Arr * pArr, int val) { printf("要查詢的元素值為:"); scanf("%d", &val); printf("查詢成功,元素位置為:"); for(int i = 0; i < pArr->cnt; i++){ //如果多個位置上有val呢??? if(val == pArr->pBase[i]){ printf("%d ", i+1); } } return true; }
編譯執行都通過了,也達到了題目的要求,不知道還有沒有其他的問題。
下面附上郝斌老師資料結構視訊上的程式碼
# include <stdio.h> # include <malloc.h> //包含了malloc函式 # include <stdlib.h> //包含了exit函式 //定義了一個數據型別,該資料型別的名字叫做struct Arr, 該資料型別含有三個成員,分別是pBase, len, cnt struct Arr { int * pBase; //儲存的是陣列第一個元素的地址 int len; //陣列所能容納的最大元素的個數 int cnt; //當前陣列有效元素的個數 }; void init_arr(struct Arr * pArr, int length); //分號不能省 bool append_arr(struct Arr * pArr, int val); //追加 bool insert_arr(struct Arr * pArr, int pos, int val); // pos的值從1開始 bool delete_arr(struct Arr * pArr, int pos, int * pVal); int get(); bool is_empty(struct Arr * pArr); bool is_full(struct Arr * pArr); void sort_arr(struct Arr * pArr); void show_arr(struct Arr * pArr); void inversion_arr(struct Arr * pArr); int main(void) { struct Arr arr; int val; init_arr(&arr, 6); show_arr(&arr); append_arr(&arr, 1); append_arr(&arr, 10); append_arr(&arr, -3); append_arr(&arr, 6); append_arr(&arr, 88); append_arr(&arr, 11); if ( delete_arr(&arr, 4, &val) ) { printf("刪除成功!\n"); printf("您刪除的元素是: %d\n", val); } else { printf("刪除失敗!\n"); } show_arr(&arr); inversion_arr(&arr); printf("倒置之後的陣列內容是:\n"); show_arr(&arr); sort_arr(&arr); show_arr(&arr); //printf("%d\n", arr.len); return 0; } void init_arr(struct Arr * pArr, int length) { pArr->pBase = (int *)malloc(sizeof(int) * length); if (NULL == pArr->pBase) { printf("動態記憶體分配失敗!\n"); exit(-1); //終止整個程式 } else { pArr->len = length; pArr->cnt = 0; } return; } bool is_empty(struct Arr * pArr) { if (0 == pArr->cnt) return true; else return false; } bool is_full(struct Arr * pArr) { if (pArr->cnt == pArr->len) return true; else return false; } void show_arr(struct Arr * pArr) { if ( is_empty(pArr) ) { printf("陣列為空!\n"); } else { for (int i=0; i<pArr->cnt; ++i) printf("%d ", pArr->pBase[i]); //int * printf("\n"); } } 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 insert_arr(struct Arr * pArr, int pos, int val) { int i; if (is_full(pArr)) return false; if (pos<1 || pos>pArr->cnt+1) // return false; for (i=pArr->cnt-1; i>=pos-1; --i) { pArr->pBase[i+1] = pArr->pBase[i]; } pArr->pBase[pos-1] = val; (pArr->cnt)++; return true; } 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]; for (i=pos; i<pArr->cnt; ++i) { pArr->pBase[i-1] = pArr->pBase[i]; } pArr->cnt--; return true; } void inversion_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) { 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; } } } }