- 浏览: 17313 次
- 性别:
- 来自: 北京
最新评论
图1 链表示意图
图2 链表元素的添加
图3 链表元素的删除
图2 链表元素的添加
图3 链表元素的删除
带附加头结点的单链表类. 同时具有栈, 队列, 双端队列的功能 #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #pragma once void Error(string error) { cout<<error<<endl; system("pause"); exit(1); } #pragma region //单链表类 //测试日期 2010-3-3 #ifndef LINKNODE_H #define LINKNODE_H template<class T> class LinkNode { public: T data; //数据域 LinkNode<T> *next; //链指针 LinkNode(LinkNode<T> *p=NULL){next=p;} //仅初始化指针成员的构造函数 LinkNode(T item,LinkNode<T> *p=NULL) //初始化数据与指针成员的构造函数 { data=item;next=p;} }; #endif #ifndef LINKLIST_H #define LINKLIST_H template<class T> class LinkList { private: LinkNode<T> *head; //链表的头指针 LinkNode<T> *current; //当前结点指针 int size; //链表长度 public: LinkList(){current=head=new LinkNode<T>();size=0;}//构造函数 ~LinkList(){ClearList();} //析构函数 void ClearList(); //将链表置为空表 int Size()const{return size;} //返回链表的长度 LinkNode<T>* GetItem(int pos); //取得第pos个元素的地址[pos从0开始] void PushFront(T data); //在链表首部添加元素 void PushBack(T data); //在链表尾部添加元素 T PopFront(); //删除头节点 T PopBack(); //删除尾节点 LinkNode<T>* GetCurrent(); //返回当前结点指针 LinkNode<T>* SetCurrent(int pos); //令current指向第i个结点 LinkNode<T>* Next(); //令current指向当前结点的后一个结点 LinkNode<T>* Previous(); //令current指向当前结点的前一个结点 T GetData(int pos); //取得第pos个表项的值 void SetData(int pos,T data); //修改第pos个表项的值为x void Insert(int pos,T data); //在位置pos处插入x T Delete(int pos); //删除第pos个表项 void Reverse(); //链表反向 bool IsEmpty()const; //判断表是否为空 LinkList<T>& operator=(LinkList<T>& list); //运算符重载 }; #endif #pragma endregion #pragma region template<class T> void LinkList<T>::ClearList() { LinkNode<T>* node; while(head->next!=NULL) { node=head->next; head->next=node->next; delete node; } node=NULL; size=0; } template<class T> LinkNode<T>* LinkList<T>::GetItem(int pos) { if(pos<-1||pos>=size) return NULL; LinkNode<T>* node=head; int k=0; while(k<=pos) { node=node->next; k++; } return node; } template<class T> void LinkList<T>::PushFront(T data) { LinkNode<T> *node=new LinkNode<T>(data); node->next=head->next; head->next=node; size++; } template<class T> void LinkList<T>::PushBack(T data) { LinkNode<T> *node=new LinkNode<T>(data); GetItem(size-1)->next=node; size++; } template<class T> T LinkList<T>::PopFront() { LinkNode<T> *node=head->next; if(node!=NULL) { T data=node->data; head->next=node->next; size--; delete node; node=NULL; return data; } else { Error("弹出数据出错!"); } } template<class T> T LinkList<T>::PopBack() { LinkNode<T> *node1=GetItem(size-2); if(node1!=NULL) { LinkNode<T> *node2=node1->next; T data=node2->data; node1->next=NULL; size--; delete node2; node2=NULL; return data; } else { Error("弹出数据出错!"); } } template<class T> LinkNode<T>* LinkList<T>::GetCurrent() { return current;} template<class T> LinkNode<T>* LinkList<T>::SetCurrent(int pos) { LinkNode<T>* node=GetItem(pos); if(node!=NULL) { current=node; return current; } else Error("当前指针不能为空!"); } template<class T> LinkNode<T>* LinkList<T>::Next() { if(current->next!=NULL) { current=current->next; return current; } else Error("当前指针不能为空!"); } template<class T> LinkNode<T>* LinkList<T>::Previous() { if(current==head) Error("当前指针不能为空!"); LinkNode<T> *node=head; while(node->next!=current) { node=node->next; } current=node; return current; } template<class T> T LinkList<T>::GetData(int pos) { if(pos<0||pos>=size) Error("索引越界!"); LinkNode<T>* node=GetItem(pos); if(node==NULL) Error("取值出错!"); else return node->data; } template<class T> void LinkList<T>::SetData(int pos, T data) { if(pos<0||pos>=size) Error("索引越界!"); LinkNode<T>* node=GetItem(pos); if(node==NULL) Error("赋值出错!"); else node->data=data; } template<class T> void LinkList<T>::Insert(int pos, T data) { if(pos<0||pos>size) Error("索引越界!"); LinkNode<T>* node=GetItem(pos-1); if(node==NULL) Error("添加数据出错!"); LinkNode<T>* newNode=new LinkNode<T>(data); if(newNode==NULL) Error("内存分配错误!"); newNode->next=node->next; node->next=newNode; size++; } template<class T> T LinkList<T>::Delete(int pos) { if(pos<0||pos>=size) Error("索引越界"); LinkNode<T> *node1,*node2; node1=GetItem(pos-1); node2=node1->next; node1->next=node2->next; T data=node2->data; delete node2; node2=NULL; size--; return data; } template<class T> void LinkList<T>::Reverse() { LinkNode<T> *next,*pre,*cur; if(head->next==NULL||head->next->next==NULL) return; pre=head->next; cur=pre->next; next=NULL; while(cur->next!=NULL) { next=cur->next; cur->next=pre; pre=cur; cur=next; } cur->next=pre; head->next=cur; } template<class T> bool LinkList<T>::IsEmpty() const { return (size==0)?true:false; } template<class T> LinkList<T>& LinkList<T>::operator =(LinkList<T> &list) { T data; LinkNode<T> *src=list.GetItem(-1); LinkNode<T> *des=head; while(src->next!=NULL) { data=src->next->data; des->next=new LinkNode<T>(data); des=des->next; src=src->next; size++; } return *this; } #pragma endregion
发表评论
-
数据结构学习----二叉树
2010-03-25 00:25 1070#include "Common.h&quo ... -
数据结构学习----最小堆实现
2010-03-25 00:21 1249#ifndef HEAP #define HEAP t ... -
数据结构学习----树类(孩子--兄弟表示)
2010-03-13 01:52 1611#include "DCirList.h&q ... -
数据结构学习----计算器程序(栈的应用)
2010-03-13 01:46 2779/**************************** ... -
数据结构学习----回溯法解迷宫
2010-03-13 01:43 1324回溯法也称试探法,这种方法将问题的候选解按某种顺序逐一 ... -
数据结构学习----约瑟夫环问题
2010-03-13 01:37 966#include "DCirList.h&quo ... -
数据结构学习----链式栈
2010-03-13 01:35 938#include <stdio.h> ... -
数据结构学习----双向循环链表
2010-03-13 01:33 1994图1 双向循环链表 ...
相关推荐
标题"单向链表类模板_单向链表类模板_fastchq_"表明这是一个关于使用模板类实现单向链表的代码,可能由用户fastchq编写或维护。 单向链表类模板的基本结构通常包括以下几个部分: 1. **节点定义**:首先,我们需要...
链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键...了解并熟练掌握链表的基本操作对于学习更高级的数据结构和算法至关重要。通过实践LinkListEx中的示例代码,你可以更好地理解这些概念并提升编程技能。
数据结构-链表 数据结构是计算机科学和信息技术领域中的一个基础概念,指的是...链表是一种非常重要的数据结构,它可以分为单向链表、循环链表和双向循环链表等。链表的优点是插入和删除操作方便,缺点是存取速度慢。
- **链表分类**:在实际应用中,最常见的链表类型是无头单向非循环链表(常作为其他数据结构的子结构)和带头双向循环链表(用于独立存储数据)。 - **链表的实现**:链表节点通常包含数据和指向下一个节点的指针...
单向链表是一种基本的数据结构,它在计算机科学和编程中有着广泛的应用,尤其是在处理动态数据集合时。本文将深入探讨C++实现的单向链表,并将其与数据结构和链表的概念相结合。 首先,我们要理解什么是数据结构。...
本压缩包文件提供了实现单向链表类模板的完整代码,包括以下几个关键部分: 1. **LinkList.h** - 这是单链表类的头文件,它定义了一个模板类`LinkList`。模板类使得链表可以用来存储各种类型的数据,不仅限于整型或...
总结一下,单向链表类的实现是数据结构和算法学习的重要组成部分。它提供了基础的增删改查功能,但缺乏类型检查,这在实际应用中可能需要改进。理解和掌握链表的运作原理对于深入理解计算机科学尤其是数据结构至关...
单向链表是一种线性数据结构,它的每个元素(称为节点)包含两部分:数据域和指针域。数据域存储实际的数据,而指针域则存储指向下一个节点的引用。由于链表中的元素并不在内存中连续存放,因此可以通过指针进行链接...
以下是一个简单的单向链表类`LinkList<T>`的实现: ```java public class LinkList<T> { public Node<T> head; // 头节点 // 构造函数 public LinkList() { head = new Node(); // 初始化头节点 } // 清空...
该队列的主要特点是其内部数据结构采用了一个单向链表,并且实现了 BlockingQueue 接口,提供了线程安全的插入、删除和获取元素的操作。 单向链表是一种简单的数据结构,由一系列节点组成,每个节点包含数据以及...
总的来说,理解和掌握链表数据结构对于学习算法和数据结构至关重要,也是成为优秀程序员的基础。通过这个“链表-使用Python实现链表数据结构”的资源,你可以深入了解链表的工作原理,并练习使用Python来创建和操作...
单向链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。在计算机科学和编程领域,理解并能够实现单向链表的源码是至关重要的,因为它是构建更复杂数据结构(如双向链表、循环...
单向链表是一种基本的数据结构,它在计算机科学中被广泛应用,特别是在算法和数据结构的实现中。在Java编程中,单向链表通常通过定义一个节点类来实现,每个节点包含数据和指向下一个节点的引用。下面我们将深入探讨...
在Python中,虽然内置的`list`类型已经提供了很多便利,但理解链表的概念及其工作原理对于深入学习算法和数据结构是至关重要的。 链表与数组不同,数组在内存中是连续存储的,而链表的每个元素(节点)包含数据和...
双向链表是链表的一种变体,与单向链表不同,它允许从两个方向遍历链表。每个节点除了包含数据和指向下一个节点的指针外,还有一个指向前一个节点的指针。这样的设计提高了数据操作的灵活性,例如在链表中间插入或...
在编程领域,数据结构是构建复杂程序的基础,而链表作为一种基本的数据结构,被广泛应用于各种软件系统中。本文将详细讲解如何在C#中实现单向链表,结合源码解析来帮助你深入理解其内部机制。 首先,我们要知道什么...
单向链表是一种基本的数据结构,它在计算机科学和编程,特别是C#中扮演着重要角色。单向链表与数组不同,不提供随机访问,但允许高效地插入和删除元素,尤其在列表的中间或末尾。接下来,我们将深入探讨C#中单向链表...
链表是一种基础且重要的数据结构,它在计算机科学...通过深入学习这个资料包,你可以更好地理解数据结构的基础,为后续的算法学习和复杂问题解决打下坚实基础。在实践中不断练习和应用,将有助于你成为更优秀的开发者。
- 单向链表的节点定义:通常会有一个类表示链表节点,例如`Node`,包含一个数据字段和一个指向下一个节点的引用字段。 - 插入操作:在链表的头部或尾部插入新节点相对简单,只需改变相应节点的引用即可。 - 删除...
单向链表是一种常见的数据结构,在计算机科学中被广泛应用于解决各种问题。它由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。本文将详细介绍如何在C#中实现一个基本的单向链表,并探讨其核心...