之前写过基于顺序表来实现队列,这里就写下基于链表来实现队列的一些操作
首先先要在头文件中定义两个结构体
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