其实这节的内容也是单链表的特殊操作,这里要记住的是 头指针 被front 指但是它不是队头,front->next(首元结点)才是队头。咱们看代码吧!
#include<stdio.h>
#include<malloc.h>
#define OK 1;
#define ERROR 0;
//----------节点数据结构-----------------------
typedef struct QNode
{
int data;//这里的数据为了简单起见,就不放结构体数据类型了
struct QNode *next;
}QNode,*QueuePtr;
//-----------链队的数据结构---------------------
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//---------------初始化队列-------------------
int InitQueue(LinkQueue &Q)
{
//使得队头队尾都指向头结点
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
Q.front->next=NULL;
return OK;
}
//----------------入队操作-----------------
int EnQueue (LinkQueue &Q,int e)
{
//新建一个节点,pnew指针指向它
QueuePtr pnew;
pnew=(QueuePtr)malloc(sizeof(QNode));
pnew->data=e;
pnew->next=NULL;
Q.rear->next =pnew;
Q.rear=pnew;
return OK;
}
//---------------出队操作-------------------
int DeQueue (LinkQueue &Q ,int &e)
{
QueuePtr p; //临时指针 ,指向要删除的节点
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
//如果删除的是最后一个元素,队尾指针指向头结点;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return OK;
}
//-------------取队头元素-----------------
int GetHead(LinkQueue Q)
{
if(Q.front=Q.rear)
return Q.front->next->data;
}
//--------------输入数据---------------
void Scanf(LinkQueue &Q,int n)
{
int i,data;
for(i=0;i<n;i++)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&data);
EnQueue(Q,data);
}
printf("\n\n");
}
//-----------打印出来看看--------------
void Print (LinkQueue Q)
{
int i=0;
Q.front=Q.front->next;
while(Q.front!=Q.rear)
{
printf("第%d个数是:%d\n",++i,Q.front->data);
Q.front=Q.front->next;
}
printf("第%d个数是:%d\n",++i,Q.front->data);
}
int main()
{
int item;
LinkQueue Q;
InitQueue(Q);
Scanf(Q,4);
Print(Q);
DeQueue(Q,item);
printf("\n出队列的值是:%d\n出队后的队列是:\n",item);
Print(Q);
EnQueue(Q,item);
printf("\n入队后的队列是:\n");
Print(Q);
printf("\n对头元素是:%d\n",GetHead(Q));
return 0;
}