1. 程式人生 > >資料結構-順序佇列(C語言)

資料結構-順序佇列(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<stdio.h>
#include<stdlib.h>
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;
}