严蔚敏版数据结构——链队(队列的链式实现)

其实这节的内容也是单链表的特殊操作,这里要记住的是 头指针 被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;
}


猜你喜欢

转载自blog.csdn.net/cj151525/article/details/84035067
今日推荐