C語言指針實現簡單隊列

節點結構體:

typedef struct _node
{
    int data;
    struct _node *next;
} Node;

隊列結構體:

typedef struct linkedlist
{
    Node *head;
    Node *tail;
} Queue;

操作:

//初始化隊列
void initializeQueue(Queue *queue)
{
    queue->head = NULL;
    queue->tail = NULL;
}

//入隊
void enQueue(Queue *queue, int data)
{
    Node *node = (Node *) malloc(sizeof(Node));
    node->data = data;
    if (queue->head == NULL)
    {
        node->next = NULL;
        queue->tail = node;
    }
    else
    {
        node->next = queue->head;
    }
    queue->head = node;
}


//出隊
int deQueue(Queue *queue)
{
    Node *tmp = queue->head;
    int data;
    //1.只有一個元素
    //2.多個元素
    //   a.遍歷到tail上一個tmp
    //   b.保存tail的值並free tail所指向的內存
    //   c.tail指向tmp
    if (queue->head == NULL)
    {
        data = -1;
    }
    else if (queue->head == queue->tail)
    {
        data = tmp->data;
        queue->head = queue->tail = NULL;
        free(tmp);
    }
    else
    {
        while (tmp->next != queue->tail)
        {
            tmp = tmp->next;
        }
        data = queue->tail->data;
        free(queue->tail);
        queue->tail = tmp;
        queue->tail->next = NULL;

//      queue->tail = tmp;
//      tmp = tmp->next;
//      queue->tail->next = NULL;
//      data = tmp->data;
//      free(tmp);
    }
    return data;
}

void freeAll(Queue *queue)
{
    while(deQueue(queue) != -1);
    printf("\nFree Complete!\n");
    return;
}

void endl()
{
    printf("\n");
}

int main()
{
    Queue queue;
    initializeQueue(&queue);
    enQueue(&queue, 1);
    enQueue(&queue, 2);
    enQueue(&queue, 3);
    enQueue(&queue, 4);
    enQueue(&queue, 5);

    printf("%d\n", queue.tail->data);

    printf("%d ", deQueue(&queue));
    printf("%d ", deQueue(&queue));     //1 2
    // queue : 3 4 5
    endl();

    enQueue(&queue, 10);
    enQueue(&queue, 56);
    enQueue(&queue, 999);  //queue: 3 4 5 10 56 999

    printf("%d ", deQueue(&queue));
    printf("%d ", deQueue(&queue));
    printf("%d ", deQueue(&queue));
    printf("%d ", deQueue(&queue));
    printf("%d ", deQueue(&queue));
    printf("%d ", deQueue(&queue));
    printf("%d ", deQueue(&queue));

    freeAll(&queue);
    return 0;
}

小結:隊列實現基於鏈表,enQueue入隊操作基於addHead

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