# 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;

}

}

}

}