整理过后,思路很清晰。
队列的单链表存储结构:
typedef struct node { int data; struct node *next; }queue_node, *queue; typedef struct { queue front; queue rear; }link_queue;
熟悉每种数据结构的存储结构,实现起来才不会觉得困难。
下面是实现代码:
#include<stdio.h> #include<malloc.h> #define OK 0 #define ERROR -1 #define OVERFLOW 1 #define TRUE 1 #define FALSE 0 typedef struct node { int data; struct node *next; }queue_node, *queue; typedef struct { queue front; queue rear; }link_queue; int init_queue(link_queue *q) { q->rear = (queue)malloc(sizeof(queue_node)); if(!q->rear) exit(OVERFLOW); q->rear->next = NULL; q->front = q->rear; return OK; } int empty(link_queue q) { if( q.rear == q.front) return TRUE; else return FALSE; } int enqueue(link_queue *q, int e) { queue p; p = (queue)malloc(sizeof(queue_node)); if(!p) exit(OVERFLOW); p->data = e; p->next = NULL; q->rear->next = p; q->rear = p; return OK; } int dequeue(link_queue *q, int *e) { queue p; if(q->rear == q->front) return ERROR; // *e = q->front->data; p = q->front->next; *e = p->next->data; q->front->next = p->next; if(q->rear == p) q->rear = q->front; free(p); return OK; } int get_front(link_queue q, int *e) { queue p; if(q.rear == q.front) return ERROR; *e = q.front->data; return OK; } int destroy_queue(link_queue * q) { queue p; while(q->front) { q->rear = q->front->next; free(q->front); q->front = q->rear; } return OK; } int main() { link_queue q; int e1, e2; int i; printf("init_queue\n"); init_queue(&q); printf("enqueue\n"); for(i = 1; i < 10; i++) { if (enqueue(&q, i) == OK); printf("%3d", i); } printf("\n"); printf("dequeue\n"); dequeue(&q, &e1); printf("dequeue: %d\n", e1); printf("get_front\n"); get_front(q, &e2); printf("get front:%d\n", e2); if (empty(q)) printf("empty!\n"); else printf("not empty\n"); if (destroy_queue(&q) == OK) printf("destroyed!\n"); return 0; }
主函数设计的比较简单,但不是重点。
本文出自 “兵疯千里” 博客,请务必保留此出处http://slientradio.blog.51cto.com/7241495/1390869
原文:http://slientradio.blog.51cto.com/7241495/1390869