链队列
链队列的节点
typedef struct LinkNode {
int data;
LinkNode *next;
} *LinkNodePtr;
链队列
typedef struct LinkQueue {
LinkNodePtr front;
LinkNodePtr rear;
} *LinkQueuePtr;
生成链队列
LinkQueuePtr initQueue() {
//定义链表的头指针 和 尾指针
LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(struct LinkQueue));
//定义链表 申请空间
LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof( LinkNodePtr));
//初始化
headerPtr->next = NULL;
//指向链表
resultPtr->front = headerPtr;
resultPtr->rear = headerPtr;
return resultPtr;
}
打印
void outputLinkQueue(LinkQueuePtr paraQueuePtr) {
//申请临时变量 复制头指针 然后循环往后打印
LinkNodePtr tempPtr = paraQueuePtr->front->next;
while (tempPtr != NULL) {
printf("%d ", tempPtr->data);
tempPtr = tempPtr->next;
}
printf("\r\n");
}
增添节点
(尾巴添加)
void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
//创建新节点
LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(struct LinkNode));
//给值
tempNodePtr->data = paraElement;
//next == NULL;
tempNodePtr->next = NULL;
//这里是在尾巴加上一个节点
//连上尾巴
paraQueuePtr->rear->next = tempNodePtr;
//尾指针重新指向尾巴
paraQueuePtr->rear = tempNodePtr;
}
删除节点
int dequeue(LinkQueuePtr paraQueuePtr) {
int resultValue;
LinkNodePtr tempNodePtr;
//if 判断链表是否为空
if (paraQueuePtr->front == paraQueuePtr->rear) {
printf("The queue is empty.\r\n");
return -1;
}
//复制头节点
tempNodePtr = paraQueuePtr->front->next;
//保存其值以返回
resultValue = tempNodePtr->data;
//让头节点的next指向下一个节点的下一个节点
//这样下一个节点就没了
paraQueuePtr->front->next = paraQueuePtr->front->next->next;
//如果只有一个节点 就没有上述操作的必要了
//我觉得放上面好一点 但是都这样放了我也就表达表达
if (paraQueuePtr->rear == tempNodePtr) {
paraQueuePtr->rear = paraQueuePtr->front;
}
//防止出现野指针
tempNodePtr = NULL;
//Return.
return resultValue;
}
测试代码`
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);
}
int main() {
testLinkQueue();
return 1;
}