1.1清晰版代码
#include <stdio.h>
#include <malloc.h>
/**
* 链队列的节点.
*/
typedef struct LinkNode{
int data;
LinkNode* next;
}*LinkNodePtr;
/**
* 链队列.
*/
typedef struct LinkQueue{
LinkNodePtr front;
LinkNodePtr rear;
}*LinkQueuePtr;
/**
* Construct an empty queue.
*/
LinkQueuePtr initQueue(){
LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
//The header, the data is not useful.
LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNodePtr));
headerPtr->next = NULL;
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}//Of initQueue
/**
* Output the queue.
*/
void outputLinkQueue(LinkQueuePtr paraQueuePtr){
LinkNodePtr tempPtr = paraQueuePtr->front->next;
while (tempPtr != NULL) {
printf("%d ", tempPtr->data);
tempPtr = tempPtr->next;
}//Of while
printf("\r\n");
}//Of outputLinkQueue
/**
* Enqueue.
*/
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
//Step 1. Create a new node
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
//Step 2. Link to the existing rear
paraQueuePtr->rear->next = tempNodePtr;
//Step 3. It is the new rear
paraQueuePtr->rear = tempNodePtr;
}//Of enqueue
/**
* Dequeue.
* @return The value of the header
*/
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
//Step 1. Is the queue empty?
if (paraQueuePtr->front == paraQueuePtr->rear) {
printf("The queue is empty.\r\n");
return -1;
}//Of if
//Step 2. Change the queue.
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}//Of if
//Step 3. Free space.
// free(tempNodePtr);
tempNodePtr = NULL;
//Step 4. Return.
return resultValue;
}//Of enqueue
/**
* Unit test.
*/
void testLinkQueue(){
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
enqueue(tempQueuePtr, 10);
enqueue(tempQueuePtr, 30);
enqueue(tempQueuePtr, 50);
outputLinkQueue(tempQueuePtr);
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
printf("dequeue gets %d\r\n", dequeue(tempQueuePtr));
enqueue(tempQueuePtr, 8);
outputLinkQueue(tempQueuePtr);
}//Of testLinkQueue
/**
* The entrance.
*/
int main(){
testLinkQueue();
return 1;
}//Of main
2.运行结果;
10 30 50
dequeue gets 10
dequeue gets 30
dequeue gets 50
The queue is empty.
dequeue gets -1
8
Press any key to continue
3.调试版代码
#include <stdio.h>
#include <malloc.h>
/**
* 链队列的节点.
*/
typedef struct LinkNode{
int data;
LinkNode* next;
}*LinkNodePtr;
/**
* 链队列.
*/
typedef struct LinkQueue{
LinkNodePtr front;
LinkNodePtr rear;
}*LinkQueuePtr;
/**
* Construct an empty queue.
*/
LinkQueuePtr initQueue(){
LinkQueuePtr resultPtr;
printf("In initQueue, the address of resultPtr is %d\r\n", &resultPtr);
resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
printf("The value of resultPtr is %d\r\n", resultPtr);
//The header, the data is not useful.
LinkNodePtr headerPtr;
printf("The address of headerPtr is %d\r\n", &headerPtr);
headerPtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
printf("The value of headerPtr is %d\r\n", headerPtr);
headerPtr->next = NULL;
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}//Of initQueue
/**
* Construct an empty queue.
*/
void outputLinkQueue(LinkQueuePtr paraQueuePtr){
LinkNodePtr tempPtr;
printf("In printLinkQueue, the address of tempPtr is %d\r\n", &tempPtr);
tempPtr = paraQueuePtr->front->next;
printf("The value of tempPtr is %d\r\n", tempPtr);
printf("This is a queue: ");
while (tempPtr != NULL) {
printf("%d ", tempPtr->data);
tempPtr = tempPtr->next;
printf("The value of tempPtr is %d\r\n", tempPtr);
}//Of while
}//Of outputLinkQueue
/**
* Enqueue.
*/
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
//Step 1. Create a new node
LinkNodePtr tempNodePtr;
printf("In linkEnqueue, the address of tempNodePtr is %d\r\n", &tempNodePtr);
tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
printf("The value of tempNodePtr is %d\r\n", tempNodePtr);
tempNodePtr->data = paraElement;
tempNodePtr->next = NULL;
//Step 2. Link to the existing rear
paraQueuePtr->rear->next = tempNodePtr;
//Step 3. It is the new rear
paraQueuePtr->rear = tempNodePtr;
}//Of enqueue
/**
* Dequeue.
* @return The value of the header
*/
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
//Step 1. Is the queue empty?
printf("dequeue test 1\r\n");
if (paraQueuePtr->front == paraQueuePtr->rear) {
printf("The queue is empty.\r\n");
return -1;
}//Of if
//Step 2. Change the queue.
printf("dequeue test 2\r\n");
tempNodePtr = paraQueuePtr->front->next;
resultValue = tempNodePtr->data;
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}//Of if
printf("dequeue test 3, the ptr is %d\r\n", tempNodePtr);
//Step 3. Free space.
//free(tempNodePtr);
//Step 4. Return.
printf("trying to dequeue %d\r\n", resultValue);
return resultValue;
}//Of enqueue
/**
* Unit test.
*/
void testLinkQueue(){
printf("Start testing.");
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initQueue();
enqueue(tempQueuePtr, 10);
enqueue(tempQueuePtr, 30);
enqueue(tempQueuePtr, 50);
printf("Before outputLinkQueue.\r\n");
outputLinkQueue(tempQueuePtr);
printf("After outputLinkQueue.\r\n");
printf("dequeue gets %d", dequeue(tempQueuePtr));
printf("dequeue gets %d", dequeue(tempQueuePtr));
printf("dequeue gets %d", dequeue(tempQueuePtr));
printf("dequeue gets %d", dequeue(tempQueuePtr));
}//Of testLinkQueue
/**
* The entrance.
*/
int main(){
testLinkQueue();
return 1;
}//Of main
队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表,头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点
链式队列与前面的队列顺序存储结构有所不同,顺序存储结构的队列在入队时需要进行队满的一个判断,而在链式存储结构中基本不存在空间不够用的情况,因为我们可以根据自己的需求进行空间的开辟,但队列的特性是不变的,依旧是遵循先进先出。
在入队第一个元素时,需要让我们的front指针指向链表的第一个带元素结点,但是如果我们初始化的时候不创建头结点的话,就不需要特殊处理第一个元素的入队操作,而不创建头结点,判断队空就是在初始化队列的时候让front和rear赋值为空指针,就当队头队尾指针都等于NULL的时候队列为空队