數據結構與算法(2)--數組和typedef的運用

1.模擬數組增刪改查的源碼

#include<stdio.h>
#include<stdlib.h>//包含了exit()函數
#include<malloc.h>
#include<windows.h>
struct Arr{       //定義了一個數據類型
	int *pBase;  //存儲的是數組第一個元素的地址
	int len; //數組所能容納的最大元素的個數
	int cnt; //當前數組有效元素的個數
};

void init_arr(struct Arr * pArr,int length);   //初始化
bool is_empty(struct Arr * pArr);
void show_arr(struct Arr * pArr);
bool append_arr(struct Arr * pArr,int val); //追加
bool is_full(struct Arr * pArr);
bool insert_arr(struct Arr * pArr,int pos,int val); //幫助文檔:1.各個參數的含義,2.返回的是什麼
bool delete_arr(struct Arr * pArr,int pos,int * pVal);
void inversion_arr(struct Arr * pArr);  //倒置
void sort_arr(struct Arr * pArr);  //排序


int main(void){
struct Arr arr;
int val;
init_arr(&arr,6);  //把一個arr的值賦給另一個arr
append_arr(&arr,1);
append_arr(&arr,3);
append_arr(&arr,4);
insert_arr(&arr,3,99);

if(delete_arr(&arr,4,&val)){
	printf("您刪除的元素是:");
	printf("%d\n",val);
}
show_arr(&arr);
inversion_arr(&arr);
printf("倒置:  ");
show_arr(&arr);
sort_arr(&arr);
printf("排序:  ");
show_arr(&arr);
return 0;
}
void init_arr(struct Arr * pArr,int length){

	(*pArr).len=99;
	pArr->pBase=(int *)malloc(sizeof(int)*length);//malloc返回的是第一個字節的地址,賦給pBase,pBase是整形的,剛好指向了前4個字節
if(NULL==pArr->pBase){              //pBase如果分配成功即爲有效內存地址,如果分配不成功(比如內存已滿),則會把NULL賦值給pBase
	printf("動態內存分配失敗!\n");
	exit(-1);
	}
	else{
	pArr->len=length;
	pArr->cnt=0;

	}
	return;
}
	bool is_empty(struct Arr * pArr){
	
		if(pArr->len==0)
			return true;
		else
			return false;

	}


	bool is_full(struct Arr * pArr){
	
if((*pArr).len==(*pArr).cnt)
return true;
	}

	void show_arr(struct Arr * pArr){
	
		int i;
		if(is_empty(pArr)==true)  {//show_arr中已將 &arr賦值給pArr,此時pArr中存放的已是&arr,所以可以直接將pArr賦值傳入is_empty();
		printf("數組爲空!\n");
		}
			for(i=0;i<=pArr->cnt;i++){
   printf("show_arr=%d  ",(*pArr).pBase[i]);  //pBase存儲的是第一個元素的地址

			}
			printf("\n\n\n");
	}
	bool append_arr(struct Arr * pArr,int val){
		//int i;
	if(is_full(pArr)){
        pArr->pBase[pArr->cnt]=val;
		(pArr->cnt)++;
	}
	/*for(i=0;i<pArr->cnt;i++){
		
		printf("append_arr===%d\n",(*pArr).pBase[i]);  //pBase存儲的是第一個元素的地址
	}*/
	if(is_full(pArr)){
        return false;  //滿了就返回false
	}
	
	}
	bool insert_arr(struct Arr * pArr,int pos,int val){   //pos:插入的位置,從1開始算起;val:要插入的的數據
int i;
if(is_full(pArr)==true){
	printf("已滿,不可插入");
		return false;
}
if(pos<1||pos>pArr->cnt){
printf("請插入到正確位置");
	return false;

}
for(i=pArr->cnt-1;i>=pos-1  ;i--){
pArr->pBase[i+1]=pArr->pBase[i];
}
pArr->pBase[pos-1]=val;
return true;

	}
	bool delete_arr(struct Arr * pArr,int pos,int * pVal){
	int i;
		if(is_empty(pArr)==true){
printf("數組爲空,不可刪除");
return false;
		}
		if(pos<1||pos>(pArr->cnt)){
printf("超出界限了");
return false;
		}
		*pVal=pArr->pBase[pos-1];
		for(i=pos;i<pArr->cnt;i++){
pArr->pBase[i-1]=pArr->pBase[i];

		}
	pArr->cnt--;
	}
	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)-1;i++){          //冒泡排序
			for(j=0;j<(pArr->cnt)-1-i;j++){
				if(pArr->pBase[j]>pArr->pBase[j+1]){
t=pArr->pBase[j];
pArr->pBase[j]=pArr->pBase[j+1];
pArr->pBase[j+1]=t;

				}

			}
		}

return ;

	}

2.typedef的用法簡介

語法:typedef   類型名  別名;
如 typedef int p;   //int i=1; 等價於 p i=1;     
#include<stdio.h>
#include<string.h>
typedef	struct Student{  
		int sid;
	}* pSTU,STU;

int main(){
STU Stu;
pSTU STu=&Stu;
STu->sid=21;
STu->sex='m';
printf("%d\n",STu->sid);
return 0;
}


發佈了34 篇原創文章 · 獲贊 68 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章