双向链表的封装

#include<iostream>
typedef  int DataType;
typedef  int Status;
typedef struct DNode
{   
    DataType data;
    struct DNode *Next;
    struct DNode *Prior;
}DNode,*DoubleList;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
using namespace std;
class D_List
{
    DoubleList L;
public:
    D_List()//???????;
    {
        L=(DoubleList)new DNode;
        L->Next=NULL;
        L->Prior=NULL;
    }
    void Creat_List_H()//???
    {   
        while(1)
        {
            DNode *p;
            bool b;
            p=(DNode *) new DNode;
            cout<<"???Data:"<<endl;
            cin>>p->data;
            p->Next=L->Next;
            p->Prior=L;
            L->Next=p;
            cout<<"Success"<<endl;
            cout<<"??????:   "<<endl;
            cout<<"?          1"<<endl;
            cout<<"?          0"<<endl;
            cin>>b;
            if(!b)
            {
                 break;
            }
        }
    }
    void Creat_List_T()//???
    {   
        
        DNode *tail;
        tail=(DNode *)L;
        while(1)
        {
            bool b;
            DNode *p;
            p=(DNode *) new DNode;
            cout<<"???Data:"<<endl;
            cin>>p->data;
            tail->Next=p;
            p->Prior=tail;
            tail=p;
            p->Next=NULL;
            cout<<"Success"<<endl;
            cout<<"??????:   "<<endl;
            cout<<"?          1"<<endl;
            cout<<"?          0"<<endl;
            cin>>b;
            if(!b)
            {
                 break;
            }
        }
    }
    DNode *GetNode()//??????????
    {  
        int  pos;
        DNode *p;
        cout<<"???????:"<<endl;
        cin>>pos;
        p=L->Next;
        pos--;
        while(p&&pos)
        {
            p=p->Next;
            pos--;
        }
        if(!p)
        {
            cout<<"????"<<endl;
        }
        return p;
    }
    DNode *Locate(DataType e)//????
    {   
        DNode *p;
        p=(DNode*)L->Next;
        while(p&&p->data!=e)
        {
            p=p->Next;
        }
        if(!p)
        {
            cout<<"????"<<endl;
        }
        else
            return p;
    }
    void InsList()
    {
        int pos;
        DNode *p,*q;
        cout<<"???????:"<<endl;
        cin>>pos;
        p=L->Next;
        pos--;
        while(p&&pos)
        {
                    p=p->Next;
                    pos--;
        }
        if(!p)
        {
            cout<<"????"<<endl;
            return;
        }
        else
        {  
            q=(DNode *)new DNode;
            cout<<"???DATA:"<<endl;
            cin>>q->data;
            if(!p->Next)
            {
                p->Next=q;
                q->Prior=p;
                q->Next=NULL;
            }
            else
                {    
                    q->Next=p;
                    q->Prior=p->Prior;
                    p->Prior->Next=q;
                    p->Prior=q;
                }
            cout<<"sucess"<<endl;
        }
    }
    void DelList()
    {
        int pos;
        DNode *p;
        cout<<"???????:"<<endl;
        cin>>pos;
        p=L->Next;
        pos--;
        while(p&&pos)
            {
                p=p->Next;
                pos--;
            }
        if(!p)
        {
            cout<<"????"<<endl;
            return;
        }
        else
        {  
            if(!(p->Next))
            {
                p->Prior->Next=NULL;
                delete(p);
            }
            else
            {
                p->Prior->Next=p->Next;
                p->Next->Prior=p->Prior;
                delete(p);
                cout<<"sucess"<<endl;
            }
        }
    }
    void Display()
    {      
        for(DNode *p=L->Next; p!=NULL; p=p->Next)
        {
            cout<<p->data<<endl;
        }
        cout<<"+++++++++++++++++++++++++++++"<<endl;  //????;
    }
    ~D_List()
    {
        DNode *p,*q;
        q=p=(DNode *)L->Next;
        while(q)
        {
            q=p->Next;
            delete(p);
            p=q;
        }
        delete(L);
        cout<<"??????"<<endl;
    }
};
int main()
{
    return 0;
}

转载于:https://www.cnblogs.com/Howbin/p/8639413.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux内核中,双向链表是一种特殊的数据结构,它的设计初衷是为了解决不同数据类型作为链表数据节点对函数接口和封装的影响。具体操作双向链表的方法可以通过以下步骤实现: 1. 定义链表节点结构体:在使用双向链表之前,需要先定义链表节点的结构体。这个结构体中需要包含一个前驱指针和一个后继指针,用来连接其他节点。 2. 初始化链表头:在使用链表之前,需要先初始化链表头。链表头是一个特殊的节点,它不存储具体的数据,只是一个用来指向链表的起始位置的指针。 3. 插入节点:要在链表中插入一个新的节点,需要先将新节点的前驱指针和后继指针指向正确的位置,然后将原来的前驱节点和后继节点的指针指向新节点。 4. 删除节点:要从链表中删除一个节点,需要将要删除节点的前驱节点的后继指针指向要删除节点的后继节点,将要删除节点的后继节点的前驱指针指向要删除节点的前驱节点。 5. 遍历链表:要遍历整个链表,可以从链表头开始,一直沿着后继指针向后遍历,直到到达链表尾部。 这些是操作Linux双向链表的一些基本方法,使用这些方法可以进行链表的插入、删除和遍历等操作。同时,Linux内核中还提供了一些宏定义和函数来更方便地操作双向链表,比如container_of宏可以通过节点指针获取节点所在的结构体指针。 参考文献: linux 内核双向链表文件 首先介绍下双向链表的相关知识,最后有实战代码 container_of的定义在linux内核include/linux/kernel.h中<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [linux源码内核双向链表文件](https://download.csdn.net/download/qq_18376583/86770056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [linux 双向链表详解](https://blog.csdn.net/kksc1099054857/article/details/121717238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值