队列是和栈相反的一中线性结构,栈的后进先出LIFO结构,而队列是先进先出FIFO结构。它只允许在表的一端进行插入,而在另一端进行删除。
1 /** 2 和栈相反,队列是一种先进先出FIFO的结构,包括队头front,队尾rear 3 使用链式结构表示队列时,分别一个头指针和尾指针。为操作方便,链队列也有一个头结点,则空的队列的判断条件就是 4 头指针和尾指针都指向头结点 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 //*************************单链队列的存储结构********************************** 10 typedef struct QNode 11 { 12 int data; 13 QNode *next; 14 }QNode,*QuenePtr; 15 typedef struct 16 { 17 QuenePtr front; //队头指针 18 QuenePtr rear; //队尾指针 19 }LinkQuene; 20 21 //**************************基本操作算法说明************************************ 22 23 //***************************构造一个空队列************************************* 24 void InitQuene(LinkQuene &Q) 25 { 26 //构造一个空队列Q 27 Q.front = (QuenePtr)malloc(sizeof(QNode)); 28 if (!Q.front) 29 { 30 printf("存储分配失败,任意键退出! "); 31 getchar(); 32 exit(1); 33 } 34 Q.rear = Q.front; 35 Q.front ->next = NULL; 36 } 37 //*****************************输出队列元素************************************* 38 void PrintQuene(LinkQuene Q) 39 { 40 if (Q.front == Q.rear) 41 { 42 printf("该队列为空,无法输出!任意键退出! "); 43 getchar(); 44 exit(1); 45 } 46 QNode *p = Q.front->next;//另p指向第一个数据元素 47 while(p->next) 48 { 49 printf("%d ", p->data); 50 p = p -> next; 51 } 52 //输出队尾数据 53 printf("%d ",Q.rear->data); 54 } 55 56 57 //*******************************销毁队列************************************** 58 void DestroyQuene(LinkQuene &Q) 59 { 60 //销毁队列,不是置空,从前向后一个一个删除 61 while(Q.front) 62 { 63 Q.rear = Q.front; 64 free(Q.front); 65 Q.front = Q.rear; 66 } 67 } 68 69 //********************************队列的数据元素插入***************************** 70 void EnQuene(LinkQuene &Q,int e) 71 { 72 //插入元素e作为队列新的队尾元素 73 QuenePtr p = (QuenePtr)malloc(sizeof(QNode)); 74 if (!p) 75 { 76 printf("存储分配失败,任意键退出! "); 77 getchar(); 78 exit(1); 79 } 80 p -> data = e; 81 p -> next = NULL; 82 //插入p结点 83 Q.rear ->next = p; 84 Q.rear = p; 85 } 86 87 //*******************************队列数据元素的删除******************************** 88 void DeQuene(LinkQuene &Q) 89 { 90 //若队列不空,则删除Q的队头元素,否则,报错 91 if (Q.front == Q.rear) 92 { 93 printf("队列Q为空,无法删除!任意键退出 "); 94 getchar(); 95 exit(1); 96 } 97 98 QuenePtr p = Q.front -> next; 99 Q.front -> next = p -> next; 100 if (Q.rear == p) 101 { 102 //只有一个结点元素的情况 103 Q.rear = Q.front; 104 } 105 free(p); 106 } 107 108 109 int main() 110 { 111 LinkQuene Q; 112 //初始化队列Q 113 InitQuene(Q); 114 115 //构造队列 116 int count;//初始队列元素个数 117 int value;//初始队列元素值 118 printf("请输入初始队列的元素个数:"); 119 scanf("%d",&count); 120 printf("请依次输入这些数据元素:"); 121 for (int i = 0; i < count; ++i) 122 { 123 scanf("%d",&value); 124 EnQuene(Q,value); 125 } 126 printf("当前队列的元素为:"); 127 PrintQuene(Q); 128 129 //插入队列尾元素 130 printf("请输入插入值:"); 131 scanf("%d",&value); 132 EnQuene(Q,value); 133 printf("插入后队列的元素为:"); 134 PrintQuene(Q); 135 136 //删除队列头元素 137 DeQuene(Q); 138 printf("删除后队列的元素为:"); 139 PrintQuene(Q); 140 return 0; 141 }