1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ctype.h>
4 #include <string.h>
5 typedef int ElemType;
6 typedef struct Queue{
7 ElemType item;//数据项
8 struct Queue *next;//指向下一个数据项
9 }Queue;
10 typedef struct LinkQueues{
11 Queue * front;//队头指向第一个被删除的数据项
12 Queue * rear;//队尾指向可插入的位置
13 }LinkQueues;
14 LinkQueues * initQueue(){//初始化
15 LinkQueues * Queues=(LinkQueues *)malloc(sizeof(LinkQueues));
16 Queues->front=(Queue *)malloc(sizeof(Queue));//为队头分配空间
17 Queues->rear=Queues->front;//队尾指向队头
18 return Queues;//返回已初始化的链队
19 }
20 void delete(LinkQueues * Queues){
21 if(Queues->front->next==Queues->rear->next){//如果队头与队尾的next相等则说明已到尽头(队尾用以接收下一个数据项)
22 printf("队列已为空!\n");
23 Queues->front=Queues->rear;//重新初始化整个链队
24 return;
25 }
26 Queue *p = Queues->front->next;//指针p指向队头
27 printf("%d已删除!\n",p->item);
28 Queues->front->next=p->next;//队头指向下一个数据项
29 free(p);//释放上一个队头保存的数据项空间
30 }
31 void insert(LinkQueues * Queues){
32 printf("输入你想添加的整数:\n");
33 Queue *item=(Queue *)malloc(sizeof(Queue));//分配一个储存数据项的空间给item
34 scanf("%d",&item->item);//获取值,item的next为空
35 Queues->rear->next = item;//队尾的next指向item,
36 Queues->rear = item;//队尾指向该item,若有下一个数据项,则下次队尾的next就是该item的next,指向下一个数据项。
37 }
38 void display(LinkQueues * Queues){
39 Queue *p=Queues->front->next;//指针p获取队头指向的数据项
40 if(!(Queues->front->next==Queues->rear->next)){//如果队头和队尾不为空且队头指向的内存地址不等于队尾指向的空间地址
41 while(p!=Queues->rear->next){//队头不等于队尾或不为空(即队尾的next)时
42 printf("%d ",p->item);
43 p=p->next;//指针p继续指向下一个数据项
44 }
45 printf("\n");
46 }
47 else{
48 printf("队列已空!\n");
49 return;
50 }
51 }
52 void menu(){
53 printf("键入以下选项以操作,ctrl+z退出\nA:插入数据\nB:删除数据\nC:打印数据\n");
54 }
55 void main(){
56 LinkQueues *Queues=initQueue();//获取初始化的链队
57 menu();
58 char ch;
59 while((ch=getchar())!=EOF){
60 setbuf(stdin,NULL);//清空缓冲区
61 switch (toupper(ch)){
62 case 'A': insert(Queues);break;
63 case 'B': delete(Queues);break;
64 case 'C': display(Queues);break;
65 }
66 menu();
67 setbuf(stdin,NULL);//清空缓冲区
68 }
69 }