双端队列 ADT接口 链表实现
Posted MACHINE_001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双端队列 ADT接口 链表实现相关的知识,希望对你有一定的参考价值。
Deque ADT接口 DEQUEUE.h:
1 #include <stdlib.h>
2 #include "Item.h"
3
4 typedef struct DEQUEUEnode *link;
5 struct DEQUEUEnode
6 {
7 Item item;
8 link next;
9 link last;
10 };
11
12 void DEQUEUEinit(int);
13 void DEQUEUEerror(void);
14 Item DEQUEUEheadget(void);
15 Item DEQUEUEtailget(void);
16 void DEQUEUEheadput(Item);
17 void DEQUEUEtailput(Item);
18 int DEQUEUEisEmpty(void);
19 int DEQUEUEisFull(void);
Deque ADT接口实现 DEQUEUE.c:
1 static link head,tail;
2 static int N; //备用
3
4 void DEQUEUEinit(int maxN)
5 {
6 head=malloc(sizeof(*head));
7 tail=head;
8 tail->next=NULL;
9 tail->last=NULL;
10 head->next=NULL;
11 head->last=NULL;
12 N=maxN;
13 }
14 void DEQUEUEerror(void)
15 {
16 printf("节点为空或节点已满");
17 exit(1);
18 }
19 Item DEQUEUEheadget(void)
20 {
21 Item temp;
22 temp=head->item;
23 head=head->next;
24 free(head->last);
25 head->last=NULL;
26 return temp;
27 }
28 Item DEQUEUEtailget(void)
29 {
30 Item temp;
31 tail=tail->last;
32 temp=tail->item;
33 free(tail->next);
34 tail->next=NULL;
35 return temp;
36 }
37 void DEQUEUEheadput(Item value)
38 {
39 head->last=malloc(sizeof(*head));
40 if(DEQUEUEisFull())
41 DEQUEUEerror();
42 head->last->next=head;
43 head=head->last;
44 head->item=value;
45 head->last=NULL;
46 }
47 void DEQUEUEtailput(Item value)
48 {
49 tail->item=value;
50 tail->next=malloc(sizeof(*head));
51 if(DEQUEUEisFull())
52 DEQUEUEerror();
53 tail->next->last=tail;
54 tail=tail->next;
55 tail->next=NULL;
56 }
57 int DEQUEUEisEmpty(void)
58 {
59 if(head==NULL&&tail==NULL)
60 return 1;
61 return 0;
62 }
63 int DEQUEUEisFull(void)
64 {
65 if((head==NULL&&tail!=NULL)||(head!=NULL&&tail==NULL))
66 return 1;
67 return 0;
68 }
Item.h:
1 typedef char Item;
主程序 main.c:
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int N;
6
7 printf("输入需要申请内存大小:");
8 if(scanf("%d", &N))
9 DEQUEUEinit(N);
10 else
11 DEQUEUEerror();
12 getchar();
13 printf("输入%d个字符",N);
14 printf("(‘+‘从队头get ‘*‘从队尾get ‘大写字母‘"
15 "从队头put ‘小写字母‘从队尾put):\n");
16
17 while((N=getchar())!=‘\n‘)
18 {
19 switch(N)
20 {
21 case ‘+‘:
22 putchar(DEQUEUEheadget());
23 break;
24 case ‘*‘:
25 putchar(DEQUEUEtailget());
26 break;
27 default:
28 if(N>64&&N<91)
29 DEQUEUEheadput(N);
30 else
31 DEQUEUEtailput(N);
32 }
33 }
34
35 return 0;
36 }
以上是关于双端队列 ADT接口 链表实现的主要内容,如果未能解决你的问题,请参考以下文章