#include <stdio.h> #include <stdlib.h> // 链表:队列的链式存储结构 typedef struct QueueNode { char date; struct QueueNode *next; }qnode, *QueuePtr; // 指向队列头和尾的指针结构体 typedef struct { QueuePtr front; // 队头指针 QueuePtr rear; // 队尾指针 }queue; int main() { // 构造一个空队列 void InitQueue(queue *q); // 向队尾插入元素 void InsertQueue(queue *q, char e); // 若队列不为空,删除队头元素,并用e返回其值 void DelHead(queue *q, char e ); // 销毁队列 void DestoryQueue(queue *q); // 判断队列是否为空,若空则返回1,不空返回0 int QueueEmpty(queue *q); // 返回队列的长度,即元素个数 int QueueLength(queue *q); // 若队列不为空则返回,用e返回队头元素 char GetHead(queue *q, char e); // 定义 queue q; char e='a'; char t; int temp; InitQueue(&q); InsertQueue(&q,e);InsertQueue(&q,e);InsertQueue(&q,e); DelHead(&q, e); temp = QueueEmpty(&q); if(temp) printf("The queue is empty!\n"); else printf("The queue isn't empty!\n"); temp = QueueLength(&q); printf("The length is:%d\n",temp); t = GetHead(&q, e); printf("%c\n",t); DestoryQueue(&q); return 0; } // 构造一个空队列 void InitQueue(queue *q) { // 第一个队头节为空节点不被利用,但可以存储一些有关队列的信息使用 q->front = q->rear = (qnode *)malloc(sizeof(qnode)); if(!q->front) exit(0); q->front->next = NULL; printf("Success to create queue!\n"); } // 向队尾插入元素 void InsertQueue(queue *q, char e) { qnode *node; node = (qnode *)malloc(sizeof(qnode));// 注意:malloc函数要用指针指向 if(!node) exit(0); node->date = e; node->next = NULL; q->rear->next = node; // 未插入时链队列的最后一个元素的下一个指针域,使其连接到下一个插入元素 q->rear = node; // 表示最后一个元素为node printf("Success to insert:%c\n",e); } // 若队列不为空,删除队头元素,并用e返回其值 void DelHead(queue *q, char e ) { // 定义,node用于指向头结点的下一个,即第一个对头元素 QueuePtr node; // 如果队列为空,则退出 if(q->front == q->rear) exit(0); // 若不为空,则删除后返回删除的队头元素 node = q->front->next; // node指向头结点的下一个节点 e = node->date; // node节点的date赋值给e,以便返回节点信息 q->front->next = node->next; // node的下一个节点赋值给头结点的下一个节点,即删除对头的元素 // 如果只有头结点,没有队头元素时队头指针和队尾指针指向相同的节点 if(q->rear == node) q->rear = q->front; free(node); // 释放删除的节点 printf("Success to delete the head element!\n"); } // 销毁队列,无论空与否均可 void DestoryQueue(queue *q) { while(q->front) { q->rear = q->front->next; // 队列的尾节点指向头结点的下一个节点 free(q->front); // 释放头结点 q->front = q->rear; // 使头结点和尾节点指向同一节点 } printf("Success to destory queue!\n"); } // 判断队列是否为空,若空则返回1,不空返回0 int QueueEmpty(queue *q) { // 如果队列为空 if(q->front->next == NULL) return 1; else return 0; } // 返回队列的长度,即元素个数 int QueueLength(queue *q) { int cnt=0; qnode *node; node = q->front; // 使node指向队头结点 while(node != q->rear) { cnt++; node = node->next; } return cnt; } // 若队列不为空则返回,用e返回队头元素 char GetHead(queue *q, char e) { // 判断队列是否为空,若为空则退出 if(q->front->next == NULL) exit(0); e = q->front->next->date; return e; }
总结:
1、(1)q->front:表示头结点
(2)q->rear:表示尾节点
(3)q->front->next:表示头结点的下一个节点
(4)q->rear->next:表示尾节点的下一个节点
2、warning:'e' is used uninitialized in this function 因为e只定义却未付值,开始给e赋值就解决了
3、注意:构造栈时,第一个队头节为空节点不被利用,但可以存储一些有关队列的信息使用
4、注意:变量要对其赋初值,否则会出错!求队列长度时未赋初值导致队列长度每次运行都是不同的长度值
数据结构队列的基本操作
最新推荐文章于 2024-07-19 17:04:34 发布