1. 程式人生 > >鏈式佇列 (c語言)

鏈式佇列 (c語言)

結構體

結點結構體

typedef struct TreeNODE
{
    char date;
    struct TreeNODE *next;
}Queue;

隊頭、尾結構體:

typedef struct
{
    Queue *front;
    Queue *rear;
}Piont;

 初始化

//初始化
void chongqueue(Piont *p)
{
    p->front=NULL;
    p->rear=NULL;
}

使佇列頭尾指標指向都為NULL

入棧

oid inqueue(Piont *p,char x)
{
    Queue *u;

        u=(Queue*)malloc(sizeof(Piont));
        u->date=x;
        u->next=NULL;
        if(p->rear!=NULL)
        {
            p->rear->next=u; //
            p->rear=u;  //將隊尾指標指向新插入的節點上
        }
        if(p->front==NULL)
        {
            p->front=u;
        }

}

構建一個結點,將一個元素入棧所以隊頭指標指向第一個元素,此時rear指向第一個不為空的結點,當第二個元素進站時,就可以將結點賦值給rear->next,然後將隊尾指標指向第二個結點。

下面是順序結構

出棧

int deleteQueue(Piont *p,char *ch)
{
    Queue *q;
    if(p->front==NULL)
    {
        printf("佇列為空\n");
        return 0;
    }
    else{
        *ch =p->front->date;
        q =p->front;
        p->front=p->front->next;
        if(p->front==NULL)
        {
            p->rear=NULL;
        }
      free(q);
      return 1;

    }
}

   新建一個結點指標,讓此結點也指向棧頂元素,然後讓頭指標指向下一個結點,free掉新建的結點;而當刪除最後一個結點,要使隊尾指標為空。

獲取棧頂元素

char getQueue(Piont *p)
{
    char ch;
    if(p->front==NULL)
    {
        printf("佇列為空\n");
        return 0;
    }
    else{
        ch = p->front->date;
        return ch;
    }
}

main函式

int main()
{
    Piont p;  //二級指標指向指標,指標指向結構體變數或普通變數
    char x;
    chongqueue(&p);
    inqueue(&p,'A');

    inqueue(&p,'B');
    inqueue(&p,'D');
    x=getQueue(&p);
    printf("%c\n",x);
    return 0;
}

完整程式碼   

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNODE
{
    char date;
    struct TreeNODE *next;
}Queue;

typedef struct
{
    Queue *front;
    Queue *rear;
}Piont;

//初始化
void chongqueue(Piont *p)
{
    p->front=NULL;
    p->rear=NULL;
}
//入棧
void inqueue(Piont *p,char x)
{
    Queue *u;

        u=(Queue*)malloc(sizeof(Piont));
        u->date=x;
        u->next=NULL;
        if(p->rear!=NULL)
        {
            p->rear->next=u; //
            p->rear=u;  //將隊尾指標指向新插入的節點上
        }
        if(p->front==NULL)
        {
            p->front=u;
        }

}
//出棧
int deleteQueue(Piont *p,char *ch)
{
    Queue *q;
    if(p->front==NULL)
    {
        printf("佇列為空\n");
        return 0;
    }
    else{
        *ch =p->front->date;
        q =p->front;
        p->front=p->front->next;
        if(p->front==NULL)
        {
            p->rear=NULL;
        }
      free(q);
      return 1;

    }
}
//取隊頭元素
char getQueue(Piont *p)
{
    char ch;
    if(p->front==NULL)
    {
        printf("佇列為空\n");
        return 0;
    }
    else{
        ch = p->front->date;
        return ch;
    }
}

int main()
{
    Piont p;  //二級指標指向指標,指標指向結構體變數或普通變數4r-
    char x;
    chongqueue(&p);
    inqueue(&p,'A');

    inqueue(&p,'B');
    inqueue(&p,'D');
    x=getQueue(&p);
    printf("%c\n",x);
    return 0;
}