純C語言實現鏈隊

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

typedef int QElemType;

typedef struct QNode{
    QElemType data;
    struct QNode *next;
}QNode;

typedef struct{
    QNode *front;
    QNode *rear;
}LinkQueue;

LinkQueue *InitQueue(LinkQueue *Q); //初始化
LinkQueue *DestroyQueue(LinkQueue* Q);//銷燬
void ClearQueue(LinkQueue *Q);//清空
int QueueEmpty(LinkQueue *Q);//判空
int QueueLength(LinkQueue *Q);//隊列長度
QElemType GetHead(LinkQueue *Q);//獲取隊頭元素
int EnQueue(LinkQueue *Q, QElemType e);//插入新元素到隊尾
int DeQueue(LinkQueue *Q, QElemType *e);//刪除隊頭元素
void QueueTraverse(LinkQueue *Q);//遍歷

//初始化
LinkQueue *InitQueue(LinkQueue *Q){
    Q = (LinkQueue *)malloc(sizeof(LinkQueue));
    //共同指向頭節點
    Q->front = Q->rear = (QNode *)malloc(sizeof(QNode));
    Q->front->next = NULL;
    printf("初始化成功\n");
    return Q;
}

//銷燬,返回一個空指針
LinkQueue *DestroyQueue(LinkQueue* Q){
    QNode *p = Q->front->next;
    QNode *r = p->next;
    while(r){
        free(p);
        p = r;
        r = p->next;
    }
    free(Q->front);
    free(Q);
    printf("銷燬成功\n");
    return NULL;
}

//清空
void ClearQueue(LinkQueue *Q){
    QNode *p = Q->front->next;
    while(p){
        p->data = 0;
        p = p->next;
    }
    printf("清空成功\n");
}

//判空
int QueueEmpty(LinkQueue *Q){
    return Q->rear==Q->front;
}

//隊列長度
int QueueLength(LinkQueue *Q){
    int len = 0;
    QNode *p = Q->front->next;
    while(p){
        len++;
        p = p->next;
    }
    return len;
}

//獲取隊頭元素
QElemType GetHead(LinkQueue *Q){
    if(Q->front != Q->rear){
        printf("隊頭元素是%d\n", Q->front->next->data);
        return Q->front->next->data;
    }else{
        printf("空鏈隊,無頭元素\n");
        return NULL;
    }
}

//插入新元素到隊尾
int EnQueue(LinkQueue *Q, QElemType e){
    QNode *p = (QNode *)malloc(sizeof(QNode));
    p ->data = e;
    p->next = NULL;
    Q->rear->next = p;
    Q->rear = p;
    printf("元素%d插入成功\n", e);
    return 1;
}

//刪除隊頭元素
int DeQueue(LinkQueue *Q, QElemType *e){
    if(Q->front == Q->rear){
        printf("空鏈隊,刪除失敗\n");
        return 0;
    }
    QNode *p = Q->front->next;
    *e = p->data;
    printf("%d元素出鏈隊\n", *e);
    Q->front->next = p->next;
    //最後一個元素被刪除,隊尾指針指向頭節點
    if(Q->rear == p) Q->rear=Q->front;
    free(p);
    return 1;
}

//遍歷
void QueueTraverse(LinkQueue *Q){
    if(Q->front == Q->rear){
        printf("空鏈隊\n");
        return;
    }
    QNode *p = Q->front->next;
    while(p){
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main()
{
    LinkQueue *Q = NULL;
    QElemType e = NULL;

    //初始化測試
    Q = InitQueue(Q);

//    //判空測試
//    if(QueueEmpty(Q)){
//        printf("空鏈棧\n");
//    }
//    EnQueue(Q, 1);
//    if(QueueEmpty(Q)){
//        printf("空鏈棧\n");
//    }
//    DeQueue(Q, &e);
//    if(QueueEmpty(Q)){
//        printf("空鏈棧\n");
//    }

//    //長度測試
//    printf("鏈隊長度爲%d\n", QueueLength(Q));
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    printf("鏈隊長度爲%d\n", QueueLength(Q));
//    DeQueue(Q, &e);
//    DeQueue(Q, &e);
//    printf("鏈隊長度爲%d\n", QueueLength(Q));

//    //遍歷測試
//    QueueTraverse(Q);

//    //獲取頭元素測試
//    e = GetHead(Q);
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    e = GetHead(Q);
//    DeQueue(Q, &e);
//    e = GetHead(Q);


//    //入隊測試
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    EnQueue(Q, 3);
//    EnQueue(Q, 4);
//    EnQueue(Q, 5);
//    EnQueue(Q, 6);
//    EnQueue(Q, 7);
//    QueueTraverse(Q);

//    //出隊測試
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    EnQueue(Q, 3);
//    EnQueue(Q, 4);
//    QueueTraverse(Q);
//    DeQueue(Q, &e);
//    printf("測試e是否改變:%d\n",e);
//    DeQueue(Q, &e);
//    printf("測試e是否改變:%d\n",e);
//    QueueTraverse(Q);


//    //清空測試
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    ClearQueue(Q);
//    QueueTraverse(Q);

    //銷燬測試
    EnQueue(Q, 1);
    EnQueue(Q, 2);
    Q = DestroyQueue(Q);
    QueueTraverse(Q);
}
相關文章
相關標籤/搜索