赞
踩
利用动态数组实现了循环队列,这是静态的队列,缺点是需要预设大小,当队列满时,无法再插入新的数据,只有等队头的数据被取走以后才能往队列放入新的数据。
除了动态数组分配实现的队列之外,还可以使用链表实现队列,这种方式动态创建节点需要的内存,当有新的数据节点要加入时,才去申请内存空间,不需要预设大小,整个队列需要的内存空间不需要连续,并且插入删除更容易实现。但是同时也带来存取速度慢的缺点,操作也比数组的方式更加复杂。
其实用链表实现队列的方式十分简单,只需要在单链表的基础上,增加一个尾指针即可。因为队列的特点是“先进先出”,因此我们只需要在一头一尾两个指针,就可以快速地在队头取出数据,在队尾插入数据。
提示:以下是本篇文章正文内容,下面案例可供参考
typedef struct Queue_Node {
QUEUE_TYPE data;
struct Queue_Node *next;
}QueueNode;
QueueNode *head;
QueueNode *tail;
/* * Data queuing */ void enqueue(QUEUE_TYPE value) { QueueNode *new_node; new_node = (QueueNode *)malloc(sizeof(QueueNode)); if (new_node == NULL) perror("malloc fail\n"); new_node->data = value; if (head == NULL) { head = new_node; tail = new_node; } else { tail->next = new_node; tail = new_node; } }
/*
* Data out of queue
*/
void dequeue(void) {
assert(!is_empty());
QueueNode *front_node;
front_node = head;
head = front_node->next;
free(front_node);
if (head == NULL)
tail = NULL;
}
/*
* Is the Queue empty?
* return:
* 0 - is not empty
* 1 - empty
*/
int is_empty(void) {
return head == NULL;
}
/*
* Gets the first data in the queue
*/
QUEUE_TYPE get_head(void) {
assert(!is_empty());
return head->data;
}
/*
* Gets the last data in the queue
*/
QUEUE_TYPE get_tail(void) {
assert(!is_empty());
return tail->data;
}
/*
* Destory Queue
*/
void empty_queue(void) {
while (!is_empty())
dequeue();
}
#include <stdio.h> #include <string.h> #include <malloc.h> #include <assert.h> #define QUEUE_TYPE int typedef struct Queue_Node { QUEUE_TYPE data; struct Queue_Node *next; }QueueNode; QueueNode *head; QueueNode *tail; /* * Is the Queue empty? * return: * 0 - is not empty * 1 - empty */ int is_empty(void) { return head == NULL; } /* * Data queuing */ void enqueue(QUEUE_TYPE value) { QueueNode *new_node; new_node = (QueueNode *)malloc(sizeof(QueueNode)); if (new_node == NULL) perror("malloc fail\n"); new_node->data = value; if (head == NULL) { head = new_node; tail = new_node; } else { tail->next = new_node; tail = new_node; } } /* * Data out of queue */ void dequeue(void) { assert(!is_empty()); QueueNode *front_node; front_node = head; head = front_node->next; free(front_node); if (head == NULL) tail = NULL; } /* * Gets the first data in the queue */ QUEUE_TYPE get_head(void) { assert(!is_empty()); return head->data; } /* * Gets the last data in the queue */ QUEUE_TYPE get_tail(void) { assert(!is_empty()); return tail->data; } /* * Destory Queue */ void empty_queue(void) { while (!is_empty()) dequeue(); } /* * Print Queue information */ void print(void) { printf("List data: "); if (is_empty()) { printf("NULL\n"); } else { QueueNode *node; node = head; while (node) { printf("%d ", node->data); node = node->next; } printf("\n"); printf("front data: %d\t", get_head()); printf("tail data: %d\n", get_tail()); } printf("\n"); } /* * The main function */ int main(int argc, char **argv) { print(); printf("Data queuing\n"); enqueue(10); enqueue(8); enqueue(6); enqueue(4); enqueue(2); enqueue(0); print(); printf("Data out of queue\n"); dequeue(); dequeue(); print(); printf("Data queuing\n"); enqueue(1); enqueue(3); enqueue(5); print(); printf("Empty queue\n"); empty_queue(); print(); } /*-----End of main function-----*/
以上是对链表实现队列的一些理解,如有写的不好的地方,还请各位大佬不吝赐教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。