template <class Elem>
class Link{
public:
Elem element;//数据域
Link *next;
Link(const Elem& elemval, Link* nextval = NULL){
element = elemval;
next = nextval;
}
Link(Link* nextval = NULL){
next = nextval;
}
};
template<class Elem>
class LList :public list<Elem>{
private:
Link<Elem>* head;//头结点
Link<Elem>* tail;//尾节点
Link<Elem>* fence;//栅栏结点
int leftcnt; //栅栏结点左边结点的数目
int rightcnt; //栅栏结点右边结点的数目
void init(){
fence = tail = head = new Link<Elem>;
leftcnt = rightcnt = 0;
}
void removeall(){
while (head != NULL){
fence = head;
head = head->next;
delete fence;
}
}
public:
LList(int size = 0){ init(); }
~LList(){ removeall(); }
void clear(){ removeall(); init(); }
bool insert(const Elem&);
bool append(const Elem&);
bool remove(Elem&);
void setStart(){
fence = head;
rightcnt += leftcnt;
leftcnt = 0;
}
void setEnd(){
fence = tail;
leftcnt += rightcnt;
rightcnt = 0;
}
void prev();
void next(){
if (fence!=tail){
fence = fence->next;
rightcnt--;
leftcnt++;
}
}
int leftLength()const{return leftcnt;}
int rightLength()const{return rightcnt;}
bool setPos(int pos);
bool getValue(Elem& it)const{
if(rightLength()==0)return false;
it = fence->next->element;
return true;
}
void print()const;
bool turn(); //单链表逆序,反转
Link<Elem> quickloc();//快速定位到中间位置
void getBackN(int N){//寻找单链表倒数第N个数
this->setStart();
while(rightcnt!=N-1){
fence=fence->next;
rightcnt--;
leftcnt++;
}
cout<<fence->element;
}
};
template<class Elem>
bool LList<Elem>::insert(const Elem& item){//在栅栏结点后插入结点
fence->next = new Link<Elem>(item, fence->next);
if(tail == fence) tail = fence->next;
rightcnt++;
return true;
}
template<class Elem>
bool LList<Elem>::turn(){//链表就地逆转
Link<Elem> *current=head->next,*p;
if (head == NULL) {
return false;
}
while (current->next != NULL){
p = current->next;
current->next = p->next;
p->next = head->next;
head->next = p;
}
return true;
}
template<class Elem>
bool LList<Elem>::append(const Elem& item){//在尾节点后增加结点
tail = tail->next = new Link<Elem>(item,NULL);
rightcnt++;
return true;
}
template<class Elem>
bool LList<Elem>::remove(Elem& it){
if(fence->next == NULL)return false;
it = fence->next->element;
Link<Elem>* ltemp = fence->next;
fence->next = ltemp->next;
if(tail == ltemp) tail =fence;
delete ltemp;
rightcnt--;
return true;
}
template<class Elem>
void LList<Elem>::prev(){//访问前结点
Link<Elem>* temp= head;
if(fence == head)return ;
while(temp->next!=fence)temp=temp->next;
fence=temp;
leftcnt--;
rightcnt++;
}
template<class Elem>
bool LList<Elem>::setPos(int pos){//把栅栏设在pos处
if((pos>0)||(pos>rightcnt+leftcnt))return false;
fence = head;
for(int i=0;i<pos;i++)fence = fence->next;
return true;
}
template<class Elem>
void LList<Elem>::print()const{//打印链表内所有数据及栅栏的当前位置
Link<Elem>* temp= head;
cout<<"<";
while(temp!=fence){
cout<<temp->next->element<<" ";
temp= temp->next;
}
cout<<"|";
while(temp->next !=NULL){
cout<<temp->next->element<<" ";
temp=temp->next;
}
cout<<">\n";
}
template<class Elem>
Link<Elem> LList<Elem>::quickloc(){//快速定位
Link<Elem> *search=head,*mid=head;
while(true){
if(search==tail){
cout<<mid->element;
return mid;
}
search=search->next;
mid=mid->next;
if(search==tail){
cout<<mid->element;
return mid;
}
search=search->next;
}
}
分享到:
相关推荐
`c++链表.txt`文件可能包含了这些链表实现的详细代码,通过学习和理解这些代码,你可以深入了解链表的工作原理,并能熟练地在C++中实现和操作链表。记得在编写链表代码时要考虑到内存管理,确保正确地分配和释放内存...
本项目旨在介绍如何使用C++实现链表,并通过一个简易的学生管理系统来展示其实际应用。 首先,我们需要理解链表的基本概念。链表由一系列节点组成,每个节点包含两部分:数据域(存储实际信息)和指针域(指向下一...
总的来说,C++中链表实现一元多项式的加法是一种巧妙而实用的方法,它结合了数据结构和算法的知识,展示了计算机科学的魅力。通过熟练掌握这样的编程技巧,不仅可以提高编程能力,还能为解决更复杂的问题打下坚实的...
C++ 是一种支持多种编程范式的语言,包括面向对象编程,因此在C++中实现链表有多种方式。本篇文章将深入探讨如何在C++中实现链表,以及涉及的相关知识点。 首先,链表与数组不同,它不连续存储数据,而是通过节点...
本教程将介绍如何使用类的方式来实现一个简单的C++链表,包括链表的创建、插入、删除、修改和查找操作。下面我们将详细探讨这些知识点。 首先,链表的核心是链表节点,通常我们定义一个结构体或类来表示节点,它...
### C++链表的具体实现详解 #### 一、引言 在计算机科学中,链表是一种常见的数据结构,用于存储一系列元素。与数组不同的是,链表中的元素并不一定存储在连续的内存位置上,而是通过节点之间的链接来组织。每个...
本项目“大数阶乘 Visual C++ 链表实现”专注于解决大数阶乘的计算问题,利用链表数据结构来优化存储和运算效率。下面将详细介绍这个项目中的关键知识点。 一、大数阶乘 大数阶乘是计算一个大整数(通常超过普通...
c++链表实现
本文将深入探讨如何使用C++通过链表数据结构实现多项式加法。链表是一种非连续、非顺序的存储结构,每个节点包含数据元素以及指向下一个节点的指针。在这种情况下,我们将创建一个链表节点来表示多项式的项,其中...
在C++编程中,链表是一种非常重要的数据结构,它能有效地处理动态数据集合。本话题将探讨如何利用链表类来实现多项式的加法和乘法运算。这些操作在数学计算、数值分析以及计算机图形学等领域有广泛的应用。 首先,...
用c++实现链表的建立、插入和删除操作。希望能对刚学数据结构的同学有点帮助。
用随机数生成密钥,通过循环单链表存储序号及密钥,递归输出出列顺序
总结一下,C++中的链表实现涉及创建节点、插入、删除和遍历等操作。而链表的合并则需要对两个有序链表进行比较并构造新的有序链表。在实际编程中,理解和掌握这些基本操作对于解决更复杂的问题至关重要。在`MyChain`...
在这个主题中,我们主要讨论的是链表的应用,以及一个原创的C++链表类实现,包括了对链表的各种操作,如插入、删除、查找、长度计算、显示、比较、翻转、连接、迭代、拷贝和赋值等。 1. **链表的插入**:在链表中...
根据给定文件的信息,我们可以总结出以下关于C++中链表队列实现的相关知识点: ### 一、链表队列的基本概念 链表队列是一种使用链表结构来实现的队列数据结构。队列是一种先进先出(First In First Out, FIFO)的...
### C++链表实现电话簿知识点解析 #### 一、链表基础知识介绍 在深入了解本程序之前,我们先简要回顾一下链表的基本概念。链表是一种常见的数据结构,它通过一组节点来存储数据,每个节点包含实际的数据部分以及一...
C++链表通讯录系统,适合新手学习,可以实现添加,修改,删除,查询,文件保存文件打开功能,拿来学习还不错
c++实现链表完整代码,可直接使用,经测试可在c++环境下正常编译运行。
在C++中实现顺序链表,我们需要理解基本的C++语法,包括类、构造函数、析构函数、指针操作以及动态内存分配。 首先,创建一个表示链表节点的结构体或类是必要的。这个类通常包含两个成员:一个用于存储数据,另一个...
总的来说,用链表实现多项式运算是一种灵活且高效的方法,它可以方便地处理任意大小的多项式,并支持各种算术操作。链表的动态特性使得这种实现方式具有很高的可扩展性,可以适应不同的问题需求。