数据结构-顺序队列(C语言)

队列:插入数据只在队尾进行,删除数据只在队头进行。

顺序队列操作会出现 假溢出(tail指向队列最后,进行入队操作时,即使前面有空位置也显示队列已满)

解决:

1.在出队操作后,增加移动元素操作。每次进行完出队操作后,队列中后面的元素向前移动,始终保持队列第一个位置有元素。(每次移动大量元素,效率低)

2.队列首位相连--循环队列


SeqQueue.h

#define QUEUEMAX 15
typedef struct
{
	DATA data[QUEUEMAX];//队列数组 
	int head;//队头 
	int tail;//队尾 
}SeqQueue;

SeqQueue *SeqQueueInit()//初始化队列 
{
	SeqQueue *q;
	if(q=(SeqQueue *)malloc(sizeof(SeqQueue)))
	{
		q->head=0;
		q->tail=0;
		return q;
	}
	else
		return NULL;
}

void SeqQueueFree(SeqQueue *q)//释放队列 
{
	if(q!=NULL) free(q);
}

int SeqQueueIsEmpty(SeqQueue *q)//队列是否为空,空为0 
{
	return (q->head==q->tail);
}

int SeqQueueIsFull(SeqQueue *q)//队列是否为已满,满为1 
{
	return (q->tail==QUEUEMAX);
}

int SeqQueueLen(SeqQueue *q)//返回队列长度 
{
	return (q->tail-q->head);
}

int SeqQueueIn(SeqQueue *q,DATA data)//入队 
{
	if(q->tail==QUEUEMAX){//判断队列q是否已满,满返回0 
		printf("Queue is full!\n");
		return 0;
	}
	else{
		q->data[q->tail++]=data;
		return 1;
	}
}

DATA *SeqQueueOut(SeqQueue *q)//出队 
{
	if(SeqQueueIsEmpty(q))
	{
		printf("Queue is empty!\n");//判断队列是否为空,空返回NULL 
		return NULL;
	}
	else{
		return &(q->data[q->head++]);
	}
}

DATA *SeqQueuePeek(SeqQueue *q)//获取队头元素 
{
	if(SeqQueueIsEmpty(q))
	{
		printf("Queue is empty!\n");
		return NULL;
	}
	else{
		return &(q->data[q->head]);
	}
}

SeqQueueTest.c

#include
#include
typedef struct{
	char key[15];
	char name[15];
}DATA;
#include"SeqQueue.h"

int main()
{
	DATA *data1,data;
	SeqQueue *q;
	q=SeqQueueInit();
	printf("input key name:");//一次入队 
	scanf("%s%s",&data.key,&data.name);
	SeqQueueIn(q,data);
	
	data1=SeqQueueOut(q);//一次出队 
	printf("(%s,%s)",data1->key,data1->name);
	SeqQueueFree(q);
	getch();
	return 0;
}







你可能感兴趣的:(数据结构,C语言)