队列的链表存储结构

队列的链表存储结构实现

FILE1:

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

#ifndef _LINKQUEUE_H
#define _LINKQUEUE_H

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


typedef struct QUEUENODE{
struct QUEUENODE *next;
}QueueNode;

// 队列结构体
typedef struct LISTQUEUE{
QueueNode header;
int ListQueueSize;

QueueNode *tail;

} ListQueue;

typedef void *LinkQueue;

// 初始化
LinkQueue init_LinkQueue();

// 入队
void push_LinkQueue(LinkQueue q, void *data);

// 出队
void pop__LinkQueue(LinkQueue q);

// 队列大小
int size_LinkQueue(LinkQueue q);

// 队列是否为空
bool isEmpty_LinkQueue(LinkQueue q);

// 队列头
void *front_LinkQueue(LinkQueue q);

// 队列尾
void *back_LinkQueue(LinkQueue q);

void destory_LinkQueue(LinkQueue q);

#endif //_LINKQUEUE_H

FILE2:

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "linkQueue.h"

// 初始化
LinkQueue init_LinkQueue() {

ListQueue *queue = malloc(sizeof(ListQueue));
if (queue == NULL) {
return NULL;

}


queue->header.next = NULL;
queue->ListQueueSize = 0;
queue->tail = &queue->header;

return queue;


}

void push_LinkQueue(LinkQueue lq, void *data) {

if (lq == NULL || data == NULL) {
return;
}

ListQueue *queue = lq;
QueueNode *qNode = data;

// 尾插
queue->tail->next = qNode;
qNode->next = NULL;

queue->tail = qNode;

queue->ListQueueSize++;

}

void pop__LinkQueue(LinkQueue q) {

if (q == NULL) {
return;
}

ListQueue *listQueue = q;

// 没有要删除的元素
if (listQueue->ListQueueSize == 0) {
return;
}

// 如果只有一个节点,则将尾部节点指向头节点。
if (listQueue->ListQueueSize == 1) {
listQueue->header.next = NULL;
listQueue->tail = &listQueue->header;
listQueue->ListQueueSize--;
return;
}

// 大于一个节点的情况
QueueNode *headNode = listQueue->header.next;

listQueue->header.next = headNode->next;

listQueue->ListQueueSize--;
}

int size_LinkQueue(LinkQueue q) {
if (q == NULL){
return -1;
}

ListQueue *queue = q;

return queue->ListQueueSize;

}

bool isEmpty_LinkQueue(LinkQueue q) {
if (q == NULL){
return -1;
}

ListQueue *queue = q;

if (queue->ListQueueSize == 0){
return true;

}

return false;

}



void *front_LinkQueue(LinkQueue q){
if (q == NULL){
return NULL;
}

ListQueue *queue = q;

return queue->header.next;

}
void *back_LinkQueue(LinkQueue q){
if (q == NULL){
return NULL;
}

ListQueue *queue = q;

return queue->tail;

}

void destory_LinkQueue(LinkQueue q){
if (q == NULL){
return;
}

free(q);
q = NULL;

}

FILE3:

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

#include "linkQueue.h"

struct Person {
void *node;
char name[64];
int age;
};

void test01() {
//初始化队列
LinkQueue myQueue = init_LinkQueue();

//准备数据
struct Person p1 = {NULL, "aaa", 10};
struct Person p2 = {NULL, "bbb", 20};
struct Person p3 = {NULL, "ccc", 30};
struct Person p4 = {NULL, "ddd", 40};


//入队
push_LinkQueue(myQueue, &p1);
push_LinkQueue(myQueue, &p2);
push_LinkQueue(myQueue, &p3);
push_LinkQueue(myQueue, &p4);
printf("队列大小为:%d\n", size_LinkQueue(myQueue));
while (isEmpty_LinkQueue(myQueue) == 0) {
//访问队头
struct Person *pFront = front_LinkQueue(myQueue);
printf("链式存储::队头元素 -- 姓名:%s 年龄: %d\n", pFront->name, pFront->age);
//访问队尾
struct Person *pBack = back_LinkQueue(myQueue);
printf("链式存储::队尾元素 -- 姓名:%s 年龄: %d\n", pBack->name, pBack->age);
//出队
pop__LinkQueue(myQueue);
}

printf("队列大小为:%d\n", size_LinkQueue(myQueue));

//销毁队列
destory_LinkQueue(myQueue);

}

int main() {

test01();

return 0;
}