- 链队列
- 链队列的初始化
- 队列的打印
- 入队
- 出队
- 完整代码以及运行结果
- 循环队列
- 初始化队列
- 入队
- 出队
- 打印队列
- 完整代码以及运行结果
- 总结
// 链队列的初始化
LinkQueuePtr initQueue(){
LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNodePtr));
headerPtr->next = NULL;
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}
队列的打印
// 队列的打印
void outputLinkQueue(LinkQueuePtr paraQueuePtr){
LinkNodePtr tempPtr = paraQueuePtr->front->next;
while (tempPtr != NULL) {
printf("%d ", tempPtr->data);
tempPtr = tempPtr->next;
}
printf("rn");
}
入队
// 入队
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
// 第一步:建立一个新的节点
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
// 第二步:将新节点连接到当前队列的末尾
paraQueuePtr->rear->next = tempNodePtr;
// 第三步:将新节点变为新的队列的末尾
paraQueuePtr->rear = tempNodePtr;
}
出队
// 出队
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
//第一步:检查当前队列是否为空
if (paraQueuePtr->front == paraQueuePtr->rear) {
printf("当前队列为空.rn");
return -1;
}
//第二步:改变队列
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}
tempNodePtr = NULL;
return resultValue;
}
完整代码以及运行结果
#include循环队列 初始化队列#include typedef struct LinkNode{ int data; struct LinkNode* next; }*LinkNodePtr; typedef struct LinkQueue{ LinkNodePtr front; LinkNodePtr rear; }*LinkQueuePtr; // 链队列的初始化 LinkQueuePtr initQueue(){ LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue)); LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNode)); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; } // 队列的打印 void outputLinkQueue(LinkQueuePtr paraQueuePtr){ LinkNodePtr tempPtr = paraQueuePtr->front->next; while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; } printf("rn"); } // 入队 void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { // 第一步:建立一个新的节点 LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode)); tempNodePtr->data = paraElement; tempNodePtr->next = NULL; // 第二步:将新节点连接到当前队列的末尾 paraQueuePtr->rear->next = tempNodePtr; // 第三步:将新节点变为新的队列的末尾 paraQueuePtr->rear = tempNodePtr; } // 出队 int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; //第一步:检查当前队列是否为空 if (paraQueuePtr->front == paraQueuePtr->rear) { printf("当前队列为空.rn"); return -1; } //第二步:改变队列 tempNodePtr = paraQueuePtr->front->next; resultValue = tempNodePtr->data; paraQueuePtr->front->next = paraQueuePtr->front->next->next; if (paraQueuePtr->rear == tempNodePtr) { paraQueuePtr->rear = paraQueuePtr->front; } tempNodePtr = NULL; return resultValue; } // 测试代码 void testLinkQueue(){ LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); printf("测试入队操作rn"); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); outputLinkQueue(tempQueuePtr); printf("入队操作测试结束rn"); printf("n"); printf("测试出队操作rn"); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("出队操作测试结束rn"); } int main(){ testLinkQueue(); return 1; }//Of main
CircleIntQueuePtr initQueue() {
CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
resultPtr->head = 0;
resultPtr->tail = 0;
return resultPtr;
}
入队
// 入队
void enqueue(CircleIntQueuePtr paraPtr, int paraValue) {
if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) {
printf("队列已经满了.rn");
return;
}
paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
paraPtr->tail++;
}
出队
// 出队
int dequeue(CircleIntQueuePtr paraPtr) {
int resultValue;
if (paraPtr->head == paraPtr->tail) {
printf("当前队列为空.rn");
return -1;
}
resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
paraPtr->head++;
return resultValue;
}
打印队列
// 打印队列
void outputLinkQueue(CircleIntQueuePtr paraPtr){
int i;
if (paraPtr->head == paraPtr->tail) {
printf("Empty queue.");
return;
}
printf("Elements in the queue: ");
for (i = paraPtr->head; i < paraPtr->tail; i++) {
printf("%d, ", paraPtr->data[i % TOTAL_SPACE]);
}
printf("rn");
}
完整代码以及运行结果
#include总结#include #define TOTAL_SPACE 5 typedef struct CircleIntQueue{ int data[TOTAL_SPACE]; int head; int tail; }*CircleIntQueuePtr; // 初始化队列 CircleIntQueuePtr initQueue() { CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue)); resultPtr->head = 0; resultPtr->tail = 0; return resultPtr; } // 入队 void enqueue(CircleIntQueuePtr paraPtr, int paraValue) { if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) { printf("队列已经满了.rn"); return; } paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue; paraPtr->tail++; } // 出队 int dequeue(CircleIntQueuePtr paraPtr) { int resultValue; if (paraPtr->head == paraPtr->tail) { printf("当前队列为空.rn"); return -1; } resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE]; paraPtr->head++; return resultValue; } // 打印队列 void outputLinkQueue(CircleIntQueuePtr paraPtr){ int i; if (paraPtr->head == paraPtr->tail) { printf("空队列."); return; } printf("当前队列存在元素: "); for (i = paraPtr->head; i < paraPtr->tail; i++) { printf("%d, ", paraPtr->data[i % TOTAL_SPACE]); } printf("rn"); } // 测试函数 void testLinkQueue(){ int i = 10; CircleIntQueuePtr tempPtr = initQueue(); for (; i < 16; i ++) { enqueue(tempPtr, i); } outputLinkQueue(tempPtr); for (i = 0; i < 6; i ++) { printf("从队列中删除元素:%drn", dequeue(tempPtr)); } } int main(){ testLinkQueue(); return 1; }
对于循环队列和链队列,循环队列一般都是事先申请好空间,使用期间不会释放,相较而言,链队列每次申请和释放结点都存在一些时间开销。而在空间上来说的话,循环队列必须有一个固定的长度,这也导致了循环队列存在空间浪费的问题,而链队列则不存在这个问题,它相较于循环队列来说要更加灵活。



