动态数组相关操作

来源:互联网 发布:数控加工螺纹的编程 编辑:程序博客网 时间:2024/06/04 19:11

/*
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;
                }
            }
        }
    }             
}