https://blog.csdn.net/m0_37806112/article/details/80626545
==============================================================================
.h
#ifndef __MYINCLUDE_
#include <stdio.h>
#include <iostream>
struct node
{
int data;
node *prev;
node *next;
};
class Stringbad
{
private:
char *str;
int len;
static int num_string;
public:
Stringbad(const char *s);
Stringbad();
~Stringbad();
friend std::ostream& operator<<(std::ostream &os,const Stringbad &st);
};
class doublelinks
{
public:
doublelinks();
~doublelinks();
public:
int doublelink_insert(doublelinks *ptr,int position,int number);//头插法操作插入数据
int doublelink_Tailinsert(doublelinks *ptr,int number);//尾插法操作
int doublelink_erase(doublelinks* ptr,int position); //删除
void doublelink_display(doublelinks *ptr ,int num); //显示
int doublelink_getlength(doublelinks *ptr); //指针自增
node *CreateNode(int data);
void test(void);
private:
int length;
node* root; //设置根节点(设置头节点)
node* rear; //设置尾部节点
};
#endif
=========================================================================
.cpp
#include <stdio.h>
#include <iostream>
#include "../include/myinclude.h"
#include <vector>
using namespace std;
//构造函数与析构函数
//进行节点初始化 操作
doublelinks::doublelinks()
{
root=new node;
root->prev=NULL;
root->next=NULL;
length=0;
}
//析构函数
doublelinks::~doublelinks()
{
}
//创建一个节点
node *creatnode(int data)
{
node *pnode=new node;
pnode->data=data;
pnode->prev=pnode=pnode->next;
return pnode;
}
//获取双向链表的位置
int doublelinks::doublelink_getlength(doublelinks* ptr)
{
return ptr->length;
}
//头插法插入操作
int doublelinks::doublelink_insert(doublelinks* ptr,int position,int member)
{
node *nodeinsert=new node;
nodeinsert->data=member;
//如果是空的链表,指针往后1移动
if(ptr->doublelink_getlength(ptr)==0)
{
root->next=nodeinsert;
nodeinsert->prev=nodeinsert;
nodeinsert->next=nodeinsert;
ptr->length++;
return 0;
}
else {
//采用的是头插法,数据显示为倒序
if(position==0)
{
//采用的是头插法
nodeinsert->prev=root->next->prev;
nodeinsert->next=root->next;
root->next=nodeinsert;
root->next->prev=nodeinsert;
root->next=nodeinsert;
ptr->length++;
return 0;
}
else
{
node *current=root->next;
for(int i=0;i<position;i++)
{
current=current->next;
}
nodeinsert->next=current;
nodeinsert->prev=current->prev;
current->prev->next=nodeinsert;
current->prev=nodeinsert;//节点更新
ptr->length++;
return 0;
}
}
}
//采用尾部插入数据,插入的数据为正排序
int doublelinks::doublelink_Tailinsert(doublelinks *ptr,int number)
{
node *nodeinsert=new node; //为新插入的节点开辟空间
nodeinsert->data=number; //在要插入的节点插入数据
//需要一个指针Tail始终指向表尾
node *p=root;
node *q=NULL;
while(p!=NULL)
{
q=p;
p=p->next;
}
//在双向链表的尾部插入数据
q->next=nodeinsert;
nodeinsert->prev=q;
nodeinsert->next=NULL;
ptr->length++;
return 0;
}
int doublelinks::doublelink_erase(doublelinks* ptr, int position)
{
if (ptr->doublelink_getlength(ptr) == 0)
{
cout << "链表为空,oop!!" << 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->prev->next = deletenode->next;
deletenode->next->prev = deletenode->prev;
delete deletenode;
ptr->length--;
}
}
}
void doublelinks::doublelink_display(doublelinks* ptr,int num)
{
node* current=root->next;
for(int i=0;i<num;i++)//将链表中的数据进行遍历输出
{
cout<<"链表中数据:"<<current->data<<endl;
current=current->next;
}
cout<<endl;
}
void doublelinks::test(void)
{
doublelinks* doublelink_ptr=new doublelinks;
for(int i=10;i>0;i--)
{
doublelink_ptr->doublelink_insert(doublelink_ptr,0,i); //循环插入插入十个数据
}
doublelink_ptr->doublelink_display(doublelink_ptr,20); //显示插入的数据的链表
doublelink_ptr->doublelink_erase(doublelink_ptr,5);//将第5+1位置的数据删除掉,变为0
doublelink_ptr->doublelink_display(doublelink_ptr,20);//将链表中的数据删除调用
return;
}
//进行测试
int main()
{
doublelinks test;
test.test();
return 0;
}