05_线性表的链式存储结构---双向链表

/*dlinkList.h*/
#pragma once

#include <iostream>
#include <malloc.h>
using namespace std;

struct DLinkListNode {

    DLinkListNode *pre;
    DLinkListNode *next;
};
struct DLinkList {

    DLinkListNode header;
    DLinkListNode *cursor;
    int length;
};

class dLinkList{

    public:
        dLinkList();

        ~dLinkList();

        DLinkList* DLinkList_Create();

        void DLinkList_Destroy(DLinkList* list);

        void DLinkList_Clear(DLinkList* list);

        int DLinkList_Length(DLinkList* list);

        int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos);

        DLinkListNode* DLinkList_Get(DLinkList* list, int pos);

        DLinkListNode* DLinkList_Delete(DLinkList* list, int pos);

        DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);

        DLinkListNode* DLinkList_Reset(DLinkList* list);

        DLinkListNode* DLinkList_Current(DLinkList* list);
};

/*dlinkList.cpp*/
#include "dLinkList.h"



dLinkList::dLinkList() { }


dLinkList::~dLinkList() { }


DLinkList* dLinkList::DLinkList_Create() {

    DLinkList *list = (struct DLinkList*)malloc(sizeof(struct DLinkList));
    if ( list!=nullptr ) {
        list->length = 0;
        list->cursor = nullptr;
        list->header.next = nullptr;
        list->header.pre = nullptr;
    }
    return list;
}


void dLinkList::DLinkList_Destroy(DLinkList* list) {

    if ( nullptr!=list ) {
        free(list);
        list = nullptr;
    }
}


void dLinkList::DLinkList_Clear(DLinkList* list) {

    if ( nullptr!=list ) {
        list->length;
        list->cursor = nullptr;
        list->header.next = nullptr;
        list->header.pre = nullptr;
    }
}


int dLinkList::DLinkList_Length(DLinkList* list) {

    int ret = -1;
    if( list!=nullptr ){
        ret = list->length;
    }
    return ret;
}


int dLinkList::DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) {

    int ret = -1;
    ret = (list!=nullptr) && (node!=nullptr) && (pos>=0);
    if ( ret ) {
        pos = pos % (list->length+1);//notice
        DLinkListNode *current = &list->header;
        for (int i = 0; i < pos; ++i ) {
            current = current->next;
        }
        node->next = current->next;
        node->pre = current;
        current->next = node;
        if( node->next!=nullptr ) 
            node->next->pre = node;//如果是尾节点,
        if ( list->length==0 ) 
            list->cursor = node;
        ++list->length;
    }
    return ret;
}


DLinkListNode* dLinkList::DLinkList_Get(DLinkList* list, int pos) {

    DLinkListNode *ret = nullptr;
    if ( (list!=nullptr)&&(pos>=0)&&(list->length>=0) ) {
        pos = pos%list->length;
        DLinkListNode *current = &list->header;
        for (int i = 0; i < pos; ++i ) {
            current = current->next;
        }
        ret = current->next;
    }
    return ret;
}


DLinkListNode* dLinkList::DLinkList_Delete(DLinkList* list, int pos) {

    DLinkListNode *ret = nullptr;
    if ( (list!=nullptr)&&(pos>=0)&&(list->length>0) ) {
        pos = pos%list->length;
        DLinkListNode *current = &list->header;
        for (int i = 0; i < pos; ++i ) {
            current = current->next;
        }
        ret = current->next;
        current->next = ret->next;
        if ( ret->next!=nullptr )
            ret->next->pre = current ;
        --list->length ;
        if (list->cursor == ret) {
            list->cursor = ret->next;
        }
    }
    return ret;
}


DLinkListNode* dLinkList::DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node) {

    DLinkListNode *ret = nullptr;
    int i = 0;
    if ( (list!=nullptr)&&(node!=nullptr)&&(list->length>0) ) {
        DLinkListNode *current = &list->header;
        for (i = 0; i < list->length; ++i ) {
            current = current->next;
            if ( node==current ) {
                ret = current;
                break;
            }
        }
        if ( ret!=nullptr ) {
            DLinkList_Delete(list,i);
        }
    }
    return ret;
}


DLinkListNode* dLinkList::DLinkList_Reset(DLinkList* list) {

    DLinkListNode *ret = nullptr;
    if ( list!=nullptr ) {
        list->cursor = list->header.next;
        ret = list->cursor;
    }
    return ret;
}

/*main.cpp*/
#include "dLinkList.h"


struct student {

    DLinkListNode node;
    int age;
};


int main( int argc , char **argv ) {

    dLinkList chen;
    DLinkList *list = chen.DLinkList_Create();
    if ( nullptr==list ) {
        return -1;
    }
    student s1;
    student s2;
    student s3;
    student s4;
    student s5;
    s1.age = 11;
    s2.age = 22;
    s3.age = 33;
    s4.age = 44;
    s5.age = 55;

    chen.DLinkList_Insert( list , &s1.node , 0 );
    chen.DLinkList_Insert( list , &s2.node , 0 );
    chen.DLinkList_Insert( list , &s3.node , 0 );
    chen.DLinkList_Insert( list , &s4.node , 0 );
    chen.DLinkList_Insert( list , &s5.node , 0 );
    for (int i = 0; i < chen.DLinkList_Length(list); ++i) {
        student *node = (student*)chen.DLinkList_Get(list,i);
        if( node!=nullptr ) 
            cout << node->age << endl;
    }
    cout << "----------" << endl;
    for (int i = 0; i < 5; ++i) {
        student *node = (student*)chen.DLinkList_Delete(list, 0);
        if (node != nullptr)
            cout << node->age << endl;
    }

    system( "pause" );
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值