數據結構C語言實現----出隊伍操作

 

1.創建一個隊列時,空隊列中隊首和隊尾相同,但不是NULL,隊首後面掛的元素才是NULL

2.列印隊列時,對於鏈隊列,不能把指針加一來找到下一個數據,因為鏈表地址不連續,需要複製一條鏈表,不斷往後遍歷來挨個列印鏈表的數據

3.求隊伍的長度也是,不能首尾指針相減,因為地址不連續,所以同樣需要複製一條鏈表,通過遍歷來求長度

 

程式碼如下:

#include<stdlib.h>
#include<stdio.h>
/*************************************
 * 出隊列操作
 * 隊首(頭指針)---元素1----元素2---元素3---.....
 * 將隊首指向元素2,釋放掉元素1
 * 注意1:隊列原本為空隊列,直接返回
 * 注意2:釋放掉第一個元素後,隊列變為空隊列,別忘了讓隊尾 = 隊首
 * ***************************************************************/
//typedef char ElemType;
typedef struct QNode 
{
    char date;
    struct QNode *next;
}QNode , *QueuePtr;
typedef struct 
{
    QueuePtr front , rear;
}LinkQueue;
/////////////////////////////////////////////////////////////////////
//創建一個隊列
void initQueue(LinkQueue *q)
{
    q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
    if (!q->front)
    {
        exit(0);
    }
    q->front->next = NULL;//這時頭結點後面連接的是NULL,但本身不是NULL
}
/////////////////////////////////////////////////////////////////////
//入隊列操作
void EnQueue(LinkQueue *q , char e)
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    if (!q->front)
    {
        exit(0);
    }
    p->date = e;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
}
////////////////////////////////////////////////////////////////////
//出隊列操作
void DeQueue(LinkQueue *q , char *e)
{
    if (q->front == q->rear)//判斷是否為空隊列
    {
        return;
    }
    QueuePtr p;
    p = q->front->next;
    *e = p->date;
    q->front->next = p->next;
    if (q->rear == p)
    {
        q->front = q->rear;
    }
    free(p);
}
/////////////////////////////////////////////////////////////////////
//計算隊列長度
int LenLinkQueue(LinkQueue *q)
{
    int len,i;
    QueuePtr p = q->front->next;
    for (i = 0; p!=NULL;i++)
    {
        p = p->next;
    }
    return i;
}

int main()
{
    LinkQueue q;
    char e;
    //創建隊列
    initQueue(&q);
    printf("隊列創建中,請稍後...\n隊列創建成功!\n");
    //入隊列操作
    printf("請輸入要插入隊列的字元:");
    while ((e = getchar())!= '\n')
    {
        if (e!='\n')
        {
            EnQueue(&q , e);
        }
    }
    //列印隊列
    printf("插入成功,正在列印隊列字元...\n");
    printf("當前隊列為:");
    int len = LenLinkQueue(&q);//隊伍長度
    QueuePtr p = q.front->next;//鏈表不同於順序表,地址不連續,所以不能通過指針的增減來列印,需要複製一個鏈表遍歷
    for (size_t i = 0;i<len ; i++)
    {
        printf("%c" , p->date);
        p = p->next;
    }
    putchar('\n');
    //出隊伍
    printf("請輸入需要幾個元素從隊首出隊列:");
    int n;
    scanf("%d",&n);
    while (n)
    {
        DeQueue(&q , &e);
        printf("%c已從隊首出隊列\n" ,e);
        n--;
    }
    //列印隊伍
    printf("插入成功,正在列印隊列字元...\n");
    printf("當前隊列為:");
    p = q.front->next;
    for (size_t i = 0;i<len ; i++)
    {
        printf("%c" , p->date);
        p = p->next;
    }
    putchar('\n');
    return 0;
}

  

運行結果: