双向链表的节点结构及部分函数的实现

1.节点结构以及成员的意义

typedef int ElemType;

typedef struct DNode {
    ElemType data;

    struct DNode* next;//指向前一个节点
    struct DNode* prior;//指向后一个节点
}DNode,*DLinkList;

2.需要实现的部分函数的声明

void InitDLinkList(DLinkList dlist);

//
bool InsertDLinkListPos(DLinkList dlist,ElemType value,int pos);

bool InsertDLinkListhead(DLinkList dlist, ElemType value);

bool InsertDLinkListRear(DLinkList dlist, ElemType value);


bool DEmpty(DLinkList dlist);//判空

int DLength(DLinkList dlist);//求长度
//删
bool DeleteDLinkListPos(DLinkList dlist, int pos); bool DeleteDLinkListhead(DLinkList dlist); bool DeleteDLinkListRear(DLinkList dlist); bool DeleteDLinkListValue(DLinkList dlist, ElemType value); //查找第一个值是key的节点,找到的话返回这个节点,没找到的话返回NULL DLinkList Search(DLinkList plist, ElemType key); //清空, 直接调用销毁 void Clear(DLinkList dlist); //销毁 void Destory(DLinkList dlist); //打印 void Show(DLinkList dlist);

3.函数的具体实现

static DLinkList Buy_DNode(DLinkList head, ElemType value)//购买节点
{
    DLinkList new_node = (DLinkList)malloc(sizeof(DNode));
    if (new_node == nullptr) return nullptr;
    
    new_node->data = value;

    new_node->next = head->next;
    if(head->next != nullptr)
    { 
    head->next->prior = new_node;
    }
    new_node->prior = head;
    return new_node;
}

void InitDLinkList(DLinkList dlist)
{
    assert(dlist != nullptr);
    dlist->next = nullptr;
    dlist->prior = nullptr;
}

//增删改查
bool InsertDLinkListPos(DLinkList dlist, ElemType value, int pos)
{
    assert(dlist != nullptr && pos >= 0 && pos <= DLength(dlist));
    DLinkList p = dlist;
    while (pos > 0)
    {
        p = p->next;
        pos--;
    }
    DLinkList new_node = Buy_DNode(p,value);
    if (nullptr == new_node) return false;
    p->next = new_node;
    return true;
}

bool InsertDLinkListhead(DLinkList dlist, ElemType value)
{
    assert(dlist != nullptr);
    DLinkList new_node = Buy_DNode(dlist, value);
    if (nullptr == new_node) return false;
    dlist->next = new_node;
    return true;
}

bool InsertDLinkListRear(DLinkList dlist, ElemType value)
{
    assert(dlist != nullptr);
    
    DLinkList p = dlist;
    while (p->next != nullptr)
    {
        p = p->next;
    }

    DLinkList new_node = Buy_DNode(p, value);
    if (new_node == nullptr) return false;
    p->next = new_node;
    return true;
}


bool DEmpty(DLinkList dlist)
{
    assert(dlist != nullptr);
    return dlist->next == nullptr;
}

int DLength(DLinkList dlist)
{
    assert(dlist != nullptr);
    int count = 0;
    DLinkList p = dlist->next;
    while (p != nullptr)
    {
        p = p->next;
        count++;
    }
    return count;
}

bool DeleteDLinkListPos(DLinkList dlist, int pos)
{
    assert(dlist != nullptr && pos >= 0 && pos < DLength(dlist));
    if (DEmpty(dlist)) return false;
    DLinkList p = dlist;
    while (pos > 0)
    {
        p = p->next;
        pos--;
    }
    DLinkList q = p->next;
    p->next = q->next;
    q->next->prior = q;
    free(q);
    return true;
}

bool DeleteDLinkListhead(DLinkList dlist)
{
    assert(dlist != nullptr);
    if (dlist->next == nullptr)return false;
    DLinkList p = dlist;
    p = dlist->next;
    dlist->next = p->next;
    p->next->prior = dlist;
    free(p);
    return true;
}

bool DeleteDLinkListRear(DLinkList dlist)
{
    assert(dlist != nullptr);
    DLinkList p = dlist->next;
    while (p->next != nullptr)
    {
        p = p->next;
    }
    p->prior->next = nullptr;
    free(p);
    return true;
}

bool DeleteDLinkListValue(DLinkList dlist, ElemType value)
{
    assert(dlist != nullptr);
    DLinkList p = Search(dlist, value);
    if (p == nullptr) return false;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);
    return true;
}

//查找第一个值是key的节点,找到的话返回这个节点,没找到的话返回NULL
DLinkList Search(DLinkList dlist, ElemType key)
{
    assert(dlist != nullptr);
    DLinkList p = dlist->next;
    while (p != nullptr)
    {
        if (p->data == key)
        {
            return p;
        }
        p = p->next;
    }
    
    return nullptr;
}



//清空, 直接调用销毁
void Clear(DLinkList dlist)
{
    Destory(dlist);
}

//销毁
void Destory(DLinkList dlist)
{
    assert(dlist != nullptr);
    DLinkList p = nullptr;
    p = dlist->next;
    while (p != nullptr)
    {
        p = dlist->next;
        dlist->next = p->next;
        free(p);
    }
}

//打印
void Show(DLinkList dlist)
{
    assert(dlist != nullptr);
    DLinkList p = dlist->next;
    while (p != nullptr)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

 ps:代码可以直接复制执行,若发现错误,请务必留言告知,谢谢.

posted @ 2021-05-08 13:06  Wz_qq_2***6  阅读(55)  评论(0)    收藏  举报