数据结构 双向链表

做一个豁达而努力的自己。

双向链表的定义:在单链表的每个节点中,再设置一个指向其前驱节点的指针域。

线性表的双向链表的存储结构:

typedef struct DulNode

{

    ElemType data;

    struct DulNode *prior;

    struct DulNode *next;

}DulNode, *DulLinkList;

代码:

#include <iostream>
#include <cstdlib>
using namespace std;


//双向链表的存储结构
typedef struct DulNode
{
    int data;   //节点的数据域
    DulNode *prior; //指向前继节点
    DulNode *next;  //指向后继节点
}DulNode, *DulLinkList;
//双向链表的初始化
bool InitList(DulLinkList &L)
{
    L = new DulNode;
    if(!L)
        return false;
    L->prior = NULL;
    L->next = NULL;
    return true;
}
//头插法创建双向链表
void CreateList_H(DulLinkList &L)
{
    int n;
    DulLinkList s;
    cout << "输入创建的元素个数:";
    cin >> n;
    while(n--)
    {
        s = new DulNode;
        cout << "输入数据:";
        cin >> s->data;
        if(L->next)
            L->next->prior = s;
        s->prior = L;
        s->next = L->next;
        L->next = s;
    }
}
//双向链表的尾插法
void CreateList_T(DulLinkList &L)
{
    int n;
    DulLinkList s, r;
    r = L;
    cout << "输入创建元素的个数:";
    cin >> n;
    while(n--)
    {
        s = new DulNode;
        cout << "输入数据:";
        cin >> s->data;
        s->next = NULL;
        s->prior = r;
        r->next = s;
        r = s;
    }
}
//双向链表的查找
bool GetList(DulLinkList L, int i, int &e)
{
    DulLinkList p;
    p = L->next;
    int j = 1;
    while(p && j < i)
    {
        p = p->next;
        j++;
    }
    if(!p || j > i)
        return false;
    e = p->data;
    return true;
}
//双向链表的插入
bool InsertList(DulLinkList &L, int i, int e)
{
    DulLinkList p, s;
    int j = 1;
    p = L;
    while(p && j < i)
    {
        p = p->next;
        j++;
    }
    if(!p || j > i)
        return false;
    s  = new DulNode;
    s->data = e;
    s->next = p->next;
    s->prior = p;
    p->next = s;
    return true;
}
//双向链表的删除
bool DeleteList(DulLinkList &L, int i)
{
    DulLinkList p, q;
    int j = 1;
    p = L;
    while(p->next && j < i)
    {
        p = p->next;
        j++;
    }
    if(!p->next || j > i)
        return false;
    if(p->next->next == NULL)
    {
        q = p->next;
        p->next = NULL;
        delete q;
    }
    else
    {
        q = p->next;
        p->next = q->next;
        q->next->prior = p;
        delete q;
    }
    return true;
}
//双向链表的清除
void ClearList(DulLinkList &L)
{
    DulLinkList p, q;
    p = L->next;
    while(p)
    {
        q = p;
        p = p->next;
        delete q;
    }
    L->next = NULL;
}
//双向链表的输出
void PutList(DulLinkList L)
{
    DulLinkList p;
    p  = L->next;
    while(p)
    {
        cout << p->data << endl;
        p = p->next;
    }
}
//菜单
void menu()
{
    cout << "1.双向链表的初始化" << endl;
    cout << "2.双向链表的头插发创建" << endl;
    cout << "3.双向链表的尾插法创建" << endl;
    cout << "4.双向链表的查找" << endl;
    cout << "5.双向链表的插入" << endl;
    cout << "6.双向链表的删除" << endl;
    cout << "7.双向链表的清除" << endl;
    cout << "8.双向链表的输出" << endl;
    cout << "0.退出双向链表" << endl;
}
int main()
{
    DulLinkList L;
    int e, i;
    bool n;
    int num;
    while(num != 0)
    {
        system("cls");
        menu();
        cout << "请选选项:";
        cin >> num;
        switch(num)
        {
            case 1: n = InitList(L);
                    if(n == 0)
                        cout << "初始化失败" << endl;
                    else
                        cout << "初始化成功" << endl;
                        break;
            case 2: CreateList_H(L);
                    cout << "头插法创建成功" << endl;
                    break;
            case 3: CreateList_T(L);
                    cout << "尾指针创建成功" << endl;
                    break;
            case 4: cout << "请输入要查找的位置:";
                    cin >> i;
                    n = GetList(L, i, e);
                    if(n == 0)
                        cout << "查找失败" << endl;
                    else
                    {
                        cout << "查找结果:";
                        cout << e << endl;
                    }
                    break;
            case 5: cout << "请输入要插入的位置:";
                    cin >> i;
                    cout << "请输入int型数据:";
                    cin >> e;
                    n = InsertList(L, i, e);
                    if(n == 0)
                        cout << "插入失败" << endl;
                    else
                        cout << "插入成功" << endl;
                    break;
            case 6: cout << "请输入删除位置:";
                    cin >> i;
                    n = DeleteList(L, i);
                    if(n == 0)
                        cout << "删除失败" << endl;
                    else
                        cout << "删除成功" << endl;
                    break;
            case 7: ClearList(L);
                    break;
            case 8: PutList(L);
                    break;
            case 0: break;
            default : "没有输入选项";
        }
        system("pause");
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_37043100/article/details/79624459