C語言實現線性數據結構中的數組

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

struct Arr{
	int * pBase;//數組中第一個元素的地址 
	int len;//數組的長度 
	int cnt;//當前數組中有效元素的個數 
}; 

//函數原型的聲明 
void InitArr(struct Arr *pArr,int length);//初始化數組 
void ShowArr(struct Arr *pArr); //輸出數組
bool IsEmpty(struct Arr *pArr);//判斷數組是否爲空
bool IsFull(struct Arr *pArr);//判斷數組是否爲滿
bool Append(struct Arr *pArr,int val);//在數組的後面追加一個元素
bool Insert(struct Arr *pArr,int pos,int val);//向指定位置插入元素
bool Delete(struct Arr * pArr,int pos,int *pVal);//刪除數組中指定位置的元素並返回所刪除元素的值
void Inverse(struct Arr * pArr);//反轉數組  
void Sort(struct Arr * pArr);//對數組進行從小到大排序或者從大到小
//void Search();//查找數組中某個元素並返回其下標

int main()
{
	struct Arr arr;
	InitArr(&arr,6);//分配存儲6個整型的連續存儲空間 
	printf("初始化之後的數組:\n");
	ShowArr(&arr);// 此時數組爲空 
	Append(&arr,1);
	Append(&arr,2);
	Append(&arr,3);
	Append(&arr,4);
	printf("追加元素之後的數組:\n");
	ShowArr(&arr); //數組輸出爲:1 2 3 4 
	if(Insert(&arr,2,5)){//在第2個位置(從1開始計數)插入元素5
		printf("插入成功!\n");
	}
	printf("插入元素之後的數組:\n");
	ShowArr(&arr); //輸出結果爲:1 5 2 3 4
	int val;
	//函數返回類型爲bool,所以加一個if判斷 
	if(Delete(&arr,2,&val)){
		printf("刪除成功!\n");
		printf("刪除的元素爲:%d\n",val);
	}
	printf("刪除元素之後的數組:\n");
	ShowArr(&arr);//輸出爲:1 2 3 4 
	Inverse(&arr);
	printf("反轉之後的數組:\n");
	ShowArr(&arr); //輸出爲4 3 2 1 
	Sort(&arr);
	printf("排序後的數組爲:\n");
	ShowArr(&arr); 
	return 0;
 } 

void InitArr(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;
	}
} 

void ShowArr(struct Arr *pArr)//輸出數組
{
	//首先判斷數組是否爲空,若爲空,提示用戶
	if(IsEmpty(pArr))
		printf("數組爲空!\n");
	else{
		for(int i = 0;i < pArr->cnt;++i){
			printf("%d  ",pArr->pBase[i]);
		}
	printf("\n");
	return;
	} 
} 

bool IsEmpty(struct Arr *pArr)//判斷數組是否爲空
{
	if(pArr->cnt == 0)
		return true;
	else
		return false;
 } 

bool IsFull(struct Arr *pArr)//判斷數組是否爲滿
{
	if(pArr->cnt == pArr->len)
		return true;
	else
		return false;
}
 
bool Append(struct Arr *pArr,int val)//追加一個元素 
{
	if(IsFull(pArr))//如果數組滿,返回false 
		return false;
	pArr->pBase[pArr->cnt] = val;//好好理解一下 
	(pArr->cnt)++;
	return true;	
}

bool Insert(struct Arr * pArr,int pos,int val)//向數組中第i個位置插入一個值,三個參數:插入的數組、插入的位置和插入的元素 
{
	//判斷數組是否已滿
	if (IsFull(pArr)) 
		return false;
	//判斷插入位置是否合法
	if(pos > pArr->cnt + 1 || pos < 1)//pos是從1開始的,但是數組下標是從0開始的,不要混淆 
		return false;
	//進行插入操作(注:數組下標從0開始 ,訪問數組通過下標來進行) 
	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 Delete(struct Arr * pArr,int pos,int *pVal)//刪除數組中某一個元素 ,三個參數:刪除元素的數組,刪除的位置以及返回所刪除的元素(指針類型) 
{
	//判斷數組是否爲空 
	if (IsEmpty(pArr)) 
		return false;
	//判斷刪除的位置是否合法
	if(pos > pArr->cnt+1 || pos < 1)//pos是從1開始的,但是數組下標是從0開始的,不要混淆 
		return false;
	//進行刪除操作
	*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 Inverse(struct Arr * pArr)//反轉數組 
{
	int i = 0,j = pArr->cnt-1,temp;
	while(i < j){
		temp = pArr->pBase[i];
		pArr->pBase[i] = pArr->pBase[j];
		pArr->pBase[j] = temp;
		++i;
		--j;
	}
}

void Sort(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;
			}
		}
	}
}

運行的結果爲:

重新回顧數據結構,爲後面的刷題做好準備,數據結構是去年自學的,現在已經忘得差不多了。這個筆記主要是爲了方便自己溫習,也希望能夠對其他人提供一些幫助。所有大廠的面試,編程技能是一定會考查的。假如偏硬件,只接觸過C語言,但別人還是會問你關於數據結構的內容。其實,做嵌入式開發,對編程的要求也是蠻高的。如果是軟件開發崗,那數據結構和算法更是沒得跑。編程語言只是達到目標的一種手段,數據結構和算法纔是核心競爭力。

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