链表实现队列
学过计算机的都知道,队列是一种先进先出的数据结构。这里队列主要是用链表来实现的。
下面来看代码:
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 #include <stdlib.h> 4 struct Node { 5 int data; 6 struct Node* next; 7 }; 8 9 struct Queue { 10 struct Node* frontNode; 11 struct Node* tailNode; 12 int queuesize; 13 }; 14 15 struct Node* CreateNode(int data) 16 { 17 struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); 18 newNode->data = data; 19 newNode->next = NULL; 20 return newNode; 21 } 22 23 struct Queue* CreateQueue() 24 { 25 struct Queue* myQueue = (struct Queue*)malloc(sizeof(struct Queue)); 26 myQueue->frontNode = myQueue->tailNode = NULL; 27 myQueue->queuesize = 0; 28 return myQueue; 29 } 30 31 int isEmpty(struct Queue* myQueue) 32 { 33 if (myQueue->queuesize == 0) { 34 return 1; 35 } 36 else { 37 return 0; 38 } 39 } 40 41 void enQueue(struct Queue* myQueue,int data) 42 { 43 struct Node* newNode = CreateNode(data); 44 if (isEmpty(myQueue)) { 45 myQueue->frontNode = myQueue->tailNode = newNode; 46 } 47 else { 48 myQueue->tailNode->next = newNode; 49 myQueue->tailNode = newNode; 50 } 51 myQueue->queuesize++; 52 } 53 54 void deQueue(struct Queue* myQueue) 55 { 56 if (isEmpty(myQueue)) { 57 printf("队列为空!\n"); 58 return; 59 } 60 struct Node* nextNode = myQueue->frontNode->next; 61 free(myQueue->frontNode); 62 myQueue->frontNode = nextNode; 63 myQueue->queuesize--; 64 printf("操作成功!\n"); 65 } 66 67 int GetFront(struct Queue* myQueue) 68 { 69 if (isEmpty(myQueue)) { 70 printf("队列为空!\n"); 71 return; 72 } 73 return myQueue->frontNode->data; 74 } 75 76 void printQueue(struct Queue* myQueue) 77 { 78 struct Node* p = myQueue->frontNode; 79 while (p != NULL) 80 { 81 printf("%d ", p->data); 82 p = p->next; 83 } 84 printf("\n"); 85 } 86 87 int main() 88 { 89 struct Queue* myQueue = CreateQueue(); 90 int choice, data; 91 while (1) 92 { 93 printf("请输入你想要进行的操作:1.向队列中输入数据;2.从队列中弹出数据;3.得到队首数据;4.打印队列中的数据;5.退出:"); 94 scanf("%d", &choice); 95 if (choice == 1) { 96 printf("请输入你想要向队列中输入的数据:"); 97 scanf("%d", &data); 98 enQueue(myQueue, data); 99 } 100 else if (choice == 2) { 101 deQueue(myQueue); 102 } 103 else if (choice == 3) { 104 printf("队首数据为:%d\n", GetFront(myQueue)); 105 } 106 else if (choice == 4) { 107 printQueue(myQueue); 108 } 109 else if (choice == 5) { 110 break; 111 } 112 } 113 return 0; 114 }
1.需要注意的几点是,进入队列的函数里,需要判断此时队列是否为空,如果是第一次进入队列,那么front指针和tail指针都需要指向这第一个进入队列的数据;如果不是第一次,只需要控制tail指针移动,front指针还是指向第一个进入队列的元素。
2.删除函数的话呢,就是先记录front指针指向的下一个元素,然后删掉front指针指向的元素,最后再让front指针指向这个纪录好了的元素就可以了。
运行效果: