双向链表存储结构

#include
#include
using namespace std;

// 线性表的双向链表存储结构
struct node{
    int data;
    node *prev,*next; // 声明
    
};

// 双向链表存储
class doubleLink{
private:
    node *eleStart,*eleEnd;

    node* nodeLink(node*,int);// 形成链表
    void writeData(int*,int); // 输入数组,形成链表
    node* backNodeFromKey(int);// 根据键值返回对象指针
public:
    doubleLink(int *iData,int Length);// 构造函数
    doubleLink();// 构造函数,手动输入,构建双向链表

    ~doubleLink(); // 析构函数

    void printFromEnd(); // 从后前遍历并输出
    void printFromStart(); // 从前往后遍历并输出
    int pop();
    int push(int);
    int length();//@todo 未定义
    void add(int,int);// 局部增加
    node* isEmpty();// 判断是否为空
};


// 输入任何数字
int main(){
    doubleLink *dl = new doubleLink();
    if(! dl->isEmpty()) return 0;

    dl->add(1,22222);


    dl->printFromStart();
delete dl;
    return 0;

}




void doubleLink::add(int key,int num){
    if(this->length()<0) return;
    node* n = this->backNodeFromKey(key);
    node *tmp = n->next;
    n->next = this->nodeLink(n,num);
    n->next->next = tmp;
}
// 从后端弹出
int doubleLink::pop(){
    node *tmp = this->eleEnd->prev;

    int t = this->eleEnd->data;
    delete this->eleEnd;
    this->eleEnd = tmp;
    tmp && (tmp->next = NULL);
    return t;
}
// 从后端写入
int doubleLink::push(int n){
    this->eleEnd = this->nodeLink(this->eleEnd,n);
    this->eleEnd->next = NULL;
    return n;
}
int doubleLink::length(){
    node *n = this->eleStart;
    int i=0;
    while(n){
        n = n->next;
        i++;
    }
    return i;
}

//从前端弹出,从前端写入,从中间某部分写入


doubleLink::~doubleLink(){
    if(this->eleStart){

        node *n = this->eleStart;
        node *n1;
        while(n){
            n1 = n;
            n = n->next;
            delete n1;
        }
    }
}

node* doubleLink::isEmpty(){
    return this->eleEnd;
}


doubleLink::doubleLink(int *iData,int Length){
    this->writeData(iData,Length);
}

doubleLink::doubleLink(){
    cout<<"Enter numbers you want, separated by space, ending with 0 : ";

    int i=0,num=0;    
    node *swapNode = NULL;

    while(true){
        cin>>num;
        if(num == 0) break;
        swapNode = this->nodeLink(swapNode,num);
        if(i==0) this->eleStart = swapNode;
        i++;
    }
    swapNode && (swapNode->next = NULL);
    this->eleEnd = swapNode;
}


void doubleLink::printFromEnd(){ // 终结点开始遍历
    node *n = this->eleEnd;
    while(n){
        cout<<n->data<<endl;
        n = n->prev;
    }
}


void doubleLink::printFromStart(){ // 起始点开始遍历
    node *n = this->eleStart;
    while(n){
        cout<<n->data<<endl;
        n = n->next;
    }
}

// @access private 形成链表
node* doubleLink::nodeLink(node *prev,int data){
    // 申请空间,赋值于指针
    node *eleNode = new node; // (node *)malloc(sizeof(node));    
    // 写入数据
    eleNode->data = data;
    // 写入前一个指针
    eleNode->prev = prev;
    // 前一个指针对象赋值为当前对象
    if(prev) prev->next = eleNode;
    // 返回当前对象
    return eleNode;
}

// @access private 数组的形式形成链表存储
void doubleLink::writeData(int *iData,int length){
    // 数据
    node *swapNode = NULL;
    for(int i=0,j=length;i!=j;i++){
        swapNode = this->nodeLink(swapNode,*(iData+i));
        if(i==0) this->eleStart = swapNode;
    }
    swapNode->next = NULL;
    this->eleEnd = swapNode;
}
// 顺序键值,返回当前的节点
node *doubleLink::backNodeFromKey(int k){
    node *n = this->eleStart;
    int v = 0;
    while(n){
        v++;
        if(v == k) break;
        n = n->next;
    }
    return n;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值