双向链表存储结构

来源:互联网 发布:淘宝商家怎么找客服 编辑:程序博客网 时间:2024/06/05 22:40
#include
#include
using namespace std;

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

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

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

   ~doubleLink(); // 析构函数

    voidprintFromEnd(); // 从后前遍历并输出
    voidprintFromStart(); // 从前往后遍历并输出
    intpop();
    intpush(int);
    intlength();//@todo 未定义
    voidadd(int,int);// 局部增加
    node*isEmpty();// 判断是否为空
};


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

   dl->add(1,22222);


   dl->printFromStart();
delete dl;
    return0;

}




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;
    deletethis->eleEnd;
   this->eleEnd = tmp;
    tmp&& (tmp->next = NULL);
    returnt;
}
// 从后端写入
int doubleLink::push(int n){
   this->eleEnd =this->nodeLink(this->eleEnd,n);
   this->eleEnd->next = NULL;
    returnn;
}
int doubleLink::length(){
    node *n =this->eleStart;
    inti=0;
   while(n){
      n = n->next;
      i++;
    }
    returni;
}

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


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

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

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


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

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

    inti=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;
    //返回当前对象
    returneleNode;
}

// @access private 数组的形式形成链表存储
void doubleLink::writeData(int *iData,int length){
    // 数据
    node*swapNode = NULL;
    for(inti=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;
    }
    returnn;
}


原创粉丝点击