#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語言,但別人還是會問你關於數據結構的內容。其實,做嵌入式開發,對編程的要求也是蠻高的。如果是軟件開發崗,那數據結構和算法更是沒得跑。編程語言只是達到目標的一種手段,數據結構和算法纔是核心競爭力。