链式队列----C语言

 队列的特征就是先进先出,我们采用链式队列进行书写。

对于队列的操作有以下几点

1:初始化队列     2:入队  3:出对  4:展示队列中元素   5:取对头元素   6:销毁队列(当然还有其他的。。。自己补充哈)

话不多说,上代码你们看吧!!!

/*************************************************************************
    > File Name: queue.h
    > Created Time: Sun 22 Jul 2018 08:22:05 PM CST
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define TRUE 1  
#define FALSE 0
typedef int boolean;   //c语言中没有bool类型,只能重定义
typedef int Elemtype;  //元素类型重定义

typedef struct Node   //每一个元素节点结构
{
	struct Node *next;    
	Elemtype data;
}node;

typedef struct queue   //队列结构
{
	 node* qhead;   //头指针
	 node* qtail;   //尾指针
}Queue;


void InitQueue(Queue *que);   //初始化队列

void PushQueue(Queue *que,Elemtype val);  //入队

void show(Queue *que);  //展示队列元素信息

void PopQueue(Queue *que); //出队

Elemtype Getqhead(Queue *que);  //获取队首元素

void Destroy(Queue *que);   //销毁队列


/*************************************************************************
    > File Name: queue.c
    > Created Time: Sun 22 Jul 2018 09:17:11 PM CST
 ************************************************************************/

#include"queue.h"

void InitQueue(Queue *que)
{
	que->qhead=NULL;
	que->qtail=NULL;
}

static node* BuyNode(Elemtype val)   //申请一个节点元素,入队元素
{
	node *q=NULL;
	node *p=(node *)malloc(sizeof(node));  //不能在栈上申请空间,因为不能返回一个栈上的地址或者引用,这个函数结束后栈上空间系统会释放掉的。
	if(p!=NULL)
	{
		p->data=val;
		p->next=NULL;
		q=p;
	}
	return q;
}
void PushQueue(Queue *que,Elemtype val)
{
	assert(que!=NULL);
	node *p=BuyNode(val);
	if(p!=NULL)    //是否申请节点成功
	{
		if(que->qhead==NULL)  //是第一个入队的元素
		{
			que->qhead=p;
			que->qtail=p;
		}
		else    //不是第一个入队的元素,队列中已存在元素
		{
			que->qtail->next=p;
			que->qtail=p;
		}
	}
}

static boolean Is_Empty(Queue *que)  //一个本文件可见的判断队列是否为空
{
	if(que->qhead==que->qtail&&que->qtail==NULL)
	{
		return TRUE;
	}
	else
		return FALSE; 
}

void PopQueue(Queue *que)
{
	assert(que!=NULL);
	if(Is_Empty(que))
	{	
		return;
	}
	node *p=que->qhead;  //用p先标记一会所要释放的元素
	que->qhead=que->qhead->next; //将头指针指向队列中的第二个元素
	if(que->qhead==NULL)  //队列中只有一个元素
	{
		que->qtail=NULL;  //将尾指针赋空,否则释放P,尾指针成为野指针
	}
	free(p);
}

void show(Queue *que)
{
	assert(que!=NULL);

	node *p=que->qhead;
    printf("从队头到尾的元素依次是:");
	while(p!=que->qtail)
	{
		printf("%d  ",p->data);
		p=p->next;
	}
	if(p!=NULL)  //队头元素输出
		printf("%d\n",p->data);
	
}

Elemtype Getqhead(Queue *que)
{
	assert(que!=NULL);

	if(Is_Empty(que))
	{
		return -1111111;   //输出一个错误数值
	}
	else
	{
		return que->qhead->data;
	}
}

void Destroy(Queue *que)
{
	assert(que!=NULL);
	while(que->qhead!=que->qtail)
	{
		PopQueue(que);
		show(que);
	}
	if(que->qhead==que->qtail&&que->qhead!=NULL)
	{
		free(que->qhead);
		que->qhead=NULL;
		que->qtail=NULL;
	}
}


/*************************************************************************
    > File Name: main.c
    > Created Time: Sun 22 Jul 2018 09:18:17 PM CST
 ************************************************************************/

#include"queue.h"

int main()   //测试代码
{
	Queue que;
	InitQueue(&que);
    
	int i=1;
	for(;i<10;i++)
	{
		PushQueue(&que,i*2);
	}   
	show(&que);

    PopQueue(&que);
	show(&que);

	printf("队头元素是:%d\n",Getqhead(&que));

	Destroy(&que);
	show(&que);
	printf("\n");
	exit(0);
}

猜你喜欢

转载自blog.csdn.net/Eunice_fan1207/article/details/81182698