《資料結構和演算法:連結串列實現佇列》
阿新 • • 發佈:2020-12-27
寫出先入先出佇列的結構體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 structqueue_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(); }