队列实现

队列(queue): 一种先进先出(first in first out)FIFO的线性表
只允许在表的一端进行插入,而在表的另一端删除元素。

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <stdlib.h>

typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;

int InitQueue(LinkQueue &Q){
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front)
exit(-1);
Q.front->next = NULL;
return 1;
}

int EnQueue(LinkQueue &Q, QElemType e){
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p){
exit(-1);
}
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return 1;
}

int DeQueue(LinkQueue &Q, QElemType &e){
if (Q.front == Q.rear)
return -1;
QueuePtr p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)
Q.rear = Q.front;
free(p);
return 1;
}

int DestroyQueue(LinkQueue &Q){
while (Q.front){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return 1;
}

int ClearQueue(LinkQueue &Q){
Q.front = Q.rear;
Q.front->next = NULL;
return 1;
}

int QueueEmpty(LinkQueue Q){
return (Q.front->next ==NULL && Q.rear->next == NULL) ? 1 : 0;
}
int QueueLength(LinkQueue Q){
int length=0;
QueuePtr p = Q.front->next;
while (p){
length++;
p = p->next;
}
return length;
}
int GetHead(LinkQueue &Q, QElemType &e){
e = Q.front->next->data;
return 1;
}
int QueueTraverse(LinkQueue Q, int (*visit)(QueuePtr p)){
QueuePtr p = Q.front->next;
while(p){
visit(p);
p = p->next;
}
printf("\n");
return 1;
}
int data_output(QueuePtr p){
printf("%d ", p->data);
return 1;
}
int main(){
int data,data2;
LinkQueue Q;
InitQueue(Q);
int a[5] = { 0, 1, 2, 3, 4 };
for (int i = 0; i < 5; i++){
EnQueue(Q, i);
}
QueueTraverse(Q, data_output);
DeQueue(Q, data);
printf("出队%d\n", data);
QueueTraverse(Q, data_output);
printf("长度%d\n", QueueLength(Q));
if (!(GetHead(Q, data2))){
printf("error");
return -1;
}
printf("头结点%d\n", data2);
return 0;
}

文章目录
,