鏈表——數組實現

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct ARR
{
	int * pbase;							//數據域 
	int len;								//數組長度 
	int cnt;								//有效個數 
}Arr,*parr;

void init(parr arr,int lengh);							//創建數組 
bool empty(parr arr);									//判空 
bool full(parr arr);									//判滿 
void show(parr arr);									//輸出 
bool append(parr arr,int val);							//追加 
bool insert(parr arr,int pos,int val);					//插入 
bool deletearr(parr arr,int pos,int *val);				//刪除 
void inversion(parr arr);								//倒置 
void sortarr(parr arr);									//排序 

int main (void)
{
	parr  arr;
	arr = (parr)malloc(sizeof(Arr));					//爲指針分配空間 
	int val;
	init(arr,6);
	show(arr);
	append(arr,1); 
	append(arr,2); 
	append(arr,3); 
	append(arr,4); 
	if (deletearr(arr,1,&val))
	{
		printf ("刪除成功\n");
		printf ("您刪除的元素是:%d\n",val);
	}
	else
	printf ("刪除失敗");
	
	
	show(arr);
	inversion(arr);
	printf ("倒置後的數字內容是:\n");
	show(arr);
	sortarr(arr);
	show(arr);
	
	
	return 0;
}

void init(parr arr,int lengh)
{
	arr->pbase = (int *)malloc(sizeof(int)*lengh);						//爲數組分配空間 
	if (arr->pbase == NULL)
	exit(-1);
	arr->len = lengh;
	arr->cnt = 0;
	return;
}

bool empty(parr arr)
{
	if (0 == arr->cnt)
	return true;
	else
	return false;
}

bool full(parr arr)
{
	if (arr->cnt == arr->len)
	return true;
	else
	return false;
}

void show(parr arr)
{
	int i;
	if (empty(arr))
	printf ("數組爲空\n");
	else
	{
		for (i=0;i<arr->cnt;++i)
		printf ("%d ",arr->pbase[i]);
		
		printf ("\n");
	}
}

bool append(parr arr,int val)
{
	if (full(arr))
	return false;
	else
	{
		arr->pbase[arr->cnt] = val;
		++(arr->cnt);
		return true;
	}
}

bool insert(parr arr,int pos,int val)
{
	int i;
	if (full(arr))
	return false;
	
	if (pos<1 || pos>arr->cnt+1)
	return false;
	
	for (i=arr->cnt+1;i >= pos-1;--i)								//指定位置之後的元素後移一位 
	{
		arr->pbase[i+1] = arr->pbase[i];
	}
	arr->pbase[pos-1] = val;
	++arr->cnt;
	
	return true;
}

bool deletearr(parr arr,int pos,int *val)
{
	int i;
	if (empty(arr))
	return false;
	
	if (pos<1 || pos>arr->cnt)
	return false;
	
	*val = arr->pbase[pos-1];
	for (i=pos;i<arr->cnt;++i)									//指定位置之後的元素前移一位 
	arr->pbase[i-1] = arr->pbase[i];
	
	--arr->cnt;
	return true;
}

void inversion(parr arr)
{
	int i=0;
	int j = arr->cnt-1;
	int t;
	while(i<j)
	{
		t = arr->pbase[i];
		arr->pbase[i] = arr->pbase[j];
		arr->pbase[j] = t;
		++i;
		--j;
	}
	return;
}

void sortarr(parr arr)
{
	int i,j,t;
	for (i=0;i<arr->cnt-1;++i)
	{
		for (j=i+1;j<arr->cnt;++j)
		{
			if (arr->pbase[i] >= arr->pbase[j])
			{
				t = arr->pbase[i];
				arr->pbase[i] = arr->pbase[j];
				arr->pbase[j] = t;
			}
		}
	}
}

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