链队列是由一个指向头结点和一个指向尾结点的两个指针及链表组成的。遵循数据先进先出的特点,这就意味着它只能从头结点处出队,从尾结点插入。使得删除和插入大大节省了时间,时间复杂度为O(1)。
代码
#include <stdio.h>
#include <malloc.h>
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNodePtr;
typedef struct LinkQueue{
LinkNodePtr* front;
LinkNodePtr* rear;
}*LinkQueuePtr;
LinkQueuePtr initqueue(){
LinkNodePtr *p = (LinkNodePtr*)malloc(sizeof(LinkNodePtr));
LinkQueuePtr tempQueue = (LinkQueuePtr)malloc(sizeof(LinkQueue));
p->next = NULL;
tempQueue->front = p;
tempQueue->rear = p;
return tempQueue;
}
void outputqueue(LinkQueuePtr paraQueue){
LinkNodePtr *p = paraQueue->front->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next ;
}
printf("\n");
}
void enqueue(LinkQueuePtr paraQueue,int paraValue){
LinkNodePtr *p = (LinkNodePtr*)malloc(sizeof(LinkNodePtr));
p->data = paraValue;
p->next = NULL;
paraQueue->rear->next = p;
paraQueue->rear = p;
}
int dequeue(LinkQueuePtr paraQueue){
int x;
LinkNodePtr *p = paraQueue->front->next;
while(p==NULL){
printf("链队为空\n");
return -1;
}
paraQueue->front->next = p->next;
x = p->data;
if(paraQueue->rear == p){
paraQueue->rear = paraQueue->front;
}
free(p);
return x;
}
void testLinkQueue(){
LinkQueuePtr tempQueuePtr;
tempQueuePtr = initqueue();
enqueue(tempQueuePtr, 10);
enqueue(tempQueuePtr, 30);
enqueue(tempQueuePtr, 50);
outputqueue(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);
outputqueue(tempQueuePtr);
}
int main(){
testLinkQueue();
return 1;
}
为了方便理解空间的使用情况,以下将展示内存地址的调试代码。通过对代码运行时指针本身地址,指针指向的地址的分析。可以知道在各个函数中局部变量分配的空间可以重复利用,不过该空间是静态内存,如果动态分配的内存则不能。代码中结点分配的空间是依次相邻的。这里要说一下指针的地址是指针本身的地址,指针的值是其指向的空间的地址。
内存使用情况
运行结果