#ifndef LINKLIST_H
#define LINKLIST_H
using namespace std;
template <class elem_type>
class LINKLIST
{
private:
struct NODE
{
NODE *pre;
elem_type element;
NODE *next;
NODE(const elem_type &element,NODE *pre=NULL,NODE *next=NULL);
NODE();
~NODE();
};
NODE *head;
NODE *tail;
NODE *current;
int size;
NODE *pos(int i) const;
public:
LINKLIST();
~LINKLIST();
void insert(int i,const elem_type &x);
void traverse() const;
void clear();
int size_list() const;
void combine_list(const LINKLIST &y);
void combine_list(LINKLIST &x,const LINKLIST &y);
void combine_list(LINKLIST &x,const LINKLIST &y,const LINKLIST &z);
};
template <class elem_type>
LINKLIST <elem_type>::NODE::NODE(const elem_type &element,NODE *pre,NODE *next):element(element),pre(pre),next(next){}
template <class elem_type>
LINKLIST <elem_type>::NODE::NODE():pre(NULL),next(NULL){}
template <class elem_type>
LINKLIST <elem_type>::NODE::~NODE(){}
template <class elem_type>
LINKLIST <elem_type>::LINKLIST()
{
head=new NODE;
head->next=tail=new NODE;
tail->pre=head;
tail->next=head;
head->pre=tail;
size=0;
}
template <class elem_type>
LINKLIST <elem_type>::~LINKLIST()
{
clear();
delete head;
delete tail;
}
template <class elem_type>
typename
LINKLIST <elem_type>::NODE *LINKLIST <elem_type>::pos(int i) const
{
NODE *temp=head->next;
if(i<0||i>size+1)
{
cout<<"range out linklist"<<endl;
return NULL;
}
else
{
while(i--)
temp=temp->next;
}
return temp;
}
template <class elem_type>
void LINKLIST<elem_type>::insert(int i,const elem_type &x)
{
NODE *p,*temp;
p=pos(i);
temp=new NODE(x,p->pre,p);
p->pre->next=temp;
p->pre=temp;
++size;
}
template <class elem_type>
void LINKLIST<elem_type>::traverse() const
{
NODE *temp;
temp=head->next;
cout<<"The LINKLIST ---\n";
while(temp!=tail)
{
cout<<"["<<(char)temp->element<<"] ";
temp=temp->next;
}
cout<<endl;
}
template <class elem_type>
void LINKLIST <elem_type>::clear()
{
NODE *p;
NODE *q;
p=head->next;
head->next=tail;
tail->pre=head;
while(p!=tail)
{
q=p->next;
delete p;
p=q;
}
size=0;
}
template <class elem_type>
int LINKLIST <elem_type>::size_list() const
{
return size;
}
template <class elem_type>
void LINKLIST <elem_type>::combine_list(const LINKLIST &y)
{
for(NODE *temp=y.head->next;temp!=y.tail;temp=temp->next)
insert(size_list(),temp->element);
}
template <class elem_type>
void LINKLIST <elem_type>::combine_list(LINKLIST &x,const LINKLIST &y)
{
for(NODE *temp=y.head->next;temp!=y.tail;temp=temp->next)
x.insert(x.size_list(),temp->element);
}
template <class elem_type>
void LINKLIST <elem_type>::combine_list(LINKLIST &x,const LINKLIST &y,const LINKLIST &z)
{
for(NODE *temp=y.head->next;temp!=y.tail;temp=temp->next)
x.insert(x.size_list(),temp->element);
for(NODE *temp=z.head->next;temp!=z.tail;temp=temp->next)
x.insert(x.size_list(),temp->element);
}
#endif
#include <iostream>
#include "linklist.h"
using namespace std;
int main(int argc,char *argv[])
{
LINKLIST <int> a;
int i;
for(i=97;i<97+26;i++)
a.insert(a.size_list(),i);
LINKLIST <int> b;
for(i=97;i<97+5;i++)
b.insert(i-97,i);
a.traverse();
b.traverse();
LINKLIST <int> c;
c.combine_list(a);
c.combine_list(b);
c.traverse();
return 0;
}
main: link_main.o
g++ link_main.o -o link
rm -rf link_main.o
link_main.o: linklist.h
g++ -c link_main.cpp
clean: link
rm -rf link link_main.o
分享到:
相关推荐
一种支持类模版和函数模版的C++双向链表,实现了各种排序算法(排序原则可定制),包含学生信息的使用示例(VC 6.0、VS2008).
自己写的实现c++双向链表的功能,包括InsertAtHead,Append,RemoveHead,RemoveTail,InsertAfter, DeleteAt,Reset,GetPre,GetNext等函数 压缩包里包含CMyList.h和CMyList.cpp两个文件
使用C++双向列表统计文章单词出现频率,其中双向列表模仿STL中的List.
c++的双向链表 next pre 。的建立和插入一个介于ab之间的值x的方法
C++ 双向链表实现学生管理系统
C++双向链表删除,修改,插入,排序,全面,界面人性化
双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
C语言链表程序,内含链表的创建、插入、查找、遍历、删除和释放。 C语言链表程序,内含链表的创建、插入、查找、遍历、删除和释放。
基础数据结构双向链表的C++描述版。实现了双向链表的基本功能。包括拷贝构造函数和IO操作符重载、赋值操作符重载
C++实现的双向链表类,很好的资源。。希望大家支持啊。。。
这是数据结构的约瑟夫双向链表算法,用c++做的,使我们学习数据结构的时候老师让我们做的实验,很经典,提供给大家参考一下!
详细的介绍了Linux内核中使用的最频繁的双向链表
C++经典算法 双向链表 采用了结构体,链表的知识。
主要介绍了c++双向链表操作示例,包括创建双向链、删除双向链表、双向链表中查找数据、插入数据等,需要的朋友可以参考下
mfc双向链表 注释详细 对于数据结构的理解有一定帮助
自己在学习的时候创建的一个双向链表类!提供大家参考。
用模板类实现了一个简单的双向链表domo。
实现双向链表,查找、替换、删除、插入,并用线程同步技术实现了多线程读写与线程安全
实现双向链表的增删改查功能,dos窗口输入输出,可运行,有注释