数组插入,删除,增加,排序等程序
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Arr { int * pBase;//保存数组第一个元素的地址 int len;//数组的长度 int cnt;//数组的有效个数 }Array; typedef int bool; #define true 0 #define false 1 void init_arr(Array *);//数组初始化 void show_arr(Array *);//输出 bool is_empty(Array *);//判断是否为空 bool is_full(Array *);//判断是否为满 bool append_arr(Array *, int);//追加数组 bool insert_arr(Array *, int, int);//插入数组 bool delete_arr(Array *, int); void sort(Array *, int, int);//数组快排 void sort2(Array *);//数组冒泡排序 void invision(Array *);//数组倒置 int main(void) { Array arr; printf("请输入数组的长度:"); scanf("%d",&arr.len); printf("\n"); init_arr(&arr); show_arr(&arr); append_arr(&arr,49); append_arr(&arr,38); append_arr(&arr,76); append_arr(&arr,54); append_arr(&arr,97); append_arr(&arr,20); append_arr(&arr,19); append_arr(&arr,66); printf("------------------------------------追加数组------------------------------------\n"); printf("\n"); show_arr(&arr); printf("\n"); printf("------------------------------------插入数组------------------------------------\n"); printf("\n"); insert_arr(&arr,2,88); insert_arr(&arr,3,99); show_arr(&arr); printf("------------------------------------快速排序------------------------------------\n"); printf("\n"); sort(&arr,0,arr.cnt-1); show_arr(&arr); printf("------------------------------------冒泡排序------------------------------------\n"); printf("\n"); sort2(&arr); show_arr(&arr); printf("------------------------------------倒置数组------------------------------------\n"); printf("\n"); invision(&arr); show_arr(&arr); printf("------------------------------------删除数组------------------------------------\n"); printf("\n"); delete_arr(&arr,3); show_arr(&arr); return 0; } void init_arr(Array * pArr) { pArr->pBase=(int *)malloc(sizeof(int)*pArr->len); if(pArr->pBase==NULL) { printf("内存分配失败!\n"); exit(-1); } else pArr->cnt=0; return; } bool is_empty(Array * pArr) { if(pArr->cnt==0) return true; else return false; } void show_arr(Array * pArr) { int i; if( !is_empty(pArr) ) printf("数组为空!\n"); else { for(i=0;i<pArr->cnt;++i) printf("%d\t",pArr->pBase[i]); } printf("\n"); return; } bool is_full(Array * pArr) { if(pArr->cnt>pArr->len-1) return false; else return true; } bool append_arr(Array * pArr,int val) { //pArr->pBase[0]=23;cnt=1; //pArr->pBase[1]=46;cnt=2; if( !is_full(pArr) ) { pArr->pBase[pArr->cnt]=val; ++pArr->cnt; //printf("cnt=%d\n",pArr->cnt); return true; } else { printf("数组已满,其余的无法追加!\n"); return false; } } bool insert_arr(Array * pArr, int pos, int val) { int i; if( is_full(pArr) ) return false; else { for(i=pArr->cnt-1;i>=pos-1;--i)//pos下标从1开始 { pArr->pBase[i+1]=pArr->pBase[i]; } pArr->pBase[pos-1]=val; ++pArr->cnt; return true; } } //快速排序 void sort(Array * pArr, int left, int right) { int i=left; int j=right; int key=pArr->pBase[left]; if(left>=right) return; while(i<j) { while(i<j && pArr->pBase[j]>key) --j; //temp=key; //key=pArr->pBase[j]; //pArr->pBase[j]=temp; pArr->pBase[i]=pArr->pBase[j]; while(i<j && key>pArr->pBase[i] ) ++i; pArr->pBase[j]=pArr->pBase[i]; } pArr->pBase[i]=key; sort(pArr,left,i-1); sort(pArr,i+1,right); } //冒泡排序 void sort2(Array * pArr) { int i,j,temp; for(i=0;i<pArr->cnt-1;++i)//i是排序多少次 { for(j=0;j<pArr->cnt-i-1;++j)//j是用来前后排序的 { if(pArr->pBase[j]>pArr->pBase[j+1]) { temp=pArr->pBase[j]; pArr->pBase[j]=pArr->pBase[j+1]; pArr->pBase[j+1]=temp; } } } } //倒置数组 void invision(Array * pArr) { int i=0; int j=pArr->cnt-1; int temp; while(i<j) { temp=pArr->pBase[i]; pArr->pBase[i]=pArr->pBase[j]; pArr->pBase[j]=temp; ++i; --j; } } bool delete_arr(Array * pArr, int pos)//pos下标从1开始 { int i; if(pos-1>=pArr->cnt) return false; for(i=pos-1;i<=pArr->cnt-1;++i) pArr->pBase[i]=pArr->pBase[i+1]; --pArr->cnt; return true; }