【我的漫漫考研路】数据结构之队列的线性实现

正文之前

最近在家流年不利,先是昨天家里路由器还是ADSL调制解调器坏了。反正是没网了!然后,今天上午还停电了,昨晚因为熬夜写码,所以忘了给手机充电了。早上起来9%的电量,让我怎么活?!没网没电!我辈程序员能忍?!!好吧,不能忍又咋地,乖乖看数学~

话说昨晚!数学看到三重积分实在看不下去了!而且网络断了基本只能躺床上装咸鱼。索性不如写会码,所以就把队列这个数据结构给实现了,还好还好~~~下面是调完BUG后看了时间的我

正文




#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE  5
//注:定义队列结构体及其指针
typedef struct Queue
{
    int Data[MAXSIZE];
    int  front;
    int  rear;
    
} Queue, *PtrQ;


//注:初始化队列函数,传入一个表头,之后申请内存,使之成为静态变量

PtrQ InitQueue(PtrQ ptrq)
{
    Queue *ptrQ;
    ptrQ=(Queue *)malloc(MAXSIZE*sizeof(Queue));
    //注:初始尾指针,头指针指向-1,每次只要成为空队列就重新置-1,确保空队列有区别于其他的情况
    ptrQ->front=-1;
    ptrQ->rear=-1;
    //注:将初始化后的线性表队列传回
    return ptrQ;
}



//注:插入数值函数,先预判需要插入的地方是否合法
void Putin(PtrQ ptrQ,int item)
{
    if ( (ptrQ->rear + 1)%MAXSIZE == ptrQ->front )
    {        /* 空间已满,不能插入*/
        printf("队列空间已满,不能插入\n\n");
        
    }
    else
    {
        if ( ptrQ->rear==ptrQ->front&&ptrQ->front==-1 )
        {
            /*检查插入的时候是否为第一次插入*/
            printf("\n人家刚刚还是空队列呢,现在被你插入了~~\n");
        }
        //注:插入后,要对队列中的尾指针做改变,向前进一位,
        ptrQ->Data[++ptrQ->rear]=item;
        //注:此时如果是第一次插入数值,那么头指针也要跟着跑一下!
        if (ptrQ->front==-1) ptrQ->front=0;
        // 注:如果尾指针已经到了最后一位,那么再次插入数值就要回到0位
        if (ptrQ->rear==MAXSIZE)  ptrQ->rear=0;
        printf("成功插入!尾巴是:%d\t脑袋是:%d\n\n",ptrQ->rear,ptrQ->front);
    }
}


//注:抛出数值函数,先预判是否合法,抛出后头指针向前走1位
int Putout(PtrQ ptrQ)
{
    int out;
    if ( ptrQ->front ==-1 )
    {
        /*检查插入位置的合法性*/
        printf("\n当前还是空队列呢,没东西了!\n\n");
        return 0;
    }
    else if(ptrQ->front==ptrQ->rear)
    { //注:如果只剩下一个数值,那么抛出之后就成为空列表,就要回归-1位,方便调用
        out=ptrQ->Data[ptrQ->front];
        printf("\n我空了,弹尽粮绝 最后的子弹: %d\t\n",out);
        ptrQ->front =-1;
        ptrQ->rear =-1;
        printf("成功抛出!尾巴是:%d\t脑袋是:%d\n\n",ptrQ->rear,ptrQ->front);
        return out;
    }
    //注:如果是正常情况,也就是说抛出前还有超过一个元素,可以分为头指针小于尾指针和大于尾指针两种情况
    //注:另外还有就是如果头指针已经指到最后一个位置,那么抛出后头指针置0
    else if (ptrQ->front==MAXSIZE-1)
        //注:
    {
        out=ptrQ->Data[ptrQ->front++];
        ptrQ->front=0;
        printf("\n被抛出来:\t%d \n",out);
        printf("成功抛出!尾巴是:%d\t脑袋是:%d\n\n",ptrQ->rear,ptrQ->front);
        return out;
    }
    //头指针不指向最后一个位置,那么直接输出,头指针加1就好了
    else
    {
        out=ptrQ->Data[ptrQ->front];
        ptrQ->front++;
        printf("\n被抛出来:\t%d \n",out);
        printf("成功抛出!尾巴是:%d\t脑袋是:%d\n\n",ptrQ->rear,ptrQ->front);
        return out;
    }
}



