1、设计节点:
1 typedef struct Node{ 2 int data; 3 struct Node *next; 4 }Node,*Queue; //节点结构 5 6 typedef struct{ 7 Queue front;//队头 8 Queue rear;//队尾 9 }LinkQueue;
2.初始化队列
void initQueue(LinkQueue *queue) { queue->front = queue->rear=(Queue)malloc(sizeof(struct Node));//为队头和队尾节点分配内存 if(queue->front==NULL) { exit(0); } queue->rear->next=NULL;//让队尾的下个节点为空 }
3、判断队列是否为空
bool Isempty(LinkQueue queue) { return queue.front==queue.rear?true:false;//就是判断队头和队尾是否相等 }
4、入队操作
void insertQueue(LinkQueue *queue,int value)//因为不是循环队列所以不需要判断是否满 {
/*初始化新节点*/ Queue q = (Queue)malloc(sizeof(struct Node)); if(q==NULL) exit(0); q->data=value; q->next=NULL;
/*尾部插入节点*/ queue->rear->next=q; queue->rear = q; }
5、出队操作
1 void deleteQueue(LinkQueue *queue) 2 { 3 Queue q = NULL;
/*不为空则节点头部出队*/ 4 if(!Isempty(*queue)) 5 { 6 q=queue->front->next; 7 queue->front->next=q->next; 8 }
/*只剩队头一个元素时,将队头赋值给队尾*/ 9 if(queue->rear ==q) 10 { 11 queue->rear = queue->front; 13 } 14 free(q); 16 }
6、队列的遍历
1 void traversal(LinkQueue queue)//头部开始遍历 2 { 3 int i = 1; 4 Queue q=queue.front->next;
/*q指针向队尾移动遍历,得到队列中存放的value*/ 5 while(q!=NULL) 6 { 7 printf("i= %d,data = %d ",i,q->data); 8 q = q->next; 9 i++; 10 11 } 12 }
7、队列的销毁
1 void destoryQueue(LinkQueue *queue) 2 { 3 while(queue->front != NULL) 4 {
/*front和rear一前一后,不断释放前一个指针,然后将后一个指针赋值给前一指针*/ 5 queue->rear = queue->front->next; 6 free(queue->front); 7 queue->front = queue->rear; 8 9 } 10 printf("destoried! "); 11 12 }
完整代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<stdbool.h> 4 typedef struct Node{ 5 int data; 6 struct Node *next; 7 }Node,*Queue; 8 9 typedef struct{ 10 Queue front; 11 Queue rear; 12 }LinkQueue; 13 14 void initQueue(LinkQueue *queue) 15 { 16 queue->front = queue->rear=(Queue)malloc(sizeof(struct Node)); 17 if(queue->front==NULL) 18 { 19 exit(0); 20 } 21 queue->rear->next=NULL; 22 23 } 24 bool Isempty(LinkQueue queue) 25 { 26 return queue.front==queue.rear?true:false; 27 } 28 29 void insertQueue(LinkQueue *queue,int value) 30 { 31 Queue q = (Queue)malloc(sizeof(struct Node)); 32 if(q==NULL) 33 exit(0); 34 q->data=value; 35 q->next=NULL; 36 queue->rear->next=q; 37 queue->rear = q; 38 } 39 40 void deleteQueue(LinkQueue *queue) 41 { 42 Queue q = NULL; 43 if(!Isempty(*queue)) 44 { 45 q=queue->front->next; 46 queue->front->next=q->next; 47 } 48 if(queue->rear ==q) 49 { 50 queue->rear = queue->front; 51 52 } 53 free(q); 54 55 } 56 57 void traversal(LinkQueue queue) 58 { 59 int i = 1; 60 Queue q=queue.front->next; 61 while(q!=NULL) 62 { 63 printf("i= %d,data = %d ",i,q->data); 64 q = q->next; 65 i++; 66 67 } 68 } 69 70 void destoryQueue(LinkQueue *queue) 71 { 72 while(queue->front != NULL) 73 { 74 queue->rear = queue->front->next; 75 free(queue->front); 76 queue->front = queue->rear; 77 78 } 79 printf("destoried! "); 80 81 } 82 83 int main() 84 { 85 LinkQueue queue; 86 initQueue(&queue); 87 insertQueue(&queue,2); 88 insertQueue(&queue,2); 89 insertQueue(&queue,2); 90 insertQueue(&queue,2); 91 92 insertQueue(&queue,2); 93 traversal(queue); 94 deleteQueue(&queue); 95 traversal(queue); 96 97 destoryQueue(&queue); 98 99 100 }
typedef struct Node{int data;struct Node *next;}Node,*Queue;
typedef struct{Queue front;Queue rear;}LinkQueue;