双向链表的C++实现
2017-01-20 22:04
309 查看
出处:http://blog.csdn.NET/hongkangwl/article/details/22286469
首先定义节点的结构
[cpp] view
plain copy
print?
<span style="font-size:18px;">struct node
{
int date;
node* prev;
node* next;
};
</span>
老样子,建立双链表的类
[cpp] view
plain copy
print?
<span style="font-size:18px;">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->prev = NULL;
root->next = NULL;
length = 0;
}
protected:
private:
int length;
node* root;
};</span>
插入元素
[cpp] view
plain copy
print?
[cpp] view
plain copy
print?
<span style="font-size:18px;">int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
{
node* nodeinsert = new node;
nodeinsert->date = member;
if (ptr->doublelink_getlength(ptr) == 0)
{
root->next = nodeinsert;
nodeinsert->prev = nodeinsert;
nodeinsert->next = nodeinsert;
ptr->length++;
return 0;
}
else
{
if (position == 0)
{
/* root->next->prev = nodeinsert;
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev = nodeinsert;*/
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev->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;
//nodeinsert->next = nodeinsert;
current->prev = nodeinsert;
ptr->length++;
return 0;
}
}
}</span>
删除一个元素,注意0位置上的
[cpp] view
plain copy
print?
<span style="font-size:18px;">int doublelink::doublelink_erase(doublelink* 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--;
}
}
}</span>
完整实现代码和测试结果
[cpp] view
plain copy
print?
<span style="font-size:18px;">#include <iostream>
using namespace std;
struct node
{
int date;
node* prev;
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->prev = NULL;
root->next = NULL;
length = 0;
}
protected:
private:
int length;
node* root;
};
int doublelink::doublelink_erase(doublelink* 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 doublelink::doublelink_display(doublelink* ptr, int num)
{
node* current = root->next;
for (int i = 0; i < num; i++)
{
cout<<current->date<<" ";
current = current->next;
}
cout<<endl;
}
int doublelink::doublelink_getlength(doublelink* ptr)
{
return ptr->length;
}
int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
{
node* nodeinsert = new node;
nodeinsert->date = member;
if (ptr->doublelink_getlength(ptr) == 0)
{
root->next = nodeinsert;
nodeinsert->prev = nodeinsert;
nodeinsert->next = nodeinsert;
ptr->length++;
return 0;
}
else
{
if (position == 0)
{
/* root->next->prev = nodeinsert;
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev = nodeinsert;*/
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev->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;
//nodeinsert->next = nodeinsert;
current->prev = nodeinsert;
ptr->length++;
return 0;
}
}
}
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;
}</span>
测试正确~~
首先定义节点的结构
[cpp] view
plain copy
print?
<span style="font-size:18px;">struct node
{
int date;
node* prev;
node* next;
};
</span>
老样子,建立双链表的类
[cpp] view
plain copy
print?
<span style="font-size:18px;">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->prev = NULL;
root->next = NULL;
length = 0;
}
protected:
private:
int length;
node* root;
};</span>
插入元素
[cpp] view
plain copy
print?
[cpp] view
plain copy
print?
<span style="font-size:18px;">int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
{
node* nodeinsert = new node;
nodeinsert->date = member;
if (ptr->doublelink_getlength(ptr) == 0)
{
root->next = nodeinsert;
nodeinsert->prev = nodeinsert;
nodeinsert->next = nodeinsert;
ptr->length++;
return 0;
}
else
{
if (position == 0)
{
/* root->next->prev = nodeinsert;
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev = nodeinsert;*/
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev->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;
//nodeinsert->next = nodeinsert;
current->prev = nodeinsert;
ptr->length++;
return 0;
}
}
}</span>
删除一个元素,注意0位置上的
[cpp] view
plain copy
print?
<span style="font-size:18px;">int doublelink::doublelink_erase(doublelink* 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--;
}
}
}</span>
完整实现代码和测试结果
[cpp] view
plain copy
print?
<span style="font-size:18px;">#include <iostream>
using namespace std;
struct node
{
int date;
node* prev;
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->prev = NULL;
root->next = NULL;
length = 0;
}
protected:
private:
int length;
node* root;
};
int doublelink::doublelink_erase(doublelink* 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 doublelink::doublelink_display(doublelink* ptr, int num)
{
node* current = root->next;
for (int i = 0; i < num; i++)
{
cout<<current->date<<" ";
current = current->next;
}
cout<<endl;
}
int doublelink::doublelink_getlength(doublelink* ptr)
{
return ptr->length;
}
int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
{
node* nodeinsert = new node;
nodeinsert->date = member;
if (ptr->doublelink_getlength(ptr) == 0)
{
root->next = nodeinsert;
nodeinsert->prev = nodeinsert;
nodeinsert->next = nodeinsert;
ptr->length++;
return 0;
}
else
{
if (position == 0)
{
/* root->next->prev = nodeinsert;
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev = nodeinsert;*/
nodeinsert->prev = root->next->prev;
nodeinsert->next = root->next;
root->next->prev->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;
//nodeinsert->next = nodeinsert;
current->prev = nodeinsert;
ptr->length++;
return 0;
}
}
}
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;
}</span>
测试正确~~
相关文章推荐
- 双向循环链表的c++ 实现
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- C++ List 双向链表 实现 会用也要会写
- 双向链表的相关操作C++实现
- 简单双向链表(C++模版技术实现)
- 数组、单链表和双链表介绍 和 双向链表的C/C++/Java实现
- C++ 学习练手 - 双向链表的模板实现
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- 构造双向链表根据访问频度动态调整位置_C++实现
- 双向链表的C++实现 Implement of Doubly Linked List
- 双向链表之C++实现
- c++双向链表的实现_1.0版本
- 双向循环链表插入算法的C++程序实现
- 双向链表的相关操作C++实现
- 多文件编程动态开辟空间实现双向链表的应用 c++版
- 双向链表的C++实现
- 使用C++实现的双向链表
- 使用C++实现的双向链表