您的位置:首页 > 理论基础 > 数据结构算法

双向链表的实现

2016-04-01 17:19 507 查看
之前的博客讲到了线性表的链式存储结构,实现了链表的各种操作(http://blog.csdn.net/u010429311/article/details/51037580)。但是,单链表有单向性的缺点,为了克服这一缺点,可以尝试实现双向链表。下图是双向链表的结构:



我们也可以实现双向链表的一些基本操作:





以下是实现基本操作的代码:

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;

typedef struct DNode {
ElemType data;
struct DNode *next;
struct DNode *prior;  //指向上一个结点的指针
} DNode, *DulLinkList;

Status createList(DulLinkList &L, int n) {
DulLinkList p;
L =  (DulLinkList) malloc(sizeof(DNode));
L->next = NULL;
L->prior = NULL;
if (n == 0) {   //如果长度为0,则头结点指向的指针指向本身
L->next = L->prior = L;
return OK;
}
int i = 0;
for (i = n; i > 0; i--) {
p = (DulLinkList) malloc(sizeof(DNode));
scanf("%d", p->data);
p->next = L->next;
L->next = p;
p->prior = L;
if (i == n)   //最后一个元素的next指针指向头结点
p->next = L;
p->next->prior = p; //下一个结点的prior指针指向前一个结点
}
return OK;
}

Status insertList(DulLinkList &L, int i, ElemType e) {
DulLinkList s, p;
p = L;
int j = 0;
while (p && j < i - 1) {  //寻找第i-1个结点
p = p->next;
j++;
if (p == L) break;
}
if (p == L || j > i - 1) return ERROR;
if (!(s= (DulLinkList) malloc(sizeof(DNode))))
return ERROR;
s->data = e;   //插入结点
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}

Status deleteList(DulLinkList &L, int i, ElemType &e) {
DulLinkList p;
p = L;
int j = 0;
while (p->next && j < i - 1) {  //寻找第i-1个结点
p = p->next;
j++;
if (p->next == L) break;
}
if (p->next == L || j > i - 1) return ERROR;
e = p->data;  //获取结点元素
p->prior->next = p->next;  //删除结点
p->next->prior = p->prior;
free(p);  //释放被删除结点的空间
return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息