链表实现队列

学过计算机的都知道,队列是一种先进先出的数据结构。这里队列主要是用链表来实现的。

下面来看代码:

  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指针指向这个纪录好了的元素就可以了。

运行效果:

 

 

posted @ 2021-05-15 23:49  EvanTheBoy  阅读(156)  评论(0编辑  收藏  举报