佇列型別的資料結構:
佇列型別是一種先進先出的資料結構,只能在佇列的頭部取出資料,在隊尾存入資料。下面介紹兩種基於陣列實現的佇列。給出了佇列的操作方法(函式)。
單向佇列:
#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 ...