动态数组相关操作
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;
}
}
}
}
}
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;
}
}
}
}
}
相关文章推荐
- Scala坑三(数组相关操作)
- O-C中数组相关的操作
- JS的数组复制及字符串的相关操作
- php 数组的相关操作
- php扩展开发笔记(5)一些数组操作相关的宏和简单示例
- ASP动态网站建设之连接数据库相关操作
- Javascript中ECMAScript数组相关方法操作
- CAknPopupFieldText在表单中动态创建及动态增加数组列表的操作
- 复习下数组名的相关操作
- oc中可变数组和可变字符串相关操作
- 对象、对象数组、JSON、JSON数组的相关操作
- Scala坑三(数组相关操作)
- 对象、对象数组、JSON、JSON数组的相关操作
- Repeater 的操作,数据的显示,绑定,动态取控件中的值和Repeater1_ItemCommand事件的相关用法
- Scala学习(三)----数组相关操作
- PHP操作数组相关函数
- C# 哈希表结合动态数组的简单操作和应用
- jQuery 1.6 源码学习(六)——core.js[6]之jQuery对象/数组操作相关方法
- IOS NS 字符串 数组 字典 文件 动态 静态 操作
- 数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)