数据结构_P11

来源:互联网 发布:c语言windows窗口程序 编辑:程序博客网 时间:2024/06/11 10:55
# include <stdio.h># include <stdlib.h># include <malloc.h>/**数组:自己做一套数组相关的方法(插入、删除等操作功能)*2016年6月7日14:08:06 - 2016年6月7日20:32:52*/struct Arr//定义了一个数据类型,名字叫Arr,该数据类型含有三个成员{int *pBase;//数组头结点指针int len;//数组长度intcnt;//数组当前有效个数};void init_arr(struct Arr*, int);//初始化bool append_arr(struct Arr*, int);//尾部追加,返回是否成功追加bool insert_arr(struct Arr*, int pos, int val);//注:这里定义pos从1开始,插入的值在pos值元素之前void delete_arr(struct Arr*, int pos);//删除成功与否要返回,同时把删除的元素输出int get();//获取数组中特定下标的值bool is_empty(struct Arr*);//判断数组是否为空bool is_full(struct Arr*);//判断数组是否为满void sort_arr(struct Arr*);//数组排序:这里练习冒泡排序(递增)void show_arr(struct Arr*);//输出显示数组bool inversion_arr(struct Arr*);//倒置数组int main(void){struct Arr arr;//定义一个数据类型Arr的变量arr,现在已经分配了内存,但是没有初始化,里面是垃圾值,也没有逻辑上的数组init_arr(&arr, 6);//初始化后,arr成员中的pBase将指向一个整型数组头结点,数组生成,当前有效个数应该为零//show_arr(&arr);append_arr(&arr, 3);append_arr(&arr, 4);append_arr(&arr, 5);append_arr(&arr, 6);//append_arr(&arr, 6);//append_arr(&arr, 5);if(append_arr(&arr, 111))  //在用一个函数方法时,这样写更便于看到函数调用的情况printf("追加成功!\n");elseprintf("追加失败!\n");show_arr(&arr);if( insert_arr(&arr, 4, 542))printf("插入成功!\n");elseprintf("插入失败!\n");show_arr(&arr);delete_arr(&arr, 2);show_arr(&arr);if( inversion_arr(&arr) ){printf("倒置成功!\n倒置后的数组为:");show_arr(&arr);}elseprintf("倒置失败!\n");sort_arr(&arr);printf("排序后的数组为: ");show_arr(&arr);return 0;}void init_arr(struct Arr* pArr, int length){//pArr->len = 99;  //注意指针是这样访问成员的,不是用'.';前面也没有*//(*pArr).len = 100;  //也可以这样pArr->pBase = (int*)malloc(sizeof(int) * length);if (NULL == pArr->pBase)    //如果内存满了,malloc申请失败,会把NULL赋给pBase{printf("动态内存分配失败!");exit(-1);//终止整个程序,需要加头文件stdlib.h}else{pArr->len = length;pArr->cnt = 0;}return;//这里的return表示一个函数在这里编写完成,方便别人阅读,不代表其他意义}bool is_empty(struct Arr* pArr){if(pArr->cnt == 0)return true;elsereturn false;}bool is_full(struct Arr* pArr){if(pArr->cnt == pArr->len)return true;elsereturn false;}void show_arr(struct Arr* pArr){if(is_empty(pArr)){printf("当前数组为空!\n");}else{printf("数组长度为: %d, 当前有效个数为: %d\n", pArr->len, pArr->cnt);for(int i=0; i<pArr->cnt; i++){printf("%d ", pArr->pBase[i]);}printf("\n");}}bool append_arr(struct Arr* pArr, int val){if( !is_full(pArr) ){pArr->pBase[pArr->cnt] = val;pArr->cnt++;return true;}elsereturn false;}bool insert_arr(struct Arr* pArr, int pos, int val){if(pos<1 || pos>pArr->len || is_full(pArr))return false;else{for(int j=pArr->cnt; j>=pos; j--){pArr->pBase[j] = pArr->pBase[j-1];}pArr->pBase[pos-1] = val;pArr->cnt++;return true;}}void delete_arr(struct Arr* pArr, int pos){if( is_empty(pArr) || pos<1 || pos > pArr->cnt )printf("删除失败!\n");else{printf("删除成功!\n");printf("删除的数为: %d\n", pArr->pBase[pos-1]);for(int y=pos; y<pArr->cnt; y++){pArr->pBase[y-1] = pArr->pBase[y];}pArr->cnt--;}}bool inversion_arr(struct Arr* pArr){if( is_empty(pArr) || pArr->cnt<2 )return false;else{int p;int j = pArr->cnt;for(int i=1; i<=(pArr->cnt/2); i++){p = pArr->pBase[i-1];pArr->pBase[i-1] = pArr->pBase[j-1];pArr->pBase[j-1] = p;j--;}return true;}}void sort_arr(struct Arr* pArr)//冒泡排序:每次把最小数放到数组最前面{int i;int j = pArr->cnt;int temp;for(i=0; i<j-1; i++){for(int p=i+1; p<=j-1; p++){if(pArr->pBase[p] < pArr->pBase[i]){temp = pArr->pBase[i];pArr->pBase[i] = pArr->pBase[p];pArr->pBase[p] = temp;}}}}

0 0