1 #include<stdio.h>
2 #include<stdlib.h>
3 #define ok 1
4 #define error 0
5 #define overflow -1
6 #define TRUE 1
7 #define FALSE 0
8 #define status int
9 typedef struct QNode
10 { int data;
11 struct QNode *next;
12 }QNode,*QueuePtr;
13 typedef struct
14 { QueuePtr front;
15 QueuePtr rear;
16 }LinkQueue;
17 status creat(LinkQueue &Q,int n)//创建一个长度为n的链队列,并返回首地址.
18 {
19 QueuePtr p,s;
20 Q.front=(QueuePtr)malloc(sizeof(QNode));
21 p=Q.front;
22 Q.front->data=n;
23 printf("请输入队列元素:\n");
24 while(n--)
25 {
26 if(!(s=(QueuePtr)malloc(sizeof(QNode))))
27 exit(error);
28 p->next=s;
29 s->next=NULL;
30 scanf("%d",&s->data);
31 p=s;
32 }
33 Q.rear=p;
34 return ok;
35 }
36 status DestroyQueue(LinkQueue &Q)
37 {
38 while(Q.front)
39 {
40 Q.rear=Q.front->next;
41 free(Q.front);
42 Q.front=Q.rear;
43 }
44 return ok;
45 }
46 status QueueEmpty(LinkQueue Q)
47 {
48 if(Q.front->next==NULL)
49 return TRUE;
50 else
51 return FALSE;
52 }
53 status GetHead(LinkQueue Q,int &e)//取队头元素,用e返回
54 {
55 QueuePtr p;
56 if(Q.front==Q.rear)
57 return error;
58 p=Q.front->next;
59 e=p->data;
60 return ok;
61 }
62 status EnQueue(LinkQueue &Q,int e)//插入e为新的队尾元素
63 {
64 QueuePtr p;
65 p=(QueuePtr)malloc(sizeof(QNode));
66 if(!p) exit(overflow);
67 p->data=e; p->next=NULL;
68 Q.rear->next=p;
69 Q.rear=p;
70 Q.front->data++;
71 return ok;
72 }
73 status DeQueue(LinkQueue &Q,int &e)//删除Q的队头元素,用e返回其值
74 {
75 QueuePtr p;
76 if(Q.front==Q.rear) return error;
77 p=Q.front->next;
78 e=p->data;
79 Q.front->next=p->next;
80 if(Q.rear==p) Q.rear=Q.front;
81 free(p);
82 Q.front->data--;
83 return ok;
84 }
85 status printQueue(LinkQueue Q)//打印链表
86 {
87 QueuePtr p=Q.front;
88 printf("链表元素为:");
89 printf("\n********************\n");
90 while(p->next)
91 {
92 p=p->next;
93 printf("%d ",p->data);
94 }
95 printf("\n********************\n");
96 return ok;
97 }
98 int main()
99 {
100 int m,n;
101 LinkQueue Q;
102 printf("请输入队列的长度:\n");
103 scanf("%d",&n);
104 creat(Q,n);
105 printQueue(Q);
106 printf("请输入你要插入的元素:\n");
107 scanf("%d",&m);
108 EnQueue(Q,m);
109 printQueue(Q);
110 printf("删除元素:\n");
111 DeQueue(Q,m);
112 printf("你所删除的元素为:%d\n",m);
113 printQueue(Q);
114 DestroyQueue(Q);
115 system("pause");
116 return ok;
117 }