隊列--數組AND鏈表的實現

一、數組實現:

用數組模擬隊列給定一個數組長度,爲隊列長度

用下標做指定頭尾位置,pri爲頭,bak爲尾

爲了不浪費空間長度:

pri=bak時隊列爲空,即:

                                                                 

(bak+1)% MAXSIZE  = pri  時:             隊列爲滿,即:

                                             

bak指向的位置始終爲空。當然也可以指向最後一個元素,但是我習慣於這種

#include<cstdio>
#include<iostream>
#include<cstdlib>

#define MAXSIZE 10000

using namespace std;


typedef struct Que_line{
    int *Element;
    int pri;
    int bak;
}Que_line;

void Creat_Que(Que_line* &Que)
{
    Que = (Que_line *)malloc(sizeof(Que_line));
    Que->Element = (int *)malloc(MAXSIZE * sizeof(int));
    Que->pri = Que->bak = 0;
    return ;
}

void In_Que(Que_line* Que, int e)
{
    if((Que->bak+1) % MAXSIZE == Que->pri)
    {
        printf("隊列已經滿了\n");
        return ;
    }

    Que->Element[Que->bak] = e;
    Que->bak = (Que->bak+1) % MAXSIZE;
    return ;
}

void Out_Que(Que_line* Que, int &e)
{
    if(Que->pri == Que->bak)
    {
        printf("隊列已經爲空\n");
        return ;
    }

    e = Que->Element[Que->pri];
    Que->pri = (Que->pri+1) % MAXSIZE;
    return ;
}

int main()
{
    int x, n;
    Que_line *Que;
    Creat_Que(Que);

    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &x);
        In_Que(Que, x);
    }

    for(int i = 0; i < n; i++)
    {
        Out_Que(Que, x);
        printf("%d%c", x, i == n-1 ? '\n' : ' ');
    }

    if(Que->pri == Que->bak)
        printf("隊列爲空\n");
    else
        printf("出錯\n");

    return 0;
}

二、鏈表實現:

鏈表結構:

typedef struct Que_link{
    int data;
    struct Que_link *next;
}Que_link, *Que_link_idx;
自定義鏈表頭部:
typedef struct Que_link_h{
    Que_link_idx pri;    ///指向鏈表的頭節點
    Que_link_idx bak;    ///指向鏈表的尾節點
}Que_link_h;

插入時在尾節點處插入,刪除時在頭結點處刪除

插入時:

如果插入的是第一個元素則應使   自定義的頭部的頭指針和尾指針都指向第一個元素;

如果不是就將這個元素接到鏈表尾部,並它的next=NULL(表示尾部),而且要 自定義的鏈表頭部  尾指針後移一下。

刪除時:

如果刪除的時最後一個元素,則應該讓   自定義的頭指針和尾指針  指向尾部,表示隊列爲爲空。

如果不是,就讓頭指針後移一下就ok了,    記得將刪除的節點free()哦,節省空間。

接下來看完整代碼:

#include<cstdio>
#include<iostream>
#include<cstdlib>

using namespace std;

typedef struct Que_link{
    int data;
    struct Que_link *next;
}Que_link, *Que_link_idx;

typedef struct Que_link_h{
    Que_link_idx pri;
    Que_link_idx bak;
}Que_link_h;

void Creat_Que_link(Que_link_h* &Que)
{
    Que = (Que_link_h *)malloc(sizeof(Que_link_h));
    Que->pri = Que->bak = NULL;
    return ;
}

void In_Que_link(Que_link_h* Que, int e)
{
    Que_link_idx p;
    p = (Que_link_idx)malloc(sizeof(Que_link));
    p->data = e;

    ///進入第一個元素與進入第i(i!=1)個元素操作不同:
    p->next = NULL;
    if(Que->bak == NULL)  ///進入第一個元素時首位指針都要指向該位置
        Que->bak = Que->pri = p;
    else                  ///進入第i(i!=1)個元素則需要先接到鏈上,然後爲指針後移
    {
        Que->bak->next = p;
        Que->bak = p;
    }
    return ;
}
void Out_Que_link(Que_link_h* Que, int &e)
{
    if(Que->pri == NULL)
    {
        printf("隊列已經爲空\n");
        return ;
    }
///刪除最後一個元素時與刪除第i(i!=1)個元素不同
    Que_link_idx p; ///刪除第i(i != 1)個元素只需要頭指針後移
    p = (Que_link_idx)malloc(sizeof(Que_link));
    p = Que->pri;
    Que->pri = Que->pri->next;
    if(Que->bak == p)  ///刪除最後一個元素還需要尾指針指空NULL
        Que->bak = NULL;
    e = p->data;
    free(p);
    return ;
}
int main()
{
    int n, x;
    Que_link_h* Que;
    Creat_Que_link(Que);


    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &x);
        In_Que_link(Que, x);
    }

    for(int i = 0; i < n; i++)
    {
        Out_Que_link(Que, x);
        printf("%d ", x);
    }
    printf("\n\n\n\n");

    if(Que->pri == NULL)
        printf("隊列爲空\n");
    else
        printf("操作出錯\n");


    return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章