标签:
顺序链表代码 非常简单;
但这个代码会有假溢出的状况出现;
就是在队尾已满的情况下,不断出队后
若在此时进行入队操作 判断队列已满的条件是q->head==q->tail 此时这个条件满足。 但实际队列之前已经出队了好几个,前面还有空余空间,这就是假溢出;(原谅我懒得画图)
假溢出解决办法
1.每次出队后 把所有数据都往前移。这种方法要移动大量数据,效率太低。
2.使用循环队列。这种方法明天再打。
1 #define QUEUEMAX 15 2 typedef struct 3 { 4 DATA data[QUEUEMAX]; //队列数组 5 int head; //队头 6 int tail; //队尾 7 }SeqQueue; 8 9 10 11 SeqQueue *SeqQueueInit() //初始化队列 12 { 13 SeqQueue *q; 14 if(q=(SeqQueue*)malloc(sizeof(SeqQueue))) //分配内存 15 { 16 q->head=0; 17 q->tail=0; 18 return q; 19 } 20 else 21 return NULL; 22 } 23 24 void SeqQueueFree(SeqQueue *q) 25 { 26 if(q!=NULL) 27 free(q); 28 } 29 30 int SeqQueueIsEmpty(SeqQueue *q) 31 { 32 return (q->head==q->tail); //检查队列是否为空 33 } 34 35 int SeqQueueIsFull(SeqQueue *q) 36 { 37 return (q->tail==QUEUEMAX); 38 } 39 40 int SeqQueueLen(SeqQueue *q) //获取队列长度 41 { 42 return (q->tail-q->head); 43 } 44 45 int SeqQueueIn(SeqQueue *q,DATA data) //入队操作 46 { 47 if(q->tail==QUEUEMAX) 48 { 49 printf("队列已满!\n"); 50 return 0; 51 } 52 else 53 { 54 q->data[q->tail]=data; 55 tail++; 56 return 1; 57 } 58 } 59 60 DATA *SeqQueueOut(SeqQueue *q) //出队操作 61 { 62 if(q->head==q->tail) 63 { 64 printf("队列为空!\n"); 65 return NULL; 66 } 67 else 68 { 69 return &(q->data[q->head++]); 70 } 71 } 72 73 DATA *SeqQueuePeek(SeqQueue *q) //获取队头元素 74 { 75 if(SeqQueueIsEmpty(q)) 76 { 77 printf("队列为空!\n"); 78 return NULL; 79 } 80 else 81 { 82 return &(q->data[q->head]); 83 } 84 }
标签:
原文地址:http://www.cnblogs.com/threezj/p/4442856.html