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;
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
2、运行结果
3、小谈
这是一个链队列的实现代码,链队列是一种比较常用的数据结构,可以用于实现任务队列、消息队列等。代码中的实现比较简单,使用了链表的基本操作:节点的插入和删除。在实现过程中需要注意指针的使用,尤其是头指针和尾指针的维护,否则会导致队列的操作出现问题。另外,代码中还使用了动态内存分配,需要注意内存泄漏和空指针的情况。总之,链队列是一种比较基础的数据结构,掌握好其实现原理和操作,可以帮助我们更好地理解其他的数据结构和算法。