數據結構之數組創建及操作

功能:數組的創建及基本操作函數

運行環境:VS2010

參考:郝斌老師的數據結構視頻



#include <stdio.h>

#include <malloc.h>//malloc()
#include <stdlib.h>//exit(-1)

//結構體類型   複合數據類型
struct Arr{
	int * pBase;//array 的第一個元素地址
	int len;//數組最大長度
	int cnt;//當前數組有效元素的個數
};
void init_arr(struct Arr *pArr,int length);//初始化
void show_arr(struct Arr *pArr);//遍歷元素
bool append_arr(struct Arr *pArr,int val);//追加
bool insert_arr(struct Arr *pArr,int pos,int val);//插入
bool delete_arr(struct Arr *pArr,int pos);//刪除
void get(struct Arr *pArr,int element);		//得到元素
bool is_empty(struct Arr *pArr);//判斷爲空
bool is_full(struct Arr *pArr);//判斷爲滿
void sort_arr(struct Arr *pArr);//排序
void inversion_arr(struct Arr *pArr);//倒置

int main()
{
	struct Arr arr;//定義結構體Arr類型  的變量
	int length;
	printf("請輸入要創建數組的長度\n");
	scanf("%d",&length);
	init_arr(&arr,length);
	printf(" The array addr is %p \n the length is %d\n 有效元素是%d\n",arr.pBase,arr.len,arr.cnt);//數組的初始地址
	show_arr(&arr);
	is_full(&arr);
	append_arr(&arr,10);
	append_arr(&arr,20);
	append_arr(&arr,25);
	append_arr(&arr,4);
	insert_arr(&arr,3,1000);
	/*
	if(!append_arr(&arr,5))
	{
		printf("append failed out of the length\n");
	}
	else
	{
		printf("append  success\n");
	}
	*/
	//delete_arr(&arr,2);
	//inversion_arr(&arr);
	show_arr(&arr);
	get(&arr,3);
	sort_arr(&arr);
	show_arr(&arr);
	return 0;
}

void init_arr(struct Arr *pArr,int length)
{
	pArr->pBase=(int *)malloc(sizeof(int)*length);
	if(NULL==pArr->pBase)
	{
		printf("申請內存失敗\n");
		exit(-1);
	}
	else
	{
		pArr->len=length;
		pArr->cnt=0;
	}
}

bool is_empty(struct Arr *pArr)//判斷爲空   爲空爲真,否則爲假
{
	if(0==pArr->cnt)
	{
		printf("【is_empty】The array is empty\n");
		return true;
	}
	else
	{
		printf("【is_empty】The array is not empty\n");
		return false;
	}
	
}
void show_arr(struct Arr *pArr)
{
	if(is_empty(pArr))
	{
		printf("【show_arr】The array is empty can not show\n");
	}
	else
	{
		for(int i=0;i<pArr->cnt;i++)
		{
			printf("【show_arr】arr[%d] = %d\n",i,pArr->pBase[i]);//我準備寫成 【*(pArr+i) 或者pArr[i]】重點
		}
	}
}

bool is_full(struct Arr *pArr)
{
	if(pArr->cnt==pArr->len)
	{
		printf("【is_full】The array is full\n");
		return true;
	}
	else
	{
		printf("【is_full】The array is not full.you can add elenment \n");
		return false;
	}
}

bool append_arr(struct Arr *pArr,int val)
{
	if(is_full(pArr))
	{
		printf("【append_arr】The array length is %d and it is full can not append\n",pArr->len);
		return false;
	}
	else
	{
		
		*(pArr->pBase+pArr->cnt)=val;//pArr->pBase[pArr->cnt];
		pArr->cnt++;
		return true;
	}

}
void get(struct Arr *pArr,int element)//得到第幾個元素
{
	printf("【get】The element is %d\n",pArr->pBase[element-1]);
}

bool insert_arr(struct Arr *pArr,int pos,int val)//插入  向第pos個元素中插入val值
{
	//特殊情況1 不能插入的情況
	if(is_full(pArr))
		return false;
	//特殊情況2 不能隨意插入,位置不能大於有效數組元素個數
	if(pos<1||pos>pArr->cnt+1)
		return false;
	for(int i=pArr->cnt-1;i>=pos-1;i--)
	{
		pArr->pBase[i+1]=pArr->pBase[i];
	}
	pArr->pBase[pos-1]=val;//向pos位置放入val值
	pArr->cnt++;
	return true;
}

bool delete_arr(struct Arr *pArr,int pos)//刪除第pos個元素
{
	//特殊情況 爲空不能刪除
	if(is_empty(pArr))
		return false;
	if(pos<1||pos>pArr->cnt)
		return false;
	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 i=0;
	int j=pArr->cnt-1;
	while(i<j)
	{
		int temp;
		temp=pArr->pBase[i];
		pArr->pBase[i]=pArr->pBase[j];
		pArr->pBase[j]=temp;
		i++;
		j--;
	}
}


void sort_arr(struct Arr *pArr)
{
	int i,j,t;
	for(i=0;i<pArr->cnt;++i)
	{
		for(j=i+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;
			}
		}
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章