正文之前
今天看無窮級(jí)數(shù)這個(gè)數(shù)學(xué)內(nèi)容實(shí)在看得頭疼,索性看到八點(diǎn)多就不看了。愉快的寫起了碼蕴侣,對(duì)我來說這個(gè)可有趣了缠犀!雖然有時(shí)候莫名其妙的就會(huì)Run success数苫,有時(shí)候也是不知為啥Bug連連,不過好在都能克服辨液,我還是很開心的虐急!寫出了鏈表形式的隊(duì)列,我去滔迈,我總感覺我的隊(duì)列是亂七八糟的那種止吁,完全按照我自己的想法在寫,沒有看書上的燎悍,后面復(fù)習(xí)還要規(guī)范一下敬惦,現(xiàn)在的話,還是先寫了再說间涵!書上只要幾十行仁热,我的花了整整140,可悲可嘆勾哩,路漫漫其修遠(yuǎn)兮~~
正文
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 4
//注:定義隊(duì)列結(jié)構(gòu)體及其指針
typedef struct Queue
{
char Data;
struct Queue *next;
} Queue, *PtrQ;
//注:定義隊(duì)首隊(duì)尾的指針以及隊(duì)列的大小指數(shù)
typedef struct {
PtrQ front;
PtrQ rear;
int size;
} *Pointer;
//注:初始化隊(duì)列函數(shù)抗蠢,申請(qǐng)內(nèi)存建立一個(gè)空表頭,成為入口和鏈表的接口
//注:此處一次性的把六個(gè)存儲(chǔ)空間全部整合擺好思劳,然后形成了后面的圖解中的內(nèi)存分布形式迅矛,一個(gè)表頭,五個(gè)隊(duì)列內(nèi)存塊
PtrQ InitQueue()
{
Queue *ptrQ;
ptrQ=(Queue *)malloc(sizeof(Queue));
int len=MAXSIZE;
PtrQ head=ptrQ;
while(len--)
{
//注:采用的是尾插法的鏈表生成模式
PtrQ p=(Queue *)malloc(sizeof(Queue));
p->next=head->next;
head->next=p;
head=p;
}
head->next=ptrQ->next;
//注:將初始化后的鏈表隊(duì)列傳回
return ptrQ;
}
//注:插入數(shù)值函數(shù),先預(yù)判需要插入內(nèi)存是否已經(jīng)滿了
void Putin(PtrQ ptrQ,Pointer queue,char item)
{
if (queue->size==MAXSIZE)
{
printf("\n隊(duì)列已經(jīng)滿了G迸选秽褒!~~\n");
}
else
{
//注:如果隊(duì)列未滿壶硅,分為兩種情況,第一次入值和后面的入值
if (queue->rear==queue->front&&queue->size==0)
{
PtrQ L=ptrQ->next;
//注:此時(shí)如果是第一次插入數(shù)值销斟,那么頭指針也要跟著跑一下庐椒!
printf("\n隊(duì)列空間剛剛空空如也!~終于等到你蚂踊!~\n");
queue->front=L;
queue->rear=L;
}
else
{
//注:后面的入值就不需要考慮那么多约谈,因?yàn)槭茄h(huán)的鏈表,所以不存在先后關(guān)系犁钟,只要向前走已經(jīng)可以從頭到尾棱诱,
PtrQ L=queue->rear;
queue->rear=L->next;
}
queue->rear->Data=item;
queue->size++;
printf("\n成功插入!數(shù)值是:|\t%c\t|,當(dāng)前隊(duì)列內(nèi)有%d個(gè)數(shù)@远迈勋!\n",item,queue->size);
}
}
//注:拋出數(shù)值函數(shù),先預(yù)判是否還有數(shù)值可以拋出,拋出后頭指針向前走1位
char Putout(PtrQ ptrQ,Pointer queue)
{
if (queue->size==0)
{
printf("\n我大清醋粟!亡了C夜健!昔穴!\n" );
}
else
{
//注:拋出函數(shù)的內(nèi)容很簡(jiǎn)單镰官,頭指針向后走一位,size-- 然后拋出數(shù)值即可
char out;
PtrQ L=queue->front;
out=L->Data;
queue->front=L->next;
queue->size--;
printf("\n拋出后當(dāng)前只有%d個(gè)數(shù)\t",queue->size);
printf("被拋出來的是:| \t%c\t|\n ",out);
return 0;
}
return 0;
}
//注:遍歷函數(shù)吗货,簡(jiǎn)單易懂泳唠,因?yàn)槭茄h(huán)體,所以不存在夏先先后宙搬,從頭到尾跑一遍笨腥,一定是整個(gè)隊(duì)列的輸出,只要用size控制輸出長(zhǎng)度即可
void ShowQueue(PtrQ ptrq,Pointer queue)
{
PtrQ L=queue->front;
int X=queue->size;
while(X--)
{
char out;
out=L->Data;
L=L->next;
printf("\n現(xiàn)在整個(gè)隊(duì)列中的情況是:|\t%c \t |\n",out);
}
printf("\n******遍歷完成勇垛!******\n\n");
}
int main()
{
//注:初始化整個(gè)鏈表
Pointer queue;
PtrQ ptrQ;
ptrQ=InitQueue();
queue->front=ptrQ;
queue->rear=ptrQ;
queue->size=0;
//注:為了測(cè)試所有函數(shù)的性能脖母,先壓入四個(gè)值,然后全部拋出闲孤,再請(qǐng)求拋出谆级,會(huì)回復(fù):大清亡了!
Putin(ptrQ, queue, 'a');
Putin(ptrQ, queue, 'c');
Putin(ptrQ, queue, 'd');
Putin(ptrQ, queue, 'Z');
Putout(ptrQ, queue);
Putout(ptrQ, queue);
Putout(ptrQ, queue);
Putout(ptrQ, queue);
Putout(ptrQ, queue);
//注:然后再次壓入數(shù)值讼积,在拋出
Putin(ptrQ, queue, 'G');
Putin(ptrQ, queue, 'H');
Putout(ptrQ, queue);
Putout(ptrQ, queue);
Putin(ptrQ, queue, 'D');
//注:最后遍歷
ShowQueue(ptrQ,queue);
return 0;
}
阿西吧肥照,我對(duì)面的小妹妹還沒醒過來,九點(diǎn)鐘跟我說睡半個(gè)小時(shí)~然而
運(yùn)行結(jié)果:
隊(duì)列空間剛剛空空如也勤众!~終于等到你舆绎!~
成功插入!數(shù)值是:| a |,當(dāng)前隊(duì)列內(nèi)有1個(gè)數(shù)C茄铡吕朵!
成功插入猎醇!數(shù)值是:| c |,當(dāng)前隊(duì)列內(nèi)有2個(gè)數(shù)!努溃!
成功插入硫嘶!數(shù)值是:| d |,當(dāng)前隊(duì)列內(nèi)有3個(gè)數(shù)!梧税!
成功插入音半!數(shù)值是:| Z |,當(dāng)前隊(duì)列內(nèi)有4個(gè)數(shù)!贡蓖!
拋出后當(dāng)前只有3個(gè)數(shù) 被拋出來的是:| a |
拋出后當(dāng)前只有2個(gè)數(shù) 被拋出來的是:| c |
拋出后當(dāng)前只有1個(gè)數(shù) 被拋出來的是:| d |
拋出后當(dāng)前只有0個(gè)數(shù) 被拋出來的是:| Z |
我大清!亡了;筒纭3馄獭!
成功插入坛善!數(shù)值是:| G |,當(dāng)前隊(duì)列內(nèi)有1個(gè)數(shù)A乐!
成功插入眠屎!數(shù)值是:| H |,當(dāng)前隊(duì)列內(nèi)有2個(gè)數(shù)L藿弧!
拋出后當(dāng)前只有1個(gè)數(shù) 被拋出來的是:| G |
拋出后當(dāng)前只有0個(gè)數(shù) 被拋出來的是:| H |
成功插入改衩!數(shù)值是:| D |,當(dāng)前隊(duì)列內(nèi)有1個(gè)數(shù)a!!
現(xiàn)在整個(gè)隊(duì)列中的情況是:| D |
******遍歷完成葫督!******
Program ended with exit code: 0
這是在運(yùn)行過程中耗費(fèi)的內(nèi)存竭鞍。我屮艸芔茻,怎么這么多橄镜!這么小的程序吃了我將近0.5M內(nèi)存偎快?OMG!G⒔骸晒夹!
我對(duì)隊(duì)列的認(rèn)識(shí)是就仿佛是幾個(gè)箱子排在一起。然后在連續(xù)的幾個(gè)箱子上姊氓,放一些東西丐怯。用一個(gè)頭指針和一個(gè)尾指針指向這些裝了東西的箱子的頭和尾。如果把箱子圍成一個(gè)圓環(huán)他膳,那么也就是今天我寫的鏈表隊(duì)列實(shí)現(xiàn)了响逢。其實(shí)鏈表和線性表實(shí)現(xiàn)的不同就在于:線性表相當(dāng)于是幾個(gè)擺在一起的箱子,尋找就可以了棕孙。而鏈表就是相當(dāng)于在一大堆雜亂的箱子中舔亭,用繩子把幾個(gè)要裝東西的箱子牽起來些膨。那么在散亂的箱子中也是沒有辦法精確的直接招到每一個(gè)箱子的,所以你就需要順著繩子去找钦铺。這就是鏈表的意義所在订雾。鏈表的優(yōu)勢(shì)就在于你在,插入或者刪除一個(gè)箱子的時(shí)候矛洞,不需要整體的搬動(dòng)著一個(gè)長(zhǎng)隊(duì)伍洼哎,而只要重新拿兩個(gè)繩子,把你要綁的那個(gè)箱子串進(jìn)來就可以了沼本。這極大的噩峦,減小了人力的消耗,放在計(jì)算機(jī)里面就是減少了內(nèi)存消耗抽兆。但是如果要查找识补,那就很麻煩了。至于具體麻煩在哪里辫红?大家自己想一想凭涂,我就不贅述了大家自己想想,我就不贅述了贴妻!
如下為圖解(并非完全按照上述程序來的切油,要細(xì)看程序可以拷貝程序打斷點(diǎn),或者是看我的運(yùn)行結(jié)果):
初始化名惩,也就是創(chuàng)建隊(duì)列(此處為創(chuàng)建鏈表隊(duì)列澎胡,與線性隊(duì)列的區(qū)別在于,存儲(chǔ)的內(nèi)存塊非線性)
給定第一個(gè)值的過程中娩鹉,也就是從空隊(duì)列到含有一個(gè)數(shù)值的隊(duì)列轉(zhuǎn)變滤馍,此處有別的別的入隊(duì)出隊(duì),因?yàn)槲医o他加了一個(gè)front 和 rear同時(shí)運(yùn)動(dòng)的特例底循,以便徹底脫離初始化時(shí)留下的空指針巢株,使得后面可以不用考慮鏈表頭,只有要用的時(shí)候才用熙涤!(no.1)
再次給定數(shù)值入隊(duì)(no.2)
繼續(xù)入隊(duì)(no.3)
第一次出隊(duì)(no.-1)
第二次出隊(duì)(no.-2)
第三次出隊(duì)(no.-3)
第四次入隊(duì)(no.4)
正文之后
如果能夠把寫代碼當(dāng)作一件快樂的事情來對(duì)待阁苞,是不是說明我有學(xué)計(jì)算機(jī)的潛力呢?當(dāng)然現(xiàn)在還是這種很簡(jiǎn)單的代碼祠挫,所以學(xué)得不亦樂乎那槽。以后如果任務(wù)加劇的話,保不準(zhǔn)我會(huì)煩躁等舔,不過也得先走到那一天哪IЬ摹!今天心情不是特別好慌植,因?yàn)閷W(xué)數(shù)學(xué)覺得自己太菜了甚牲。明天繼續(xù)戰(zhàn)斗∫逯#現(xiàn)在下樓去洗澡去咯!嘿嘿丈钙,小妹子現(xiàn)在還沒醒~看我明天怎么臭她非驮。。雏赦。?(?)?
如果有大佬路過劫笙,覺得看我的代碼不順眼。強(qiáng)迫癥犯了星岗,想要幫我精簡(jiǎn)一下代碼或者優(yōu)化一下算法填大,那么請(qǐng)不要吝嗇你的才華,咱們?cè)u(píng)論區(qū)見俏橘!
另外給大家?guī)硪粡埼矣X得非常好看的圖!