双向链表的实现

来源:互联网 发布:守望先锋数据app 编辑:程序博客网 时间:2024/05/01 05:52

之前的博客讲到了线性表的链式存储结构,实现了链表的各种操作(http://blog.csdn.net/u010429311/article/details/51037580)。但是,单链表有单向性的缺点,为了克服这一缺点,可以尝试实现双向链表。下图是双向链表的结构:
这里写图片描述
我们也可以实现双向链表的一些基本操作:
插入元素
删除元素
以下是实现基本操作的代码:

#include <stdio.h>#include <malloc.h>#define OK 1#define ERROR 0typedef 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;}
2 0
原创粉丝点击