1. 程式人生 > 實用技巧 >《資料結構和演算法:連結串列實現佇列》

《資料結構和演算法:連結串列實現佇列》

寫出先入先出佇列的結構體Queue定義,並實現以下函式:(15分)

1,Queue *create(int size):建立一個能放size個int型別的佇列,返回佇列的指標。

2,int put(Queue *queue, int value):將value入隊,返回0表示成功,-1表示出錯。

3,int get(Queue *queue, int *pvalue):將資料出隊並存入pvalue,返回0表示成功,-1表示出錯。

typedef struct node_t
{
    int data;
    struct node_t *next;
}nodeList;

typedef struct
queue_t { nodeList *head; nodeList *end; int qSize; }Queue;
Queue *create(int size)
{
    Queue *queue = NULL;
    nodeList  *node = NULL;
    int i = 0;

    queue = (Queue *)malloc(sizeof(Queue));
    if(NULL == queue)
    {
        perror("queue malloc:");
        return NULL;
    }
    memset(queue,
0,sizeof(Queue)); node = (nodeList *)malloc(sizeof(nodeList)); if(NULL == node) { perror("node malloc:"); return NULL; } memset(node,0,sizeof(nodeList)); queue->head = node; queue->end = node; for(i=1;i<size;i++) { node = (nodeList *)malloc
(sizeof(nodeList)); if(NULL == node) { perror("node malloc:"); return queue; } memset(node,0,sizeof(nodeList)); node->data = i; queue->end->next = node; queue->end = node; } queue->qSize = size; return queue; }
int put(Queue *queue, int value)
{
    nodeList *node = NULL;

    node = (nodeList *)malloc(sizeof(nodeList));
    if(NULL == node)
    {
        perror("malloc:");
        return -1;
    }
    memset(node,0,sizeof(nodeList));

    node->data = value;

    queue->qSize++;

    if(NULL == queue->head)
    {
        queue->head = node;
        queue->end = node;      
    }
    else
    {
        queue->end->next = node;
    }

    return 0;
}
int get(Queue *queue, int *pvalue)
{
    nodeList *node = NULL;

    if(queue->qSize == 0)
    {
        printf(" queue is empty \n");
        *pvalue = -1;
        return -1;
    }

    *pvalue = queue->head->data;
    node = queue->head->next; 
    free(queue->head);
    queue->head = node;

    queue->qSize--;

    return 0;
}

測試:

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


typedef struct node_t
{
    int data;
    struct node_t *next;
}nodeList;

typedef struct queue_t
{
    nodeList *head;
    nodeList *end;
    int qSize;
}Queue;

Queue *create(int size)
{
    Queue *queue = NULL;
    nodeList  *node = NULL;
    int i = 0;

    queue = (Queue *)malloc(sizeof(Queue));
    if(NULL == queue)
    {
        perror("queue malloc:");
        return NULL;
    }
    memset(queue,0,sizeof(Queue));

    node  =  (nodeList *)malloc(sizeof(nodeList));
    if(NULL == node)
    {
        perror("node malloc:");
        return NULL;
    }

    memset(node,0,sizeof(nodeList));

    queue->head = node;
    queue->end = node;

    for(i=1;i<size;i++)
    {
        node = (nodeList *)malloc(sizeof(nodeList));
        if(NULL == node)
        {
            perror("node malloc:");
            return queue;
        }
        memset(node,0,sizeof(nodeList));
        node->data = i;
        queue->end->next = node;
        queue->end = node;
    }
    
    queue->qSize = size;

    return queue;

}

int put(Queue *queue, int value)
{
    nodeList *node = NULL;

    node = (nodeList *)malloc(sizeof(nodeList));
    if(NULL == node)
    {
        perror("malloc:");
        return -1;
    }
    memset(node,0,sizeof(nodeList));

    node->data = value;

    queue->qSize++;

    if(NULL == queue->head)
    {
        queue->head = node;
        queue->end = node;      
    }
    else
    {
        queue->end->next = node;
    }

    return 0;
}

int get(Queue *queue, int *pvalue)
{
    nodeList *node = NULL;

    if(queue->qSize == 0)
    {
        printf(" queue is empty \n");
        *pvalue = -1;
        return -1;
    }

    *pvalue = queue->head->data;
    node = queue->head->next; 
    free(queue->head);
    queue->head = node;

    queue->qSize--;

    return 0;
}

int getQueueSize(Queue *queue)
{
    return queue->qSize;
}

int test_queue(void)
{
    Queue *queue = NULL;
    int data = -1;
    int initSize = 5;

    queue = create(initSize);

    printf("size : %d \n",getQueueSize(queue));    //size : 5

    for(int i=0;i<initSize+1;i++)
    {
        get(queue,&data);
        printf("data : %d \n",data);      //0 1 2 3 4    queue is empty -1
    }

    printf("size : %d \n",getQueueSize(queue));   // 0

    put(queue,10);
    printf("size : %d \n",getQueueSize(queue));   //1

    put(queue,11);
    printf("size : %d \n",getQueueSize(queue));   //2

    get(queue,&data);
    printf("data : %d \n",data);                  //10

    get(queue,&data);
    printf("data : %d \n",data);                 //11

    printf("size : %d \n",getQueueSize(queue));  //0

}

int main(void)
{
    test_queue();
}