一、总体流程
①首先,创建一个头结点,然后创建一个栈顶指针,并使它的头(frong)和尾(rear)指向头结点;
![](https://img-blog.csdnimg.cn/img_convert/808102242e99460e82f54edc0b356f5a.png)
②其次,创建一个新的结点,然后将头结点的指针next和栈顶指针的指针real指向下一个结点,并将数据传入头结点;(这样front指向第一个数据传入的结点,real指向的就是下一个数据插入的结点)
![](https://img-blog.csdnimg.cn/img_convert/371e67ac0f034511a087e955dfb1cfd6.png)
③然后以此类推;
![](https://img-blog.csdnimg.cn/img_convert/ee1ce6d16a4f4de2af03a37291aa8340.png)
④删除结点就是把栈顶指针的指针front指向头结点的下一个结点,这样之前的front连接就自动断开了;然后断开next连接,并free掉头结点(注意:这时real指向的结点是里面没有数据);
![](https://img-blog.csdnimg.cn/img_convert/6df79df169ba4825b4990ab675671a3b.png)
⑤清空链表就是把除栈顶指针和real指向的没有数据的结点外的结点都清空,并把指针front指向指针real指向的那个结点。
![](https://img-blog.csdnimg.cn/img_convert/57a2c7cbe08f4422b199be779430f8bb.png)
⑥销毁链表就是执行完步骤⑤后清空栈顶指针和它指向的那个结点的空间。
![](https://img-blog.csdnimg.cn/img_convert/ac04e46a12ad4abc9d98e7e51c4872d4.png)
二、代码
①main.c
//main.c
#include"link_que.h"
int main(int argc, char const *argv[])
{
node_t P=creat_que();//创建头结点
que Q=create_link_que(P);//创建链表
push_link_que(Q,10);//入队
push_link_que(Q,20);//入队
push_link_que(Q,25);//入队
print_link_que(Q);//打印
pop_link_que(Q);//出队
print_link_que(Q);//打印
clean_link_que(Q);//清空
print_link_que(Q);//打印
destory_link_que(&Q,&P);//销毁
print_link_que(Q);//打印
return 0;
}
②link_que.c
#include"link_que.h"
//创建头结点
node_t creat_que()
{
node_t P=(node_t)malloc(sizeof(node));
if(P==NULL)
{
printf("申请空间失败\n");
return NULL;
}
P->data=-1;
P->next=NULL;
return P;
}
//创建链表
que create_link_que(node_t P)
{
que Q=(que)malloc(sizeof(link_que));
if(Q==NULL)
{
printf("申请空间失败\n");
return NULL;
}
Q->front=P;
Q->rear=P;
return Q;
}
//创建结点
node_t create_node()
{
node_t Q=(node_t)malloc(sizeof(node));
if(Q==NULL)
{
printf("申请空间失败\n");
return NULL;
}
Q->data=0;
Q->next=NULL;
return Q;
}
//判空
int empty_link_que(que Q)
{
if(Q==NULL)
{
printf("入参为空\n");
return -1;
}
return Q->front==Q->rear?1:0;
}
//入队
void push_link_que(que Q,int data)
{
if(Q==NULL)
{
printf("入参为空\n");
return;
}
node_t new=create_node();
Q->rear->data=data;
Q->rear->next=new;
Q->rear=new;
}
//出队
void pop_link_que(que Q)
{
if(Q==NULL)
{
printf("入参为空\n");
return;
}
if(!empty_link_que(Q))
{
node_t dele=Q->front;
Q->front=Q->front->next;
printf("出队元素为:%d",dele->data);
free(dele);
putchar(10);
}
else
printf("链表队列为空,无法出队\n");
}
//打印
void print_link_que(que Q)
{
if(Q==NULL)
{
printf("入参为空\n");
return;
}
if(!empty_link_que(Q))
{
node_t P=Q->front;
while(P->next!=NULL)
{
printf("%d\n",P->data);
P=P->next;
}
}
else
printf("链表队列为空\n");
}
//清空
void clean_link_que(que Q)
{
if(Q==NULL)
{
printf("入参为空\n");
return;
}
while(Q->front!=Q->rear)
{
pop_link_que(Q);
}
}
//销毁
void destory_link_que(que *Q,node_t *P)
{
if(*Q==NULL)
{
printf("入参为空\n");
return;
}
clean_link_que(*Q);
free(*P);
free(*Q);
*P=NULL;
*Q=NULL;
}
③link_que.h
#ifndef __LINK_QUE_H__
#define __LINK_QUE_H__
#include<stdio.h>
#include<stdlib.h>
//创建链表结点的类型
typedef struct node
{
int data;
struct node*next;
}node,*node_t;
//创建指向链表头和尾的指针(头结点)
typedef struct
{
node_t front;
node_t rear;
}link_que,*que;
node_t creat_que();
que create_link_que(node_t P);
node_t create_node();
int empty_link_que(que Q);
void push_link_que(que Q,int data);
void pop_link_que(que Q);
void print_link_que(que Q);
void clean_link_que(que Q);
void destory_link_que(que *Q,node_t *P);
#endif