使用結構體實現連續儲存陣列增刪改查等各種操作

2021-08-17 19:37:07 字數 4067 閱讀 7039

這次主要是利用結構體實現乙個長度可變陣列的增刪改查等各個操作。因為這裡郝斌老師還沒講typedefy的使用,所以我也是跟著他使用了最原始的方法,乙個個敲,發現這樣敲下來,也給自己鞏固了很多淡忘的知識。

這裡是使用結構體arr來模擬這個陣列的,結構體arr中有三個成員變數,分別是陣列的首元素位址、當期陣列長度、當前陣列中有效元素個數

struct arr

;

這裡主要是實現了增加、插入、刪除、排序、倒置的功能。

增加:如果滿了則提示錯誤,返回false。成功則返回true

else

} 插入:將乙個值val插入到parr指向的結構體變數的陣列第pos個值的前面.如果該位置前面沒有值,或者該陣列滿了,均提示錯誤,返回false。如果插入成功返回true

bool insert_arr(struct arr* parr,int

pos,int val)

else

parr->pbase[pos-1] = val;

parr->cnt++;

return true;

}}

刪除:刪除parr指向的結構體變數的陣列第pos個的值,如果成功,將這個值放到pval指向的變數裡,返回true,如果陣列為空或者這個位置沒有值,返回false

bool delete_arr(struct arr* parr,int

pos,int * pval)

else

}

排序:這裡使用的是氣泡排序,當flag為0則表示降序,其他值則為公升序

void sort_arr(struct arr* parr,int flag)

for(i = 0;i < parr->cnt-1;i++)

for (j = i + 1;j < parr->cnt;j++)

else

if (parr->pbase[i] > parr->pbase[j])

exchange(&(parr->pbase[i]), &(parr->pbase[j]));

}}

倒置:將整個陣列倒置。比如 3 12 45 6 —–>> 6 45 12 3 這裡我使用了兩種方法倒置:

第一種:直接不斷調換前後的值,直至全部被調換。(時間複雜度相對較高)

void inversion_arr(struct arr* parr)

length = parr->len;

//第一種

for (leftindex = 0, rightindex = parr->cnt - 1;leftindex < rightindex;leftindex++, rightindex--)

exchange(&(parr->pbase[leftindex]),&(parr->pbase[rightindex]));

}

void inversion_arr(struct arr* parr)

length = parr->len;

//第二種

int * ptest = (int *)malloc(sizeof(int)*length);

int * freep;

int i;

for (i = 0;i < parr->cnt;i++)

ptest[parr->cnt-i-1] = parr->pbase[i];

freep = parr->pbase;//先將原位址拿到

parr->pbase = ptest;//再更換指向的位址

free(freep);//將之前拿到的原位址記憶體釋放掉

}

下面是完整的程式:

#include

#include

//定義了乙個復合資料型別,該資料名字叫 struct arr,它包含了三個基礎資料型別

struct arr

;void init_arr(struct arr* parr,int length);//初始化

bool insert_arr(struct arr* parr,int pos,int val);//將val插入到parr指向的結構體變數的陣列第pos個的值的前面.

bool delete_arr(struct arr* parr,int pos,int *pval);//刪除函式,刪除parr指向的結構體變數的陣列第pos個的值,如果成功,將這個值放到pval指向的變數裡

bool is_empty(struct arr* parr);//判斷陣列是否為空

bool is_full(struct arr* parr);//判斷陣列是否已經滿了

void sort_arr(struct arr* parr,int flag);//氣泡排序,flag為0則表示降序,其他值則為公升序

void show_arr(struct arr* parr);//顯示陣列的值

void inversion_arr(struct arr* parr);//倒置陣列

void exchange(int* a, int* b);//更換兩個整型變數的值

int main(void)

//初始化

void init_arr(struct arr* parr,int length)

else

return;

}void show_arr(struct arr* parr)

else

printf("\n");

}}bool is_empty(struct arr* parr)

bool is_full(struct arr* parr)

else

}bool insert_arr(struct arr* parr,int pos,int val)

else

parr->pbase[pos-1] = val;

parr->cnt++;

return

true;

}}bool delete_arr(struct arr* parr,int pos,int * pval)

else

}void inversion_arr(struct arr* parr)

length = parr->len;

//第一種

/*for (leftindex = 0, rightindex = parr->cnt - 1;leftindex < rightindex;leftindex++, rightindex--)

exchange(&(parr->pbase[leftindex]),&(parr->pbase[rightindex]));*/

//第二種

int * ptest = (int *)malloc(sizeof(int)*length);

int * freep;

int i;

for (i = 0;i < parr->cnt;i++)

ptest[parr->cnt-i-1] = parr->pbase[i];

freep = parr->pbase;//先將原位址拿到

parr->pbase = ptest;//再更換指向的位址

free(freep);//將之前拿到的原位址記憶體釋放掉

}void sort_arr(struct arr* parr,int flag)

for(i = 0;i < parr->cnt-1;i++)

for (j = i + 1;j < parr->cnt;j++)

else

if (parr->pbase[i] > parr->pbase[j])

exchange(&(parr->pbase[i]), &(parr->pbase[j]));

}}//更換兩個整型變數的值!一定記得需要通過指標改變值,傳遞值是無法修改原來的變數值的

void exchange(int* a, int* b)

連續儲存陣列

include include include struct arr void init arr struct arr parr,int length 初始化 struct arr parr,int val 追加 bool insert arr struct arr parr,int pos,int...

建立連續儲存陣列

2017年6月16日 08 45 55 資料結構 c 建立連續儲存陣列 功能 初始化 追加 插入 刪除 排序 是否空 是否滿 include include include typedef struct arr sa void init sa arr,int len void show sa arr...

連續儲存陣列的演算法演示 增 刪 改 查

終於學完了這部分,開心。還是要多理解多練。已測試 struct arr void init arr struct arr parr,int length bool is full struct arr parr bool insert arr struct arr parr,int pos,int ...