鏈式佇列的實現
阿新 • • 發佈:2019-01-06
今天實現以下鏈式的佇列,首先,要清楚對列是什麼:
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(head)進行刪除操作,而在表的後端(tail)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
所以總結一下佇列就是後進前出的一種資料結構,在這裡,我們首先來寫出鏈佇列的實現。
linked_queue.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int datatype;
typedef struct queue
{
datatype data;
struct queue *next;
}Quenode,*PtrQueue;
typedef struct queue_list
{
PtrQueue Head;
PtrQueue Tail;
}LinkQueue, *pLinkQueue;
enum
{
EXIT,
INIT,
DESTORY,
CLEAR,
LENGTH,
ENQUEUE,
DEQUEUE,
PRINTQUEUE
};
void InitQueue(pLinkQueue q);
void DestoryQueue(pLinkQueue q);
void ClearQueue(pLinkQueue q);
int QueueIsEmpty(pLinkQueue q);
int QueueLength(pLinkQueue q);
void GetHead(pLinkQueue q, datatype *p);
void EnQueue(pLinkQueue q ,datatype x);
void Dequeue(pLinkQueue q);
void PrintQueue(pLinkQueue q);
void menu();
#endif //!__QUEUE_H__
linked_queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"
void menu()
{
printf("$$$$$$$$$$$$$$ QUEUE $$$$$$$$$$$$$$$$\n");
printf("$$$$$$$$$$$$$$$$$$$$$¥$$$$$$$$$$$$$$$$$$$$\n");
printf("$$$ 1.init 2.destory $$$\n");
printf("$$$ 3.clear 4.length $$$\n");
printf("$$$ 5.enqueue 6.dequeue $$$\n");
printf("$$$ 7.printqueue 0.EXIT $$$\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
}
void InitQueue(pLinkQueue q)
{
assert(q);
q->Head = q->Tail = (PtrQueue)malloc(sizeof(Quenode));
if (q->Head == NULL)
{
printf("out of memory");
exit(EXIT_FAILURE);
}
q->Head->next = NULL;
}
void DestoryQueue(pLinkQueue q)
{
assert(q);
while (q->Head != NULL)
{
q->Tail = q->Head->next;
free(q->Head);
q->Head = q->Tail;
}
}
void ClearQueue(pLinkQueue q)
{
assert(q);
PtrQueue p = q->Head->next;
while (p != NULL)
{
PtrQueue tmp = p;
p = p->next;
free(tmp);
tmp = NULL;
}
p = q->Head;
q->Head = q->Tail = NULL;
free(p);
}
int QueueIsEmpty(pLinkQueue q)
{
assert(q);
if (q->Head == q->Tail)
return 1;
else
return 0;
}
int QueueLength(pLinkQueue q)
{
assert(q);
PtrQueue cur = q->Head->next;
int count = 0;
while (cur != NULL)
{
count++;
cur = cur->next;
}
return count;
}
void GetHead(pLinkQueue q, datatype *p)
{
assert(q);
if (QueueIsEmpty(q))
{
printf("佇列為空佇列!\n");
}
*p = q->Head->data;
}
void EnQueue(pLinkQueue q , datatype x)
{
assert(q);
PtrQueue cur = q->Head;
PtrQueue newnode = (PtrQueue)malloc(sizeof(Quenode));
if (newnode == NULL)
{
printf("out of memory");
exit(EXIT_FAILURE);
}
newnode->data = x;
newnode->next = NULL;
while (cur->next != NULL)
{
cur = cur->next;
}
cur ->next= newnode;
q->Tail = newnode;
}
void Dequeue(pLinkQueue q)
{
assert(q);
PtrQueue del = NULL,cur=NULL;
if (q->Head == q->Tail)
{
printf("佇列為空\n");
return;
}
cur = q->Head->next;
del = cur;
q->Head ->next= cur->next;
free(del);
del = NULL;
}
void PrintQueue(pLinkQueue q)
{
assert(q);
PtrQueue cur = q->Head->next;
if (q->Head == q->Tail)
return;
while (cur != NULL)
{
printf("%3d", cur->data);
cur = cur->next;
}
printf("\n");
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"
void Test()
{
LinkQueue que;
int input =1 ;
int length = 0;
datatype x = 0;
InitQueue(&que);
while (input)
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case EXIT:
DestoryQueue(&que);
break;
case INIT:
InitQueue(&que);
break;
case DESTORY:
DestoryQueue(&que);
break;
case CLEAR:
ClearQueue(&que);
break;
case LENGTH:
length=QueueLength(&que);
printf("%d\n", length);
break;
case ENQUEUE:
printf("請輸入你所要入隊元素的值:");
scanf("%d", &x);
fflush(stdin);
EnQueue(&que,x);
break;
case DEQUEUE:
Dequeue(&que);
break;
case PRINTQUEUE:
PrintQueue(&que);
break;
default:
input = 1 ;
break;
}
}
}
int main()
{
Test();
system("pause");
return 0;
}