功能和函数借口和用数组实现队列数据结构一致~~~它和前者的不同在于可以实现任意长的队列,但缺点在于需要频繁地调用系统函数来分配和维护对内存~~~具体采用哪种方式可能要看具体的应用场景!!! /************************************************************************/ /* author : thomas E-mail: chenhua308@gmail.com */ /************************************************************************/ //非循环队列(链表实现) #include <stdio.h> #include <malloc.h> //#define MAXSIZE 5 typedef int T; typedef struct tag { T element; struct tag * link; } NODE; typedef struct { NODE *front, *rear; int count; //加入这个计数器的想法是为了应对队列为空时的入队列操作 } QUEUE; //创建队列——链表实现 void creat( QUEUE *queue ) { NODE *newnode; newnode = (NODE *)malloc(sizeof(NODE)); queue -> count = 0; newnode -> link = NULL; queue -> front = newnode; queue -> rear = newnode; } int is_empty( QUEUE queue ) { if ( queue.count == 0 ) { return 1; } else return 0; } //读队列头得数据但不出队列 void readqueue( QUEUE queue ) //just read the value { if (1 == is_empty( queue ) ) { printf("the queue is empty! no number is available to read!/n"); } else { printf("the first number is %d /n", queue.front->element); } } void in_queue( QUEUE *queue, T value ) { NODE *newnode; if ( queue -> count == 0 ) //其实换成0 == queue -> count 写法更成熟 { queue -> rear -> element = value; queue -> count ++; } else { newnode = (NODE *)malloc(sizeof(NODE)); newnode -> element = value; queue -> rear -> link = newnode; queue -> rear = newnode; queue -> count ++; } } T out_queue( QUEUE *queue ) { NODE *temp; T tmp; //为释放内存 、返回节点内容声明的中间变量 if ( 0 == queue -> count ) { printf("the queue is empty! no number is available! /n"); return 0; //这里的设置是不合理的暂时主要设置吧 } else { if ( 1 == queue -> count ) //若仅有一个元素是不释放内存的 { queue -> count --; return queue -> front -> element; } else { temp = queue -> front; tmp = queue -> front -> element; queue -> front = queue ->front -> link; free(temp); queue -> count --; return tmp; } } } //打印队列 void print( QUEUE queue ) { int i = 1; if ( 1 == is_empty(queue)) { printf("the queue is empty! no number can be printed! /n"); } else { printf("the number of queue is %d /n", queue.count); for ( i; i <= queue.count; i++) { printf("the %d number is %d /n", i, queue.front -> element ); queue.front = queue.front -> link; } } } //test functions void main(int argc, char *argv[]) { QUEUE queue; creat(&queue); //out_queue(&queue); in_queue(&queue, 2); print(queue); in_queue(&queue, 4); print(queue); in_queue(&queue, 5); print(queue); in_queue(&queue, 6); print(queue); in_queue(&queue, 1); print(queue); out_queue(&queue); print(queue); in_queue(&queue, 9); print(queue); //out_queue(&queue); //print(queue); }