`
CrazyMizzz
  • 浏览: 24236 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

c++链表实现2

阅读更多
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;
	}
	
}
0
1
分享到:
评论

相关推荐

    c++链表编程实现代码

    `c++链表.txt`文件可能包含了这些链表实现的详细代码,通过学习和理解这些代码,你可以深入了解链表的工作原理,并能熟练地在C++中实现和操作链表。记得在编写链表代码时要考虑到内存管理,确保正确地分配和释放内存...

    c++链表实现以及简易学生管理系统例子

    本项目旨在介绍如何使用C++实现链表,并通过一个简易的学生管理系统来展示其实际应用。 首先,我们需要理解链表的基本概念。链表由一系列节点组成,每个节点包含两部分:数据域(存储实际信息)和指针域(指向下一...

    C++ 链表实现两个一元多项式相加

    总的来说,C++中链表实现一元多项式的加法是一种巧妙而实用的方法,它结合了数据结构和算法的知识,展示了计算机科学的魅力。通过熟练掌握这样的编程技巧,不仅可以提高编程能力,还能为解决更复杂的问题打下坚实的...

    C++ 链表的实现

    C++ 是一种支持多种编程范式的语言,包括面向对象编程,因此在C++中实现链表有多种方式。本篇文章将深入探讨如何在C++中实现链表,以及涉及的相关知识点。 首先,链表与数组不同,它不连续存储数据,而是通过节点...

    用类的方式实现C++链表功能

    本教程将介绍如何使用类的方式来实现一个简单的C++链表,包括链表的创建、插入、删除、修改和查找操作。下面我们将详细探讨这些知识点。 首先,链表的核心是链表节点,通常我们定义一个结构体或类来表示节点,它...

    C++链表的具体实现,很详细

    ### C++链表的具体实现详解 #### 一、引言 在计算机科学中,链表是一种常见的数据结构,用于存储一系列元素。与数组不同的是,链表中的元素并不一定存储在连续的内存位置上,而是通过节点之间的链接来组织。每个...

    大数阶乘 Visual C++ 链表实现

    本项目“大数阶乘 Visual C++ 链表实现”专注于解决大数阶乘的计算问题,利用链表数据结构来优化存储和运算效率。下面将详细介绍这个项目中的关键知识点。 一、大数阶乘 大数阶乘是计算一个大整数(通常超过普通...

    c++链表实现

    c++链表实现

    多项式加法的C++链表实现

    本文将深入探讨如何使用C++通过链表数据结构实现多项式加法。链表是一种非连续、非顺序的存储结构,每个节点包含数据元素以及指向下一个节点的指针。在这种情况下,我们将创建一个链表节点来表示多项式的项,其中...

    C++链表基于类实现多项式的加法和乘法

    在C++编程中,链表是一种非常重要的数据结构,它能有效地处理动态数据集合。本话题将探讨如何利用链表类来实现多项式的加法和乘法运算。这些操作在数学计算、数值分析以及计算机图形学等领域有广泛的应用。 首先,...

    c++链表的建立、插入和删除

    用c++实现链表的建立、插入和删除操作。希望能对刚学数据结构的同学有点帮助。

    C++ 链表实现约瑟夫环

    用随机数生成密钥,通过循环单链表存储序号及密钥,递归输出出列顺序

    c++链表的实现及链表的合并

    总结一下,C++中的链表实现涉及创建节点、插入、删除和遍历等操作。而链表的合并则需要对两个有序链表进行比较并构造新的有序链表。在实际编程中,理解和掌握这些基本操作对于解决更复杂的问题至关重要。在`MyChain`...

    c++ 链表应用 链表类源代码 原创

    在这个主题中,我们主要讨论的是链表的应用,以及一个原创的C++链表类实现,包括了对链表的各种操作,如插入、删除、查找、长度计算、显示、比较、翻转、连接、迭代、拷贝和赋值等。 1. **链表的插入**:在链表中...

    c++链表队列的实现

    根据给定文件的信息,我们可以总结出以下关于C++中链表队列实现的相关知识点: ### 一、链表队列的基本概念 链表队列是一种使用链表结构来实现的队列数据结构。队列是一种先进先出(First In First Out, FIFO)的...

    c++ 链表实现电话薄

    ### C++链表实现电话簿知识点解析 #### 一、链表基础知识介绍 在深入了解本程序之前,我们先简要回顾一下链表的基本概念。链表是一种常见的数据结构,它通过一组节点来存储数据,每个节点包含实际的数据部分以及一...

    C++链表通讯录系统

    C++链表通讯录系统,适合新手学习,可以实现添加,修改,删除,查询,文件保存文件打开功能,拿来学习还不错

    c++实现链表完整代码

    c++实现链表完整代码,可直接使用,经测试可在c++环境下正常编译运行。

    顺序链表C++实现

    在C++中实现顺序链表,我们需要理解基本的C++语法,包括类、构造函数、析构函数、指针操作以及动态内存分配。 首先,创建一个表示链表节点的结构体或类是必要的。这个类通常包含两个成员:一个用于存储数据,另一个...

    用链表实现多项式_C++_

    总的来说,用链表实现多项式运算是一种灵活且高效的方法,它可以方便地处理任意大小的多项式,并支持各种算术操作。链表的动态特性使得这种实现方式具有很高的可扩展性,可以适应不同的问题需求。

Global site tag (gtag.js) - Google Analytics