《数据结构》入门——C语言实现队列链表的各种操作代码分享

C语言实现队列(链表)的创建、初始化、置空、插入、删除、输出队头元素、遍历等操作


代码仅适用于初学者

#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE  100
#define STACKINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1 
typedef int QElemType;
typedef int Status;
typedef struct QNode
{
	QElemType data;
	struct QNode * next;
}QNode,* QueuePtr;

typedef struct
{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

Status InitQueue(LinkQueue *Q)
{
	Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
	if(Q->front==NULL) exit(OVERFLOW);
    Q->front->next=NULL;
	return OK;
}
Status DestroyQueue(LinkQueue *Q)
{
	while(Q->front)                        //front 存在 
	{
		Q->rear=Q->front->next;
		free(Q->front);
		Q->front=Q->rear;
	}
	return OK;
}
Status QueueEmpty(LinkQueue Q)
{
	if(Q.front->next==Q.rear&&Q.rear==NULL)
		return TRUE;
    else
		return FALSE;
}
int QueueLength(LinkQueue Q)
{
	int k=0;
	QueuePtr p;
	p=Q.front->next;
	for(;p!=NULL;)
	{
		p=p->next;
		k++;
	}
	return k;
}
Status GetHead(LinkQueue Q,QElemType *e)
{
	QueuePtr p;
	p=Q.front->next;
	if(Q.front->next==NULL)  return ERROR;
	*e=p->data;
	return OK;
}
Status EnQueue(LinkQueue *Q,QElemType e)
{
	QueuePtr p;
	p=(QueuePtr)malloc(sizeof(QNode));
	if(!p)  exit(OVERFLOW);
	p->data=e;
	p->next=NULL;
	Q->rear->next=p;
	Q->rear=p;
	return OK;
}
Status DeQueue(LinkQueue *Q,QElemType *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;
}
Status ClearQueue(LinkQueue *Q)
{
	while(Q->front->next!=NULL)                        
	{
		Q->rear=Q->front->next;
		Q->front=NULL;
		Q->front=Q->rear;
	}
	return OK;
}
Status print(LinkQueue Q)
{
	QueuePtr p;
	p=Q.front->next;
	while (p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	return TRUE;
}
Status QueueTraverse(LinkQueue Q)
{
	QueuePtr p;
	p=Q.front->next;
    for(;p!=NULL;)
	{ 
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
	return OK;
}
int main()
{
	LinkQueue Q;
	int s=0,e=0;
	int i,j=0;
	InitQueue(&Q);
	printf("初始往构建好的队列里面插入数据:1 2 3 4 5\n");
    for(i=1;i<=5;i++)
		EnQueue(&Q,i);
	printf("现在的队列长度为:%d\n",QueueLength(Q));
	printf("如果返回值为1,则为空队列,若为1,则为非空队列:%d\n",QueueEmpty(Q));
	GetHead(Q,&e);
	printf("现在的队列的队头元素为:%d\n",e);
	DeQueue(&Q,&s);
	printf("将这时候的队列的队头元素删除,返回删除的队头元素为:%d\n",s);
	printf("下面对栈进行visit(访问每一个元素)遍历操作,返回的数据为:\n");
    QueueTraverse(Q);
	printf("若返回值为1,则成功将Q置为空队列:  %d\n",ClearQueue(&Q));
	printf("下一行将输出队列的每一个元素,如果下一行为空行则重置空队列成功。\n");
	QueueTraverse(Q);
	printf("若返回值为1,则成功将Q销毁:   %d\n",DestroyQueue(&Q));
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值