您的位置:首页 > 其它

动态数组相关操作

2012-07-03 00:55 726 查看
/*

dynamics_array.cpp

动态数组相关操作

1.动态输入 2.插入 3.修改 4.删除 5.倒置 6.显示 7.排序

by adengou@foxmail.com

2012.6.30

dev c++ 5.0编译通过

*/

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

struct Arr

{

int *pBase;//动态申请内存

int *pExpBase;//扩展动态申请内存

int init_len;//数组默认长度

int cnt;// 数组有效个数

int add_init_len;//动态增数组长度

} ;

//数组初始化

void init_arr(struct Arr *pArr,int len) ;

// 向数组追加元素

bool append_arr(struct Arr *pArr,int val);

//插入元素

bool insert_arr(struct Arr *pArr,int pos,int val);

//修改

bool modify_arr(struct Arr *pArr,int pos,int val);

//删除元素

bool delete_arr(struct Arr *pArr,int pos,int *pval);

//得获元素

bool get(struct Arr *pArr,int pos,int *val);

//数组 为空

bool is_empty(struct Arr *pArr);

//数组已满

bool is_full(struct Arr *pArr);

//升序排列

void up_sort_arr(struct Arr *pArr);

//降序排列

void descen_sort_arr(struct Arr *pArr);

//显示数组内容

void show_arr(struct Arr *pArr);

//倒转数组

void inversion_arr(struct Arr *pArr);

//动态扩展数组

void expland_arr(struct Arr *pArr,int val);

int main(void){

struct Arr arr;

int del_val;

int del_pos;

int insert_pos;

int insert_val;

int append_val;

int modify_pos;

int modify_val;

printf(" 动态数组操作 \n");

printf(" ***************菜 单********************\n");

printf(" *** ****\n");

printf(" *** 1.数组初始化 2. 数组输入 ****\n");

printf(" *** 3.删除元素 4. 插入元素 ****\n");

printf(" *** 5.倒置元素 6. 数组长度 ****\n");

printf(" *** 7.显示数组 8. 升序排列 ****\n");

printf(" *** 9.降序排列 0.修改数组 ****\n");

printf(" *** Q.退出程序 ****\n");

printf(" *** ****\n");

printf(" **********默认数组长度为O*************\n");

init_arr(&arr,0);//默认初始化数组

while(1)

{

switch(getchar())

{

case '1':

printf("请输入初始化数组长度:");

scanf("%d",&arr.init_len);

init_arr(&arr,arr.init_len);

printf("成功设置数组初始化长度为:%d\n",arr.init_len);

break;

//

case '2':

printf("请输入数组(以小写q结束):");

while(1)

{

scanf("%d",&append_val);

if(getchar()=='q')

break;

arr.add_init_len++;

append_arr(&arr,append_val);

}

printf("当前数组长度为:%d\n",arr.init_len);

//

show_arr(&arr);

//

break;

//

case '3':

//

printf("请输入删除数组位置:");

scanf("%d",&del_pos);

if( delete_arr(&arr,del_pos,&del_val))

{

printf("删除成功!\n");

printf("你删除的元素是:%d\n",del_val);

}

else{

printf("删除不成功\n");

}

show_arr(&arr);

//

break;

//

case '4':

//

printf("输入插入数组位置:");

scanf("%d",&insert_pos);

printf("输入插入数组值:");

scanf("%d",&insert_val);

if(!insert_arr(&arr,insert_pos,insert_val))

{

printf("插入不成功\n");

}

show_arr(&arr);

break;

case '5':

printf("倒转数组:");

inversion_arr(&arr);

show_arr(&arr);

break;

//

case '6':

if(!is_empty(&arr))

printf("当前数组长度是:%d\n",arr.init_len);

else

printf("当前数组为空\n");

break;

//

case '7':

// printf("当前数组是:");

show_arr(&arr);

break;

//

case '8':

printf("升序:");

up_sort_arr(&arr);

show_arr(&arr);

break;

//

case '9':

printf("降序:");

descen_sort_arr(&arr);

show_arr(&arr);

break;

case '0':

printf("输入修改数组的位置:");

scanf("%d",&modify_pos);

printf("输入修改数组的值:");

scanf("%d",&modify_val);

if(!modify_arr(&arr,modify_pos,modify_val))

{

printf("修改不成功\n");

}

show_arr(&arr);

break;

//

case 'Q':

exit(0);

break;

//

default:break;

}

}

system("pause");

return 0;

}

