之前写过基于顺序表来实现队列,这里就写下基于链表来实现队列的一些操作
首先先要在头文件中定义两个结构体
3 typedef struct LinkNode
4 {
5 LinkType data;
6 struct LinkNode* next;
7 }LinkNode;
8 typedef struct LinkQueue
9 {
10 LinkNode* head;
11 LinkNode* tail;
12 }LinkQueue;
队列初始化
类似与队列初始化操作,只需要将链表的头指针和尾指针分别指向空,就完成了链式栈的初始化
5 //队列初始化
6 void LinkQueueInit(LinkQueue* q)
7 {
8 if(q == NULL)
9 {
10 //非法操作
11 return ;
12 }
13 q->head = NULL;
14 q->tail = NULL;
15 }
队列的入队
其实就相当于链表的头插或者是尾插法,在这里可以自己选择方法,这里写的是头插法,详细见程序
25 //入队(尾插)
26 void LinkQueueFush(LinkQueue* q,LinkType value)
27 {
28 if(q == NULL)
29 {
30 //非法操作
31 return;
32 }
33 LinkNode* new_node=CreateLinkNode(value);
34 if(q->head == NULL)
35 {
36 q->head=q->tail=new_node;
37 //空队列
38 return ;
39 }
40 //LinkNode* new_node =CreateLinkNode(value);
41 q->tail->next=new_node;
42 q->tail=q->tail->next;
43 }
44
45
队列的出队
相当于链表的头删法或者是尾删法,这里选择的是头删法,详细见程序
46 //出队
47 void LinkQueuePop(LinkQueue* q)
48 {
49 if(q == NULL)
50 {
51 //非法操作
52 return;
53 }
54 if(q->head == NULL)
55 {
56 //空队列
57 return;
58 }
59 LinkNode* to_delete=q->head;
60 if(q->head == q->tail)
61 {
62 free(to_delete);
63 q->head=q->tail=NULL;
64 return ;
65 }
66 q->head=to_delete->next;
67 free(to_delete);
68 }
取队首元素
69 //取队首元素
70 int LinkQueueFront(LinkQueue* q,LinkType* value)
71 {
72 if(q == NULL || value == NULL)
73 {
74 //非法操作
75 return 0;
76 }
77 if(q->head == NULL)
78 {
79 //空队列
80 return 0;
81 }
82 *value=q->head->data;
83 return 1;
84 }
85