一、思维导图
二、完成链队的剩下操作:出队、长度、销毁的功能函数的封装。
源文件
#include "stackqueue.h"
//1、创建
queueLinkPtr QueLink_create(){
//在堆区申请链队的大小空间
queueLinkPtr QL = (queueLinkPtr)malloc(sizeof(queueLink));
if(QL == NULL){
printf("申请链队失败!\n");
return NULL;
}
//在堆区申请节点的大小空间
QL->Head = (NodePtr)malloc(sizeof(Node));
if(QL->Head == NULL){
printf("申请节点失败!\n");
free(QL);
return NULL;
}
QL->Head->len = 0; //头结点的数据域为0
QL->Head->Next = NULL;
QL->Tail = QL->Head;
printf("创建成功!\n");
return QL;
}
//2、判空
int QueLink_empty(queueLinkPtr QL){
//判断所接受的顺序队列是否合法
if(QL == NULL){
printf("判空失败!\n");
return -1;
}
return QL->Head == QL->Tail;
}
//3、入队(单链尾插)
int QueLink_into(queueLinkPtr QL, dataType n){
//判断所接受的顺序队列是否合法
if(QL == NULL){
printf("入队失败!\n");
return 0;
}
//申请节点 封装数据
NodePtr N = (NodePtr)malloc(sizeof(Node));
if(N == NULL){
printf("申请节点失败!\n");
return 0;
}
N->data = n;
N->Next = NULL;
//尾插 --- 入队
QL->Tail->Next = N;
QL->Tail = N;
QL->Head->len++; //链表长度自增
return 1;
}
//4、遍历
void QueLink_show(queueLinkPtr QL){
//判断所接受的顺序队列是否合法、非空
if(QL== NULL || QueLink_empty(QL)){
printf("遍历失败!\n");
return;
}
//定义一个遍历节点的指针
NodePtr p = QL->Head;
for(int i=0; i<QL->Head->len; i++){
p = p->Next;
printf("%d ", p->data);
}
putchar(10);
}
//5、出队(单链头删)
int QueLink_out(queueLinkPtr QL){
//判断所接受的顺序队列是否合法、非空
if(QL == NULL || QueLink_empty(QL)){
printf("出队失败!\n");
return 0;
}
//定义一个指针 指向第一个普通节点
NodePtr p = QL->Head->Next;
QL->Head->Next = p->Next;
free(p);
p = NULL;
if(QL->Head->Next = NULL)
QL->Tail = QL->Head;
QL->Head->len--; //链表长度自减
return 1;
}
//6、队长
int QueLink_size(queueLinkPtr QL){
//判断所接受的顺序队列是否合法
if(QL == NULL){
printf("获取失败!\n");
return 0;
}
return QL->Head->len;
}
//7、销毁
void QueLink_destory(queueLinkPtr QL){
//判断所接受的顺序队列是否合法
if(QL == NULL){
printf("销毁失败!\n");
return;
}
while(QL->Head->Next != NULL)
QueLink_out(QL);
free(QL->Head);
free(QL);
QL = NULL;
printf("销毁成功!\n");
}