C 學習筆記day18 資料結構與演算法

2021-08-19 07:43:01 字數 3551 閱讀 7546

佇列型別的資料結構:

佇列型別是一種先進先出的資料結構,只能在佇列的頭部取出資料,在隊尾存入資料。下面介紹兩種基於陣列實現的佇列。給出了佇列的操作方法(函式)。

單向佇列:

#include"queue.h"

typedef

structqueue;

//佇列的初始化函式

void queue_init(queue* p_queue)

//佇列的清理函式

void queue_deinit(queue* p_queue)

//獲得佇列個數的函式

int queue_size(const

queue* p_queue)

//判斷佇列是否滿的函式

int queue_full(const

queue* p_queue)

//判斷佇列是否空的函式

int queue_empty(const

queue* p_queue)

//向佇列裡加入數字的函式

int queue_push(queue* p_queue,int value)

//從佇列裡獲得數字的函式

int queue_pop(queue* p_queue,int* p_value)

//從佇列獲得乙個數字,但不刪除

int queue_front(const

queue* p_queue,int* p_value)

迴圈佇列:

迴圈佇列的要點在於怎麼處理佇列頭和尾的迴圈,在以下**中,通過在每次對佇列頭下標值累加的時候判斷其是否超出了佇列長度,如果超出就將佇列的頭和尾的下標減去佇列長度,確保佇列頭和尾的下標值不會超過int型別的上限(頭和尾是一直累加的,如果不管,多次迴圈之後必定超出int型別上限)。

#include"queuep.h"

typedef structqueuep;

//初始化佇列

void queuep_init(queuep* p_queue)

//清除佇列

void queuep_deinit(queuep* p_queue)

//計算佇列當前的長度

int queuep_size(const queuep* p_queue)

//判斷當前佇列是否為滿

int queuep_full(const queuep* p_queue)

//判斷當前佇列是否為空

int queuep_empty(const queuep* p_queue)

//向隊尾填入資料

int queuep_push(queuep* p_queue,int

value)

//從佇列頭部彈出資料

int queuep_pop(queuep* p_queue,int* p_value)

return1;}

//從佇列頭部獲得資料,但是不彈出

int queuep_front(const queuep* p_queue,int* p_value)

鍊錶型別的資料結構

鍊錶的型別,其實是由乙個個節點組成的,鍊錶自身的結構體只記錄鍊錶的頭尾節點。每個節點中,記錄了當前節點內存放的資料和指向下乙個節點的節點指標。

當然,也可以在節點的結構體中加入記錄前乙個節點的指標。如果這樣做,那麼乙個節點裡記錄前乙個節點的位址和後乙個節點的位址,就變成了雙向鍊錶。

雙向鍊錶的優勢在於,對鍊錶尾部處理的時候,不需要從鍊錶的頭節點遍歷到鍊錶尾部,再處理,而是可以通過節點的前向指標,直接從尾部開始處理。

下面提供操作雙向鍊錶的方法(函式)

//鍊錶初始化

void link_init(link

* p_link)

//清理鍊錶

void link_deinit(link

* p_link)

}//獲得煉表裡資料個數

int link_size(const link

* p_link);

temp =

&(p_link->head);

while(temp->p_next !=

&(p_link->tail))

return count;

}//判斷鍊錶是否空的函式

int link_empty(const link

* p_link)

//判斷鍊錶是否滿的函式

int link_full(const link

* p_link)

//插入在最前面擦入新資料的函式

int link_add_head(link

* p_link,int value)

//在最後面加入新數字的函式

int link_add_tail(link

* p_link,int value)

//在煉表裡按順序插入新數字的函式

int link_insert(link

* p_link,int value)

}return1;}

//刪除最前面有效節點的函式

int link_remove_head(link

* p_link)

//刪除最後面有效節點的函式

int link_remove_tail(link

* p_link)

//刪除順序鍊錶中的某個值的節點

int link_remove(link

* p_link,int value);

for(p_temp =

&(p_link->head);p_temp !=

&(p_link->tail);p_temp = p_temp->p_next)

}return0;}

//從煉表裡獲得第乙個數字的函式

int link_get_head(const link

* p_link,int* value)

//從鍊錶末尾獲得乙個數字

int link_get_tail(const link

* p_link,int* value)

//根據下標獲得乙個數字

int link_get(const link

* p_link,int num,int* value);

if(link_empty(p_link)) return

0; for(p_temp =

&(p_link->head);p_temp !=

&(p_link->tail);p_temp = p_temp->p_next)

count++;

}return0;}

//開始從前向後遍歷所有節點

void link_begin(link

* p_link)

//在遍歷過程中,獲得下乙個節點裡的數字

int link_next(link

* p_link,int* p_value)

else

}

python學習筆記 day18 初識模組

正規表示式其實和python並沒有什麼關係,它就是字串匹配的規則 字元組 在同乙個位置可能出現的各種字元就組成了乙個字元組,比如你要求乙個位置只能出現數字,但是這個數字可以是0 9之間的任意乙個,這個時候就可以用到正則了 0123456789 相當於 0 9 可以匹配0 9之間的任意乙個數字 a z...

C 學習筆記day 18檔案操作

1 文字檔案 寫檔案 include include using namespace std 文字檔案 寫檔案 void test01 intmain 2 文字檔案 讀檔案 include include include using namespace std 文字檔案 讀檔案 void test0...

python 學習筆記 day18 遞迴作業講解

思路 計算數列中第n個值,需要依賴前面n 1 和 n 2位置的值,所以就是執行func n 的時候需要用到func n 1 和func n 2 但是對於最底層被呼叫的 也就是func 1 和func 2 需要指定 返回值!def func n if n 1 or n 2 return 1 else ...