//注:遍历函数,简单易懂,不过分为三种情况 1.空队列  2.头指针小于尾指针  3.头指针大于尾指针
void ShowQueue(PtrQ ptrq)
{
    printf("\n******遍历的量是:******\n");
    //注:空队列
    if ( ptrq->front ==-1 )
    {
        /*检查插入位置的合法性*/
        printf("\n当前还是空队列呢,没东西给你遍历了!\n\n");
        exit(-1);
    }
    //非空队列
    int i=ptrq->front,j=ptrq->rear;
   //注:头指针在尾指针之前,也就是说直接自增头指针知道等于尾指针即可
    if (i<=j)
    {
        for (;i<=j; i++)
        {
            printf("%d\t🐱🐶加油啊!💪🐽\n",ptrq->Data[i]);
        }
    }
    //注:头指针在尾指针后面,那么就需要头指针有个回0的过程,回0之后等同于上面的小于的情况
    else
    {
        while(i!=MAXSIZE)
        {
            printf("%d\n",ptrq->Data[i]);
            i++;
        }
        i=0;
        for (;i<=j; i++)
        {
            printf("%d\n 🐱🐶加油啊!💪🐽\n",ptrq->Data[i]);
        }
    }
    printf("******遍历完成!******\n\n");
}


int main()
{
    PtrQ ptrq;
    ptrq=InitQueue(ptrq);
    Putin(ptrq,5);
    Putin(ptrq,3);
    ShowQueue(ptrq);
    Putin(ptrq,38);
    Putin(ptrq,66);
    Putin(ptrq,69);
    Putin(ptrq,88);
    ShowQueue(ptrq);
    Putout(ptrq);
    printf("\n ------------------\n| \tfuck off \t |\n ------------------\n" );
    ShowQueue(ptrq);
    Putout(ptrq);
    ShowQueue(ptrq);
    Putout(ptrq);
    Putout(ptrq);
    Putout(ptrq);
    Putout(ptrq);
    ShowQueue(ptrq);
    return 0;
}

阿西吧,现在真是越来越6了!我的小妹子估计现在在睡觉,我就不去打扰她了。粘人又可爱的小妹子啊!~ ~ ~ ~ Yeah ~ ~

运行结果:



人家刚刚还是空队列呢,现在被你插入了~~
成功插入!尾巴是:0  脑袋是:0

成功插入!尾巴是:1  脑袋是:0


******遍历的量是:******
5    加油啊!💪
3    加油啊!💪
******遍历完成!******

成功插入!尾巴是:2  脑袋是:0

成功插入!尾巴是:3  脑袋是:0

成功插入!尾巴是:4  脑袋是:0

队列空间已满,不能插入


******遍历的量是:******
5    加油啊!💪
3    加油啊!💪
38   加油啊!💪
66   加油啊!💪
69   加油啊!💪
******遍历完成!******


被抛出来:   5 
成功抛出!尾巴是:4  脑袋是:1


 ------------------
|   fuck off     |
 ------------------

******遍历的量是:******
3    加油啊!💪
38   加油啊!💪
66   加油啊!💪
69   加油啊!💪
******遍历完成!******


被抛出来:   3 
成功抛出!尾巴是:4  脑袋是:2


******遍历的量是:******
38   加油啊!💪
66   加油啊!💪
69   加油啊!💪
******遍历完成!******


被抛出来:   38 
成功抛出!尾巴是:4  脑袋是:3


被抛出来:   66 
成功抛出!尾巴是:4  脑袋是:4


我空了,弹尽粮绝 最后的子弹: 69  
成功抛出!尾巴是:-1 脑袋是:-1


当前还是空队列呢,没东西了!

Program ended with exit code: 0

如下为图解(并非完全按照上述程序来的,要细看程序可以拷贝程序打断点,或者是看我的运行结果):

初始化,也就是创建队列

注意,此处的初始化的意思是给第一个值!不小心表述错误

再次给定数值入队

继续入队

第一次出队

正文之后

父亲大人今天回来了,免不了还是对我一阵唠叨,不过过几天就要去学校了,还是对我爸爸多关注点吧!虽然他并不能理解我的很多行为,但是怎么说都是我亲爸,养我到这么大,做儿子也只是希望他们生活的开心点,不要为我操太多心啊!家家有本难念的经!

单步运行之后是不是直观多了?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容