1.队列
https://blog.csdn.net/LiuBo_01/article/details/80412290
1 #include <stdio.h>2 #include <stdlib.h>3 4 typedef struct Node5 {6 int data;7 struct Node* next;8 }N;9 10 typedef struct11 {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; //将要出队的元素赋给data57 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; //将队头元素值赋给data77 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 }