1.队列
https://blog.csdn.net/LiuBo_01/article/details/80412290
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct Node
5 {
6 int data;
7 struct Node* next;
8 }N;
9
10 typedef struct
11 {
12 N* front;
13 N* rear;
14 }Q;
15
16 //初始化队列
17 void Init(Q* q)
18 {
19 //创建一个头结点
20 N* n = (N*)malloc(sizeof(N));
21 q->front = q->rear = n; //队头和队尾指向头结点
22 q->front->next = NULL;
23 }
24
25 //判断队列是否为空
26 int IsEmpty(Q* q)
27 {
28 if (q->front->next == NULL)
29 {
30 return 1;
31 }
32 return 0;
33 }
34
35 //入队操作
36 void Enter(Q* q, int data)
37 {
38 //创建一个新结点
39 N* n = (N*)malloc(sizeof(N));
40 n->data = data; //将数据元素赋值给结点的数据域
41 n->next = NULL; //将结点的指针域置空
42 q->rear->next = n; //将原来队列的队尾指针指向新结点
43 q->rear = n; //将队尾指针指向新结点
44 }
45
46 //出队操作
47 void Delete(Q* q,int* data)
48 {
49 if (IsEmpty(q))
50 {
51 printf("队列为空!\n");
52 return;
53 }
54 //pDel指向队头元素,由于队头指针front指向头结点,所以pDel指向头结点的下一个结点
55 N* n = q->front->next;
56 *data = n->data; //将要出队的元素赋给data
57 q->front->next = n->next; //使指向头结点的指针指向pDel的下一个结点
58 //如果队列中只有一个元素,将队列置空
59 if (q->rear = n)
60 {
61 q->rear = q->front;
62 }
63 free(n); //释放pDel指向的空间
64 }
65
66 //取队头元素
67 int GetHead(Q* q, int* data)
68 {
69 if (IsEmpty(q))
70 {
71 printf("队列为空!\n");
72 return 0;
73 }
74 N* n;
75 n = q->front->next; //pCur指向队列的第一个元素,即头结点的下一个结点
76 *data = n->data; //将队头元素值赋给data
77 return *data; //返回队头元素值
78 }
79
80 //打印队列中的元素
81 void Print(Q* q)
82 {
83 N* n;
84 n = q->front->next;
85 while (n)
86 {
87 printf("%d ", n->data);
88 n = n->next;
89 }
90 printf("\n");
91 }
92
93 int main()
94 {
95 Q q;
96 int x;
97 Init(&q);
98 Enter(&q,1);
99 Enter(&q,2);
100 Enter(&q,3);
101 Enter(&q,4);
102 Print(&q);
103 Delete(&q,&x);
104 printf("%d\n",x);
105 GetHead(&q,&x);
106 printf("%d\n",x);
107 Print(&q);
108
109 return 0;
110 }