# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>//使用exit( -1 );需要定义的头文件
//定义了一个数据类型,没有定义变量
struct Arr
{
int *pBase;//存储的是数组第一个元素的地址
int len;//数组所能容纳的最大元素的个数
int cnt;//当前所在有效的个数
};
void init_arr( struct Arr *pArr, int length );//分号不能省
bool append_arr( struct Arr *pArr, int val );//追加
bool insert_arr( struct Arr *pArr, int pos, int val );//pos的值从1开始
bool delete_arr( struct Arr *pArr, int pos, int *pVal );
int get();
bool is_empty( struct Arr *pArr );
bool is_full( struct Arr *pArr );
void sort_arr( struct Arr *pArr );
void show_arr( struct Arr *pArr );
void inversion_arr( struct Arr *pArr );//倒置
int main( void )
{
struct Arr arr;
int val;
init_arr( &arr, 6 );//地址只占四个字节
show_arr( &arr );
append_arr( &arr, 1 );
append_arr( &arr, 2 );
append_arr( &arr, 3 );
append_arr( &arr, 4 );
if ( delete_arr( &arr, 1, &val ) )
{
printf("删除成功\n");
printf("你删除的元素是:%d\n", val);
}
else
printf("删除失败\n");
/*
append_arr( &arr, 2 );
append_arr( &arr, 3 );
append_arr( &arr, 4 );
append_arr( &arr, 5 );
insert_arr( &arr, 6, 99 );
append_arr( &arr, 6 );
append_arr( &arr, 7 );//这个也是追加不成功的,因为是只是分配了6个数
if( append_arr( &arr, 8 ) )
{
printf( "追加成功\n" );
}
else
{
printf( "追加失败\n" );
}
*/
show_arr( &arr );
inversion_arr( &arr );
printf("倒置之后的内容是:\n");
show_arr( &arr );
sort_arr( &arr ); //呜呜,这里哪里是出错了呢??
printf("排列\n");
show_arr( &arr );
//printf( " %d\n ", arr.len );
return 0;
}
void init_arr( struct Arr *pArr, int length )
{
pArr->pBase = ( int * )malloc( sizeof( int )*length );
//pArr->len = 99;
if( NULL == pArr->pBase )
{
printf( "动态内存分配失败!\n" );
exit( -1 );//终止整个程序
}
else
{
pArr->len = length;
pArr->cnt = 0;
}
return;
}
bool is_empty( struct Arr *pArr )
{
if( 0 == pArr->cnt )
{
return true;
}
else
return false;
}
bool is_full( struct Arr *pArr )
{
if( pArr->cnt == pArr->len )
return true;
else
return false;
}
void show_arr( struct Arr *pArr )
{
/*
if( 数组为空 )
提示用户数组为空
else
输出数组有效内容
*/
if( is_empty( pArr ) )
{
printf( "数组为空!\n" );
}
else
{
for( int i = 0; i < pArr->cnt; ++i )
printf( " %d ", pArr->pBase[i] );
printf( "\n" );
}
}
bool append_arr( struct Arr *pArr, int val )
{
//满时返回false
if( is_full( pArr ) )
return false;
//不满时追加
else
pArr->pBase[pArr->cnt] = val;
( pArr->cnt ) ++;
return true;
}
bool insert_arr( struct Arr *pArr, int pos, int val )
{
int i;
//第一中情况,数组里面全满时
if( is_full( pArr ) )
return false;
//第二种情况,数组里面不为满时
if( pos < 1 || pos > pArr->cnt + 1 )
return false;
//把原来的第pos的位置和之后的数都向前移动
for( i = pArr->cnt - 1; i >= pos - 1; --i )
{
pArr->pBase[i + 1] = pArr->pBase[i];
}
//把第pos位置插入新的值
pArr->pBase[pos - 1] = val;
( pArr->cnt ) ++;//个数加一
return true;
}
bool delete_arr( struct Arr *pArr, int pos, int *pVal )
{
int i;
if( is_empty( pArr ) )
return false;
if( pos < 1 || pos > pArr->cnt )
return false;
*pVal = pArr->pBase[pos - 1];
for( i = pos; i < pArr->cnt; ++i ) //cnt表示数组有效的个数
{
pArr->pBase[i - 1] = pArr->pBase[i]; //这里要前移一个数,所以上面的可以i <= pArr->cnt - 1
}
pArr->cnt --; //删除了一个数组个数,所以有效个数要相应的减一
return true;
}
void inversion_arr( struct Arr *pArr )
{
int i = 0;
int j = pArr->cnt - 1;
int t;
while( i < j )
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
++ i;
-- j;
}
return;
}
void sort_arr( struct Arr *pArr )
{
int i, j, t;
for( i = 0; i < pArr->cnt; ++i )
{
for( j = j + 1; j < pArr->cnt; ++ j )
{
if( pArr->pBase[i] > pArr->pBase[j] )
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
}
}
}
}