摘要: 队列的提出, 也是想获得 O ( 1 ) O(1) O(1) 的时间复杂度.
1. 代码先上代码, 再说废话.
1.1 清晰版代码#include2. 运行结果#include typedef struct LinkNode{ int data; LinkNode* next; }*LinkNodePtr; typedef struct LinkQueue{ LinkNodePtr front; LinkNodePtr rear; }*LinkQueuePtr; LinkQueuePtr initQueue(){ LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue)); //The header, the data is not useful. LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr)); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; }//Of initQueue void outputLinkQueue(LinkQueuePtr paraQueuePtr){ LinkNodePtr tempPtr = paraQueuePtr->front->next; while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; }//Of while printf("rn"); }//Of outputLinkQueue void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { //Step 1. Create a new node LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr)); 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 int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; //Step 1. Is the queue empty? if (paraQueuePtr->front == paraQueuePtr->rear) { printf("The queue is empty.rn"); 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 void testLinkQueue(){ LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); outputLinkQueue(tempQueuePtr); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); printf("dequeue gets %drn", dequeue(tempQueuePtr)); enqueue(tempQueuePtr, 8); outputLinkQueue(tempQueuePtr); }//Of testLinkQueue int main(){ testLinkQueue(); return 1; }//Of main
10 30 50 dequeue gets 10 dequeue gets 30 dequeue gets 50 The queue is empty. dequeue gets -1 8 Press any key to continue3. 代码说明
- 用到了一个头结点, 一个头指针,一个尾指针.
- 判断队列是否为空, 只需要看头指针是否等于尾指针.
- 为啥不让我 free?
#include5. 代码说明#include typedef struct LinkNode{ int data; LinkNode* next; }*LinkNodePtr; typedef struct LinkQueue{ LinkNodePtr front; LinkNodePtr rear; }*LinkQueuePtr; LinkQueuePtr initQueue(){ LinkQueuePtr resultPtr; printf("In initQueue, the address of resultPtr is %drn", &resultPtr); resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue)); printf("The value of resultPtr is %drn", resultPtr); //The header, the data is not useful. LinkNodePtr headerPtr; printf("The address of headerPtr is %drn", &headerPtr); headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr)); printf("The value of headerPtr is %drn", headerPtr); headerPtr->next = NULL; resultPtr->front = headerPtr; resultPtr->rear = headerPtr; return resultPtr; }//Of initQueue void outputLinkQueue(LinkQueuePtr paraQueuePtr){ LinkNodePtr tempPtr; printf("In printLinkQueue, the address of tempPtr is %drn", &tempPtr); tempPtr = paraQueuePtr->front->next; printf("The value of tempPtr is %drn", tempPtr); printf("This is a queue: "); while (tempPtr != NULL) { printf("%d ", tempPtr->data); tempPtr = tempPtr->next; printf("The value of tempPtr is %drn", tempPtr); }//Of while }//Of outputLinkQueue void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) { //Step 1. Create a new node LinkNodePtr tempNodePtr; printf("In linkEnqueue, the address of tempNodePtr is %drn", &tempNodePtr); tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr)); printf("The value of tempNodePtr is %drn", 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 int dequeue(LinkQueuePtr paraQueuePtr) { int resultValue; LinkNodePtr tempNodePtr; //Step 1. Is the queue empty? printf("dequeue test 1rn"); if (paraQueuePtr->front == paraQueuePtr->rear) { printf("The queue is empty.rn"); return -1; }//Of if //Step 2. Change the queue. printf("dequeue test 2rn"); 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 %drn", tempNodePtr); //Step 3. Free space. //free(tempNodePtr); //Step 4. Return. printf("trying to dequeue %drn", resultValue); return resultValue; }//Of enqueue void testLinkQueue(){ printf("Start testing."); LinkQueuePtr tempQueuePtr; tempQueuePtr = initQueue(); enqueue(tempQueuePtr, 10); enqueue(tempQueuePtr, 30); enqueue(tempQueuePtr, 50); printf("Before outputLinkQueue.rn"); outputLinkQueue(tempQueuePtr); printf("After outputLinkQueue.rn"); 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 int main(){ testLinkQueue(); return 1; }//Of main
运行本程序,画出内存使用示意图,并回答如下问题:
- 运行过程中,哪些变量分配在相邻的空间?
- 局部变量的空间能否重复利用?举例说明。
- 指针的地址和值的区别是什么?



