2023-04-01-队链LinkQueue的基本操作
//队链
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef struct LinkNode//定义队链结点
{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct
{
LinkNode *front,*rear;
}*LinkQueue;
void initLinkQueue(LinkQueue *Q)//队链初始化
{
(*Q)=(LinkQueue)malloc(sizeof(LinkQueue));//Q是一个指针,所以需要进行初始化,否则便是一个野指针,没有办法赋值
(*Q)->front = (*Q)->rear = (LinkNode *)malloc(sizeof(LinkNode));//让front和rear指向头结点
(*Q)->front->next = NULL;
}
bool isEmpty(LinkQueue Q)//判断队链是否为空
{
if(Q->front == Q->rear)
{
return true;
}
else
{
return false;
}
}
void EnLinkQueue(LinkQueue *Q,int e)//入队操作
{
LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=e;
p->next=NULL;
(*Q)->rear->next=p;
(*Q)->rear=p;
}
bool DeLinkQueue(LinkQueue *Q,int *e)//出队操作
{
if(isEmpty(*Q))
{
return false;
}
else
{
*e=(*Q)->front->next->data;//因为front指向的是头结点,所以删除的是front的next
LinkNode *p;
p=(*Q)->front->next;//因为front指向的是头结点,所以删除的是front的next
(*Q)->front->next=p->next;
if((*Q)->rear==p)
{
(*Q)->rear=(*Q)->front;//当队链中只有一个结点时,即rear指向的结点,则删除后让rear和front都指向头结点
}
free(p);
return true;
}
}
int main()
{
LinkQueue Q;
initLinkQueue(&Q);
EnLinkQueue(&Q,666);
EnLinkQueue(&Q,888);
int *e;
int a=0;
e=&a;
printf("front_value: %d rear_value: %d\n",Q->front->next->data,Q->rear->data);
DeLinkQueue(&Q,e);
printf("delete_value: %d",*e);
printf("front_value: %d rear_value: %d\n",Q->front->next->data,Q->rear->data);
return 0;
}
C++:
//队链
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef struct LinkNode//定义队链结点
{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct
{
LinkNode *front,*rear;
}*LinkQueue;
void initLinkQueue(LinkQueue &Q)//队链初始化
{
Q=(LinkQueue)malloc(sizeof(LinkQueue));//Q是一个指针,所以需要进行初始化,否则便是一个野指针,没有办法赋值
Q->front = Q->rear = (LinkNode *)malloc(sizeof(LinkNode));//让front和rear指向头结点
Q->front->next = NULL;
}
bool isEmpty(LinkQueue Q)//判断队链是否为空
{
if(Q->front == Q->rear)
{
return true;
}
else
{
return false;
}
}
void EnLinkQueue(LinkQueue &Q,int e)//入队操作
{
LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
bool DeLinkQueue(LinkQueue &Q,int *e)//出队操作
{
if(isEmpty(Q))
{
return false;
}
else
{
*e=Q->front->next->data;//因为front指向的是头结点,所以删除的是front的next
LinkNode *p;
p=Q->front->next;//因为front指向的是头结点,所以删除的是front的next
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear=Q->front;//当队链中只有一个结点时,即rear指向的结点,则删除后让rear和front都指向头结点
}
free(p);
return true;
}
}
int main()
{
LinkQueue Q;
initLinkQueue(Q);
EnLinkQueue(Q,666);
EnLinkQueue(Q,888);
int *e;
int a=0;
e=&a;
printf("front_value: %d rear_value: %d\n",Q->front->next->data,Q->rear->data);
DeLinkQueue(Q,e);
printf("delete_value: %d",*e);
printf("front_value: %d rear_value: %d\n",Q->front->next->data,Q->rear->data);
return 0;
}