您的位置:首页 > 其它

双向队列的链表实现

2015-11-01 10:13 453 查看
定义以下这样一个队列结构:

#include <stdio.h>
#include <stdlib.h>

#define ElementType int
#define ERROR 1e5
typedef struct Node *PtrToNode;
struct Node {
ElementType Element;
PtrToNode Next, Last;
};
typedef struct DequeRecord *Deque;
struct DequeRecord {
PtrToNode Front, Rear;
};

Deque CreateDeque();
int Push( ElementType X, Deque D );
ElementType Pop( Deque D );
int Inject( ElementType X, Deque D );
ElementType Eject( Deque D );


其中CreateDeque用来创建一个带有头节点的双向队列,并且队列的Front和Rear两个指针均指向那个头节点

Push用来在队列前端插入数据

Pop用于在前端弹出数据并返回数据

Inject用于在队列后端插入数据

Eject用于在后端弹出数据并返回数据

具体实现如下:

需要注意的是Front始终指向头节点,并且用Front与Rear是否均指向头节点来判断队列是否为空

Deque CreateDeque()
{
Deque D = malloc(sizeof(struct DequeRecord));
PtrToNode p = malloc(sizeof(struct Node));
p->Last = p->Next = NULL;
D->Front = D->Rear = p;
return D;
}

int Push( ElementType X, Deque D )
{
PtrToNode p = malloc(sizeof(struct Node));
if(p == NULL)
return 0;
p->Element = X;
p->Next = D->Front->Next;
p->Last = D->Front;
D->Front->Next = p;
if(p->Next == NULL)
D->Rear = p;
else
p->Next->Last = p;
return 1;
}

ElementType Pop( Deque D )
{
if(D->Front == D->Rear)
return ERROR;
ElementType result = D->Front->Next->Element;
PtrToNode temp = D->Front->Next;
if(temp == D->Rear)
D->Rear = D->Front;
else
temp->Next->Last = temp->Last;
D->Front->Next = temp->Next;
return result;
}

int Inject( ElementType X, Deque D )
{
PtrToNode p = malloc(sizeof(struct Node));
if(p == NULL)
return 0;
p->Element = X;
D->Rear->Next =  p;
p->Next = NULL;
p->Last = D->Rear;
D->Rear = p;
return 1;
}

ElementType Eject( Deque D )
{
if(D->Front == D->Rear)
return ERROR;
ElementType result = D->Rear->Element;
PtrToNode temp = D->Rear;
D->Rear->Last->Next = NULL;
D->Rear = D->Rear->Last;
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: