带与不带头结点的链式队列对比

2018-04-23  本文已影响0人  lucas_cc

结论:对带头节点的链队列进行操作更加方便。

分析如下:

typedef struct {
    ElemType data;
    strcut LinkNode *next;
} LinkNode;

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

1.带头节点的链式队列

/* with a head node */
/* initialize the queue */
void InitQueue(LinkNode *Q)
{
    /* creat a head node */
    Q->front = Q->rear = (LinkNode*)malloc(sizeof(LinkNode));
    Q->front->next = NULL;
}

/* judge whether the queue is empty */
bool IsEmpty(LinkNode *Q)
{
    if (Q->front == Q->rear) return true;
    else return false;
}

/* Push a element into the queue */
void EnQueue(LinkQueue *Q, ElemType x)
{
    LinkNode *S;
    S = (LinkNode*)malloc(sizeof(LinkNode));
    S->data = x;
    S->next = NULL;
    Q->rear->next = S;
    Q->rear = S;
}

/* Pop a element from the queue */
bool DeQueue(LinkNode *Q, ElemType *x)
{
    if (IsEmpty(Q)) return false;
    P = (LinkNode)malloc(sizeof(LinkNode));
    P = Q->front->next;
    *x = P->data;
    Q->front->next = P->next;
    if (Q->rear == P)
        Q->rear = Q->front;
    free(P);
    return true;
}

2.不带头结点的链式队列

/* with no head node */
/* initialize the queue */
void InitQueue(LinkNode *Q)
{
    Q->front = Q->rear = NULL;
}

/* judge whether the queue is empty */
bool IsEmpty(LinkNode *Q)
{
    if (Q->front == NULL) return true;
    else return false;
}

/* Push a element into the queue */
void EnQueue(LinkQueue *Q, ElemType x)
{
    LinkNode *S;
    S = (LinkNode*)malloc(sizeof(LinkNode));
    S->data = x;
    S->next = NULL;
    if (IsEmpty(Q)) {
        Q->front = Q->rear = S;
    } else {
        Q->rear->next = S;
        Q->rear = S;
    }
    return;
}

/* Pop a element from the queue */
bool DeQueue(LinkNode *Q, ElemType *x)
{
    if (IsEmpty(Q)) return false;
    P = (LinkNode)malloc(sizeof(LinkNode));
    P = Q->front;
    *x = P->data;
    if (Q->front == Q->rear) Q->front = Q->rear = NULL;
    else {
        Q->front = P->next;
    }
    free(P);
    return true;
}
上一篇下一篇

猜你喜欢

热点阅读