基本数据结构----双链表

  双链表也叫双向链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表

1:基本结构

  双向链表中有两种不同方向的链,即每个节点中除了next域存放后继结点地址外,还增加一个指向其弯曲的指针prior。

 

  其中头指针head是唯一确定的。如果将头结点和尾节点连接起来就成了双向循环链表。

2: 双向循环链表的节点删除

在双循环链表中删除某一个节点步骤如下

3:插入操作

 

代码:

#include<iostream>
#include<malloc.h>
using namespace std;
typedef char ElemType;
typedef struct DNode
{
    ElemType data;
    struct DNode *pre;
    struct DNode *next;
}DLinkList;
void InitList(DLinkList *&L)
{
    L = (DLinkList *)malloc(sizeof(DLinkList));
    L->pre = NULL;
    L->next= NULL;
}
void DestroyList(DLinkList *&L)
{
    DLinkList *p = L,*q = p->next;
    while(q != NULL)
    {
        free(p);
        p = q;
        q = p->next;
    }
    free(p);
}
int ListEmpty(DLinkList *L)
{
    return (L->next==NULL);
}
int ListLength(DLinkList *L)
{
    DLinkList *p=L;
    int i = 0;
    while(p->next != NULL)
    {
        i++;
        p = p->next;
    }
    return i;
}
void DisplayList(DLinkList *L)
{
    DLinkList *p = L->next;
    while(p != NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
int GetElem(DLinkList *L,int i,ElemType &e)   //得到第i个元素
{
    int j = 0;
    DLinkList *p = L;
    while(j<i&&p!=NULL)
    {
        j++;
        p = p->next;
    }
    if(p==NULL)
        return 0;
    else
    {
        e = p->data;
        return 1;
    }
}
int LocateElem(DLinkList *L,ElemType e)        //确定元素e的位置
{
    int n = 1;
    DLinkList *p = L->next;
    while(p!=NULL && p->data != e)
    {
        n++;
        p = p->next;
    }
    if (p==NULL)
        return 0;
    else
        return n;
}
int ListInsert(DLinkList *L,int i,ElemType e)
{
    int j = 0;
    DLinkList *p = L,*s;
    while(j<i-1 && p!=NULL)
    {
        j++;
        p = p->next;
    }
    if(p==NULL)
        return 0;
    else
    {
        s = (DLinkList *) new DLinkList;  //s = (DLinkList *)malloc(sizeof(DLinkList));
        s->data = e;
        s->next = p->next;
        if(p->next != NULL)
        {
            p->next->pre = s;
        }
        p->pre = p;
        p->next = s;
        return 1;
    }
}
int ListDelete(DLinkList *&L,int i,ElemType &e)
{
    int j = 0;
    DLinkList *p=L,*q;
    while(j<i-1 && p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
        return 0;
    else
    {
        q=p->next;
        if(q==NULL)
            return 0;
        p->next=q->next;
        if(p->next!=NULL)
            p->next->pre=p;
        free(q);
        return 1;
    }
}
int main()
{
    DLinkList *L;
    ElemType e;
    cout << " (1):初始化双链表L:\n ";
    InitList(L);
    cout << "(2):依次采用插入法插入元素abcde\n";
    ListInsert(L,1,'a');
    ListInsert(L,2,'b');
    ListInsert(L,3,'c');
    ListInsert(L,4,'d');
    ListInsert(L,5,'e');
    cout << " (3)输出双链表L: ";
    DisplayList(L);
    cout << " (4)双链表的长度:";
    cout << ListLength(L) << endl;
    cout << " (5)双链表为:  " << (ListEmpty(L)?"空":"非空");
    GetElem(L,3,e);
    cout << " (6)双链表第3个元素为:" << e << endl;
    cout << " (7)元素a的位置是: " << LocateElem(L,'a') <<endl;
    cout << " (8)在第四个位置上插入元素f";
    ListInsert(L,4,'f');
    cout << " (9)输出双链表L";
    DisplayList(L);
    cout << " (10)删除第三个元素:\n";
    ListDelete(L,3,e);
    cout << " (11)输出双链表L: ";
    DisplayList(L);
    cout << " (12)释放双链表L:";
}

  

posted @ 2013-05-08 14:54  Theast  阅读(189)  评论(0编辑  收藏  举报