實(shí)現(xiàn)具有普適性的隊(duì)列創(chuàng)建方法
方法學(xué)了很久了,應(yīng)該把它記錄下來(lái)了祟峦,好記憶不如爛筆頭罚斗,什么事情久了都會(huì)有遺忘的現(xiàn)象,記下來(lái)總歸是好的宅楞。
1针姿、為什么這么做
在編程中隊(duì)列的使用應(yīng)該是比較多的,在剛學(xué)習(xí)編程學(xué)習(xí)到都最基本的隊(duì)列創(chuàng)建方法咱筛,后來(lái)在編程中都會(huì)照著初學(xué)時(shí)的模版然后依照不同的數(shù)據(jù)去創(chuàng)建隊(duì)列搓幌。如果是這樣那么每次遇到新的要求可能就會(huì)重新寫(xiě)一次代碼,做重復(fù)的事情是沒(méi)有意義的迅箩,所以我不應(yīng)該做重復(fù)的工作溉愁。應(yīng)該找到一種方法,且方法具有普適性饲趋,這樣才能更高效的完成工作拐揭。
2、該如何做
隊(duì)列的實(shí)現(xiàn)無(wú)非就是實(shí)現(xiàn)鏈表奕塑,最基本的鏈表的實(shí)現(xiàn)方式都會(huì)堂污,但是很多鏈表都又一個(gè)共同的模式督怜,在C語(yǔ)言中就是實(shí)現(xiàn)一個(gè)結(jié)構(gòu)體米愿,在結(jié)構(gòu)體中定義一個(gè)結(jié)構(gòu)體指針作為尋找下一節(jié)點(diǎn)的參數(shù)攘宙,然后就是結(jié)構(gòu)體的其他參數(shù)胎围。就像尋寶游戲,每找到一個(gè)線(xiàn)索就會(huì)知道下一個(gè)線(xiàn)索的信息酝陈,一環(huán)扣一環(huán)陶耍,最終找到寶藏犯戏。鏈表作用不是去尋寶固蚤,而是在每個(gè)線(xiàn)索點(diǎn)存放數(shù)據(jù)娘汞。仔細(xì)想一下,如果我們不在線(xiàn)索的節(jié)點(diǎn)放任何東西夕玩,那這條鏈還是不是環(huán)環(huán)相扣的呢你弦?答案是肯定的,因?yàn)榧词共环艝|西燎孟,對(duì)于鏈表的連接是沒(méi)有影響的禽作。既然沒(méi)有影響,就可以想到其實(shí)鏈表的關(guān)鍵部分不是有沒(méi)有數(shù)據(jù)揩页,而是有沒(méi)有連接下一環(huán)的扣子领迈。數(shù)據(jù)只是每一個(gè)扣子的附屬品。既然將數(shù)據(jù)剝離開(kāi)了,隊(duì)列實(shí)現(xiàn)的普遍性的方法也就提煉出來(lái)狸捅。
3、具體實(shí)例
代碼是老大寫(xiě)的累提,分享一下尘喝,學(xué)習(xí)一下這種思想。
queue.c實(shí)現(xiàn)
struct chain_t{
struct chain_t *next;
};
void mount(void **__chain, void *__p ){
struct chain_t **chain = (struct chain_t **)__chain;
struct chain_t *p = (struct chain_t *)__p;
if(p == NULL){return;}
if(*chain == NULL){
*chain = p;
*chain->next = NULL;
}else{
struct chain_t *q = NULL;
for(q = *chain; q->next != NULL;q=q->next);
q->next = p;
p->next = NULL;
}
}
void unmount(void **_chain, void *__p){
struct chain_t **chain = (struct chain_t **)__chain;
struct chain_t *p = (struct chain_t *)__p;
if(p == NULL){return;}
if(*chain == NULL){return;}
else{
struct chain_t *q = NULL;
if(*chain == p){*chain = p->next; p->next = NULL; return;}
else{
for(q = *chain; q->next != NULL; q=q->next){
if(q->next == p) {q->next = p->next;p->next = NULL; return;}
}
}
}
}
使用實(shí)例:
struct data_t{
struct data_t *next;
uint8_t data
};
struct data_t *queue = NULL;
struct data_t *p = (struct data_t *)malloc(sizeof(struct data_t));
if(p != NULL){
mount(&queue, p); // <! 將節(jié)點(diǎn)加入到隊(duì)列
}
unmount(&queue, p); // <! 將節(jié)點(diǎn)從隊(duì)列刪除
free(p); // <! **不要忘記釋放節(jié)點(diǎn)**