數據結構(結構體定義,typedef)
看了郝斌老師的數據結構,很有感觸,所以就想寫一個系列關於數據結構的文章——不論你是出於單純學習數據結構,還是出於爲考研數據結構的初試以及複試做準備的目的,我相信你都可以從本系列博文中獲益。
環境:windows xp(x86),vc++6.0
意圖:要想學好數據結構,那麼結構體、指針、typedef你一定要熟練的使用,所以博主在參考了郝斌老師的數據結構後,對他的練手程序進行了完善,希望能夠在正式開始數據結構的鏈表學習前,將基礎打好。
博主下面的程序主要是爲了上述的目的服務的,希望大家能夠獲益,也希望大家能夠給我留言、和我交流。
# include <stdio.h> # include <malloc.h> /* 簡單說明:模擬當初始數組滿時可以自增給定長度的int類型的數組 創作靈感:修改自郝斌老師數據結構,郝斌老師的int數組不能自增 作 者:leonard 書寫時間:2014年3月23日 */ typedef struct Arr { int *pBase;//指向int數組首地址的指針 int length;//當前的數組最大長度 int cnt;//當前的元素個數 int increment;//數組增長的步長 }Arr; void init_arr(Arr *arr,int len); void selfincrese_arr(Arr *arr);//當arr所指向的int類型數組滿是,自增給定的長度 bool append_arr(Arr *arr,int value);//將value直接追加到數組尾部 bool insert_arr(Arr *arr,int pos,int value);//將value添加到數組指定pos位置的後面,pos從0開始 bool delete_arr(Arr *arr,int pos, int *dvalue);//刪除數組指定pos位置上的數據,並將這個數據返回 bool isempty(Arr *arr); bool isfull(Arr *arr); void show_arr(Arr *arr);//順序打印int類型數組的所有元素 void inverse_arr(Arr *arr);//對指定數組的所有元素進行頭尾反轉 int main(void) { Arr arr; int dtemp; init_arr(&arr,6); append_arr(&arr,2); append_arr(&arr,5); append_arr(&arr,7); append_arr(&arr,4); append_arr(&arr,1); append_arr(&arr,10); append_arr(&arr,88); printf("插入之前的數組\n"); show_arr(&arr); insert_arr(&arr,3,99); printf("插入之後的數組\n"); show_arr(&arr); printf("刪除一個元素之後的數組\n"); delete_arr(&arr,5,&dtemp); printf("刪除的數據爲%d\n",dtemp); show_arr(&arr); inverse_arr(&arr); printf("數組反轉後\n"); show_arr(&arr); return 0; } void init_arr(Arr *arr,int len) { if(arr->pBase = (int *)malloc(sizeof(int)*len)) { printf("數組初始化成功...\n"); arr->length = len; arr->increment = 5; arr->cnt=0; } else printf("動態分配內存失敗...\n"); } bool isfull(Arr *arr) { if(arr->length==arr->cnt) return true; else return false; } bool isempty(Arr *arr) { if(0==arr->cnt) return true; else return false; } void show_arr(Arr *arr) { for(int i=0;i<arr->cnt;i++) { printf("a[%d]=%d\n",i,arr->pBase[i]); } printf("\n"); } //將int型數組指向的內存按照事先的約定擴大 void selfincrese_arr(Arr *arr) { int *temp = (int *)malloc(sizeof(int)*arr->length); for(int j = 0;j<arr->length;j++) { *(temp+j) = arr->pBase[j]; } arr->pBase = (int *)malloc(sizeof(int)*(arr->length+=arr->increment)); for(int k = 0;k<arr->length;k++) { arr->pBase[k] = *(temp+k); } } //在數組尾部直接插入新元素 bool append_arr(Arr *arr,int value) { if(isfull(arr)) { selfincrese_arr(arr); printf("初始數組已滿,現已添加了%d個空白位置,最大元素個數已擴充至%d\n",arr->increment,arr->length); append_arr(arr,value); } else { arr->pBase[arr->cnt] = value; (arr->cnt)++; } return true; } //在pos位置的後面加入一個值爲value的元素,pos從0開始 bool insert_arr(Arr *arr,int pos,int value) { if(pos<0||pos>arr->length||pos>arr->cnt) { printf("無法完成插入,因爲位置參數不正確!\n"); return false; } else { for(int l = arr->cnt;l>=pos+1;l--) { arr->pBase[l] = arr->pBase[l-1]; } arr->pBase[pos+1] = value; (arr->cnt)++; return true; } } //刪除pos位置上的那個元素,並將刪除位置上元素的值返回pos從0開始 bool delete_arr(Arr *arr,int pos, int *dvalue) { *dvalue = arr->pBase[pos]; for(int m =pos;m<arr->cnt;m++) { arr->pBase[m] = arr->pBase[m+1]; } arr->cnt--; return true; } //對指定的int類型數組進行反轉 void inverse_arr(Arr *arr) { int p=0,q=arr->cnt-1,itemp; while(p<q) { itemp = arr->pBase[q]; arr->pBase[q] = arr->pBase[p]; arr->pBase[p]=itemp; p++,q--; } }