void init_arr(struct Arr *pArr,int len)

{

pArr->pBase=(int *)malloc(sizeof(int)*len);

if(NULL==pArr->pBase)

{

printf("动态内存分配失败\n");

system("pause");

exit(-1);

} else{

pArr->init_len=len;

pArr->cnt=0;

pArr->add_init_len=0;

}

return;

}

void expland_arr(struct Arr *pArr,int val)

{

pArr->pExpBase=(int *)malloc(sizeof(int)*val);

pArr->init_len=val;

pArr->pExpBase=pArr->pBase;

return ;

}

void show_arr(struct Arr *pArr)

{

if(is_empty(pArr))

printf("数组为空!\n");

else

printf("当前数组是(共 %d 个元素):",pArr->cnt);

for(int i=0;i<pArr->cnt;i++)

{

printf("%d ",pArr->pBase[i]);

}

printf("\n");

}

bool is_empty(struct Arr *pArr)

{

if(pArr->cnt==0)

return true;

else

return false;

}

bool is_full(struct Arr *pArr)

{

if(pArr->cnt<=pArr->init_len-1)

{

return false;

}

else

{

return true;

}

}

bool append_arr(struct Arr *pArr,int val)

{

if(is_full(pArr))

{

//动态扩展数组

expland_arr(pArr,pArr->add_init_len);

}

// return false;

pArr->pBase[pArr->cnt]=val;

(pArr->cnt)++;

return true;

}

bool insert_arr(struct Arr *pArr,int pos,int val)

{

if(is_full(pArr))

{

printf("数组满!");

return false;

}

if(pos<1||pos>pArr->init_len)

{

printf("位置越界!");

return false;

}

else{

for(int 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 modify_arr(struct Arr *pArr,int pos,int val)

{

if(is_empty(pArr))

{

printf("数组为空!");

return false;

}

if(pos<1||pos>pArr->init_len)

{

printf("位置越界!");

return false;

}

else

{

pArr->pBase[pos-1]=val;

return true;

}

}

//

bool delete_arr(struct Arr *pArr,int pos,int *pval)

{

if(is_empty(pArr)||pos<1||pos>pArr->cnt)

{

return false;

}

else

{

*pval=pArr->pBase[pos-1];

for(int i=pos;i<pArr->cnt;++i)

{

pArr->pBase[i-1]=pArr->pBase[i];

}

pArr->cnt--;

return true;

}

}

void inversion_arr(struct Arr *pArr)

{

int tVal;

int i=0;

int j=pArr->cnt-1;

if(is_empty(pArr))

printf("数组为空,倒转失败!\n");

else

while(i<j)

{

tVal=pArr->pBase[i];

pArr->pBase[i]=pArr->pBase[j];

pArr->pBase[j]=tVal;

i++;

j--;

}

}

void up_sort_arr(struct Arr *pArr)

{

int tempVal=0;

if(is_empty(pArr))

{

printf("数组为空\n");

}

else{

for(int i=0;i<pArr->cnt;i++)

{

for(int j=i+1;j<pArr->cnt;j++)

{

if(pArr->pBase[i]>pArr->pBase[j])

{

tempVal=pArr->pBase[i];

pArr->pBase[i]=pArr->pBase[j];

pArr->pBase[j]=tempVal;

}

}

}

}

}

void descen_sort_arr(struct Arr *pArr)

{

int tempVal=0;

if(is_empty(pArr))

{

printf("数组为空\n");

}

else{

for(int i=0;i<pArr->cnt;i++)

{

for(int j=i+1;j<pArr->cnt;j++)

{

if(pArr->pBase[i]<pArr->pBase[j])

{

tempVal=pArr->pBase[i];

pArr->pBase[i]=pArr->pBase[j];

pArr->pBase[j]=tempVal;

}

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: