C語言鏈隊的相關操做

/*************************************************************************
 *     > File Name: queue.c
 *     > Author:heathcliff 
 *     > Mail:------------------- 
 *     > Created Time: 2016年04月01日 星期五 14時45分50秒
 *                  ************************************************************************/
/*隊列,隊尾入隊,隊頭出對*/
#include<stdio.h>
#include<stdlib.h>

typedef char ElemType; //ElemType至關於char
typedef struct QNode{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct 
{
    QueuePtr front; //建立對頭指針
    QueuePtr rear; //建立隊尾指針
}LinkQueue;

int length = 0;//計算隊列的長度

/*初始化空隊列*/
initQueue(LinkQueue *q)
{
    /*在這裏能夠創建一個head節點,
     * q->front = q->rear = head = (QueuePtr) malloc (sizeof(QNode)) 隊頭、隊尾指針指向頭節點
     * head->next = NULL;頭節點指向空值 
     * q->front = head;
     * q->rear = head;
     */
    q->front = q->rear = (QueuePtr) malloc (sizeof(QNode));

    if(!q->front) exit(0);//建立頭節點失敗
    q->front->next = NULL;//頭節點指向空值
}

/*入隊操做*/
EnQueue(LinkQueue *q,ElemType e)
{
    QueuePtr p;

    p = (QueuePtr) malloc (sizeof(QNode)); //爲p指針分配空間

    if(!q->front) exit(0);//建立頭節點失敗

    /*在隊尾插入值*/
    p->data = e;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;//隊尾向後移動一位

    /*檢校函數,目的是正確判斷是否傳入新值*/
    /*可是這裏不知道爲什麼在打印時打印兩遍*/
    printf("q->rear->data = %c\n",q->rear->data);
    length++;//每傳入一個新值,長度+1
}

/*出對操做*/
DeQueue(LinkQueue *q,ElemType *e)
{
    QueuePtr p;
    if(q->front == q->rear) return ;//隊列爲空

    p = q->front->next;
    *e = p->data;//保存出對指針的信息
    q->front->next = p->next;//頭指針向後移動一位

    if(q->rear == p) q->rear = q->front;

    length --;//每出對一個值,長度-1
    free(p);
}

int main(void)
{
    ElemType e;
    LinkQueue q;
    initQueue(&q);

    printf("Please input a string into queue:\n");
    scanf("%c",&e);

    while(e!='@'){
        EnQueue(&q,e);
        scanf("%c",&e);
        printf("length = %d\n",length);
    }
    printf("The string into the queue is\n");

    while(q.front !=q.rear){
        DeQueue(&q,&e);
        printf("%c\n",e);
        printf("length = %d\n",length);
    }

    return 0;
}
相關文章
相關標籤/搜索