1 #include <stdio.h>
2 #include <stdlib.h>
3 //#include <malloc.h>
4
5 //定义抽象数据
6 typedef int DataType;
7 typedef struct queue{
8 DataType data;
9 struct queue *next;
10 }Queue;
11
12 //定义链式队列的头尾指针
13 typedef struct{
14 Queue *front;
15 Queue *rear;
16 }ListQueue;
17
18 //链式队列初始化
19 void ListQueueInit(ListQueue *myQ)
20 {
21 myQ->front = NULL;
22 myQ->rear = NULL;
23 }
24
25 //链式队列判断是否为空
26 int ListQueueNoEmpty(ListQueue myQ)
27 {
28 if (myQ.front==NULL)
29 {
30 return 0;
31 }
32 else
33 {
34 return 1;
35 }
36 }
37
38 //链式队列的入队操作
39 int ListQueuePush(ListQueue *myQ, DataType x)
40 {
41 Queue *pTemp;
42 if ((pTemp=(Queue*)malloc(sizeof(Queue)))==NULL)
43 {
44 return 0;
45 }
46 pTemp->data = x;
47 pTemp->next = NULL; //2018年8月16日 16:23:06 更正 最致命错误
48
49
50 if (myQ->rear!=NULL) //第一次入队的时候rear为null所以不执行。
51 {
52 myQ->rear->next = pTemp;
53 }
54 myQ->rear = pTemp; //将队尾指针指向第一个入队的元素。
55 if (myQ->front==NULL)
56 {
57 myQ->front = pTemp;//将队头指针指向第一个入队的元素,然后不再移动。
58 }
59 return 1;
60 }
61
62 //链式队列的出队操作
63 int ListQueuePop(ListQueue *myQ, DataType *x)
64 {
65 ListQueue *del;
66 /*if ((del = (ListQueue*)malloc(sizeof(ListQueue))) == NULL)
67 {
68 return 0;
69 }*/
70 if (myQ->front==NULL/*&&myQ->rear==NULL*/)
71 {
72 return 0;
73 }
74 else
75 {
76 *x = myQ->front->data;
77 del = myQ->front;
78 myQ->front = myQ->front->next;
79 if (myQ->front == NULL)//如果只有一个节点
80 {
81 myQ->rear = NULL;
82 }
83 free(del);
84 return 1;
85 }
86
87 }
88
89 //链式队列取队头
90 int ListQueueTop(ListQueue myQ,DataType *num)
91 {
92 if (myQ.front==NULL)
93 {
94 return 0;
95 }
96 else
97 {
98 *num = myQ.front->data;
99 return 1;
100 }
101
102 }
103
104
105 //销毁队列内存
106 void ListQueueDes(ListQueue myQ)
107 {
108 ListQueue *temp,*pre;
109 pre =myQ.front;
110 while (pre!=NULL)
111 {
112 temp = pre;
113 pre->front= pre->front->next;
114 free(temp);
115 temp = NULL;
116 }
117 myQ.front = NULL;
118 myQ.rear = NULL;
119 }
120
121 //主函数
122 void main(void)
123 {
124 ListQueue Q;
125 int i;
126 DataType x,m;
127
128 ListQueueInit(&Q);
129 for ( i = 0; i <10; i++)
130 {
131 if ((ListQueuePush(&Q, i + 1)) == 0)
132 {
133 printf("1error");
134 getchar();
135 return;
136 }
137 }
138 /*if ((ListQueueTop(&Q,&m))==0)
139 {
140 printf("2error");
141 getchar();
142 return;
143 }
144 else
145 {
146 printf("队头:%d\n", m);
147 }*/
148 ListQueueTop(Q, &x);
149 printf("\n取出队头为:%d\n", x);
150 ListQueuePop(&Q, &x);
151 while ((ListQueueNoEmpty(Q)) == 1)
152 {
153 if ((ListQueueTop(Q,&x))==0)
154 {
155 printf("3error");
156 return;
157 }
158 else
159 {
160 printf("%d ", x);
161 ListQueuePop(&Q, &x);
162 }
163 }
164 ListQueueDes(Q);
165 getchar();
166 }