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 LinkNode));
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 paraElemnet) {
// Step 1. Create a new node.
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
tempNodePtr->data = paraElemnet;
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.
* The value of the header
*/
int dequeue(LinkQueuePtr paraQueuePtr) {
int resulValue;
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;
resulValue = 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 resulValue;
}// of dequeue
/*
* 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.运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/90ee8cf493b127f0c2c651f64d1755ee.png)
3.代码说明
1.我用VS2022编译时,free没有注释掉,代码也能正常运行
2.设置了一个头结点,队列设置了一个头指针,一个尾指针
3.判断队列是否为空只需要判断队列的头指针是否等于尾指针
4.调试代码
#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
5.调试代码的运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/539b3186798b9774a65f4701c4729fc6.png)
6.代码说明
1.局部变量的空间不能重复利用,因为它们的生命周期仅限于函数的执行期间。当函数执行完毕后,局部变量所占用的内存空间会被释放,以便其他变量或程序使用。
举个例子,假设有一个函数用于计算两个数的和:
int add(int a, int b) {
int sum = a + b;
return sum;
}
在函数执行期间,变量`sum`所占用的内存空间是局部变量,它的生命周期仅限于函数执行期间。当函数执行完毕后,变量`sum`所占用的内存空间会被释放,以便其他变量或程序使用。因此,不能重复利用局部变量的空间。
2.指针的地址和值得区别:
指针的地址是指指针本身在内存中的地址,而指针的值是指针所指向的内存地址中存储的数据。
换句话说,指针的地址是指针变量本身在内存中的位置,而指针的值是指针所指向的内存位置中存储的数据。
例如,如果一个指针变量p的地址是0x1000,而它所指向的内存地址中存储的数据是42,那么p的地址是0x1000,p的值是42。