#include <iostream>
using namespace std;
/*****************@copyright2019**************
* Function:doublelink
* Author:zjl
* date:2019-6-12
* Version:V1.0
* *******************************************/
/*************************************************
*
* 定义节点链表node
*
* ***********************************************/
struct node
{
int data;
node *pre;//前驱
node *next;//后继
};
//建立一个空的链表
class doublelink
{
public:
//定义方法
int doublelink_insert(doublelink *ptr,int position,int member);
int doublelink_erase(doublelink *ptr,int position);
void doublelink_display(doublelink *ptr,int num);
int doublelink_getlength(doublelink *ptr);
//结构体初始化
doublelink()
{
root=new node; //动态开辟内存空间
root->pre=NULL;
root->next=NULL;
length=0;
}
private:
//定义字段
int length;
node* root;
};
//得到链表的长度
int doublelink::doublelink_getlength(doublelink *ptr)
{
return ptr->length;
}
/***********************具体方法实现***********************************/
/********************************************************************
* 函数名:int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
* 函数功能:在链表的指定位置插入数据
* 入口参数:doublelink *ptr:链表 int position:插入的位置 int member:待插入的成员
* 返回参数:
* 函数调用:
*
*
* *****************************************************************/
int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
{
node* nodeinsert =new node;//开辟一个节点空间
nodeinsert->data=member;
if(ptr->doublelink_getlength(ptr)==0)//当双向链表只有一个头节点时
{
root->next=nodeinsert;//待插入的节点
nodeinsert->pre=nodeinsert;
nodeinsert->next=nodeinsert;
ptr->length++;
return 0;
}
else
{
if(position==0)//在一个位置插入节点
{
nodeinsert->pre=root->next->pre;//前驱
nodeinsert->next=root->next;//后继
root->next->pre->next=nodeinsert;
root->next->pre=nodeinsert;
ptr->length++;
return 0;
}
else //在其他位置v插入数据
{
node *current=root->next;
for(int i=0;i<position;i++)
{
current=current->next;
}
nodeinsert->next=current;
nodeinsert->pre=current->pre;
current->pre->next=nodeinsert;
current->pre=nodeinsert;
ptr->length++;
return 0;
}
}
}
//删除一个元素
int doublelink::doublelink_erase(doublelink *ptr,int position)
{
if(ptr->doublelink_getlength(ptr)==0)
{
cout<<"链表为空"<<endl;
return 0;
}
else
{
if(ptr->doublelink_getlength(ptr)==1)
{
ptr->root->next=NULL;
ptr->length--;
}
else
{
node *deletenode=root->next;
for(int i=0;i<position;i++)
{
deletenode=deletenode->next;
}
deletenode->pre->next=deletenode->next;
deletenode->next->pre=deletenode->pre;
delete deletenode;
ptr->length--;
}
}
}
//显示
void doublelink::doublelink_display(doublelink *ptr,int num)
{
node* current=root->next;
for(int i=0;i<num;i++)
{
cout<<current->data<<" ";
current=current->next;
}
cout<<endl;
}
int main()
{
doublelink* doublelink_ptr=new doublelink;
for(int i=0;i<10;i++)
{
doublelink_ptr->doublelink_insert(doublelink_ptr,0,i);
}
doublelink_ptr->doublelink_display(doublelink_ptr,20);
doublelink_ptr->doublelink_erase(doublelink_ptr,2);
doublelink_ptr->doublelink_display(doublelink_ptr,20);
return 0;
}