`
宫庆义
  • 浏览: 17313 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据结构学习----单向链表类

阅读更多
图1  链表示意图





图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 


  • 描述: 链表
  • 大小: 6.5 KB
  • 描述: 链表的插入
  • 大小: 9.3 KB
  • 描述: 链表的删除
  • 大小: 7.4 KB
0
1
分享到:
评论

相关推荐

    单向链表类模板_单向链表类模板_fastchq_

    标题"单向链表类模板_单向链表类模板_fastchq_"表明这是一个关于使用模板类实现单向链表的代码,可能由用户fastchq编写或维护。 单向链表类模板的基本结构通常包括以下几个部分: 1. **节点定义**:首先,我们需要...

    数据结构 -- 链表的基本操作

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键...了解并熟练掌握链表的基本操作对于学习更高级的数据结构和算法至关重要。通过实践LinkListEx中的示例代码,你可以更好地理解这些概念并提升编程技能。

    数据结构-链表.pdf

    数据结构-链表 数据结构是计算机科学和信息技术领域中的一个基础概念,指的是...链表是一种非常重要的数据结构,它可以分为单向链表、循环链表和双向循环链表等。链表的优点是插入和删除操作方便,缺点是存取速度慢。

    比特数据结构课件-Lesson3-顺序表-链表.pdf

    - **链表分类**:在实际应用中,最常见的链表类型是无头单向非循环链表(常作为其他数据结构的子结构)和带头双向循环链表(用于独立存储数据)。 - **链表的实现**:链表节点通常包含数据和指向下一个节点的指针...

    数据结构单向链表

    单向链表是一种基本的数据结构,它在计算机科学和编程中有着广泛的应用,尤其是在处理动态数据集合时。本文将深入探讨C++实现的单向链表,并将其与数据结构和链表的概念相结合。 首先,我们要理解什么是数据结构。...

    单向链表类模板(全)C++

    本压缩包文件提供了实现单向链表类模板的完整代码,包括以下几个关键部分: 1. **LinkList.h** - 这是单链表类的头文件,它定义了一个模板类`LinkList`。模板类使得链表可以用来存储各种类型的数据,不仅限于整型或...

    链表类(单向)

    总结一下,单向链表类的实现是数据结构和算法学习的重要组成部分。它提供了基础的增删改查功能,但缺乏类型检查,这在实际应用中可能需要改进。理解和掌握链表的运作原理对于深入理解计算机科学尤其是数据结构至关...

    博文C++数据结构X篇-04-单向链表框架搭建、实现和测试(链表的定义,常用操作的实现等)的配套资源

    单向链表是一种线性数据结构,它的每个元素(称为节点)包含两部分:数据域和指针域。数据域存储实际的数据,而指针域则存储指向下一个节点的引用。由于链表中的元素并不在内存中连续存放,因此可以通过指针进行链接...

    链表----链表构造

    以下是一个简单的单向链表类`LinkList&lt;T&gt;`的实现: ```java public class LinkList&lt;T&gt; { public Node&lt;T&gt; head; // 头节点 // 构造函数 public LinkList() { head = new Node(); // 初始化头节点 } // 清空...

    LinkedBlockingQueue + 单向链表基本结构

    该队列的主要特点是其内部数据结构采用了一个单向链表,并且实现了 BlockingQueue 接口,提供了线程安全的插入、删除和获取元素的操作。 单向链表是一种简单的数据结构,由一系列节点组成,每个节点包含数据以及...

    链表-使用Python实现链表数据结构.zip

    总的来说,理解和掌握链表数据结构对于学习算法和数据结构至关重要,也是成为优秀程序员的基础。通过这个“链表-使用Python实现链表数据结构”的资源,你可以深入了解链表的工作原理,并练习使用Python来创建和操作...

    数据结构:单向链表源码

    单向链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。在计算机科学和编程领域,理解并能够实现单向链表的源码是至关重要的,因为它是构建更复杂数据结构(如双向链表、循环...

    单向链表源代码

    单向链表是一种基本的数据结构,它在计算机科学中被广泛应用,特别是在算法和数据结构的实现中。在Java编程中,单向链表通常通过定义一个节点类来实现,每个节点包含数据和指向下一个节点的引用。下面我们将深入探讨...

    基于python的数据结构-链表Linked list

    在Python中,虽然内置的`list`类型已经提供了很多便利,但理解链表的概念及其工作原理对于深入学习算法和数据结构是至关重要的。 链表与数组不同,数组在内存中是连续存储的,而链表的每个元素(节点)包含数据和...

    链表-使用PHP实现的双向链表数据结构.zip

    双向链表是链表的一种变体,与单向链表不同,它允许从两个方向遍历链表。每个节点除了包含数据和指向下一个节点的指针外,还有一个指向前一个节点的指针。这样的设计提高了数据操作的灵活性,例如在链表中间插入或...

    C#单向链表的实现

    在编程领域,数据结构是构建复杂程序的基础,而链表作为一种基本的数据结构,被广泛应用于各种软件系统中。本文将详细讲解如何在C#中实现单向链表,结合源码解析来帮助你深入理解其内部机制。 首先,我们要知道什么...

    C#单向链表C#单向链表C#单向链表

    单向链表是一种基本的数据结构,它在计算机科学和编程,特别是C#中扮演着重要角色。单向链表与数组不同,不提供随机访问,但允许高效地插入和删除元素,尤其在列表的中间或末尾。接下来,我们将深入探讨C#中单向链表...

    数据结构-使用javascript讲解数据结构之链表.zip

    链表是一种基础且重要的数据结构,它在计算机科学...通过深入学习这个资料包,你可以更好地理解数据结构的基础,为后续的算法学习和复杂问题解决打下坚实基础。在实践中不断练习和应用,将有助于你成为更优秀的开发者。

    java 数据结构 链表

    - 单向链表的节点定义:通常会有一个类表示链表节点,例如`Node`,包含一个数据字段和一个指向下一个节点的引用字段。 - 插入操作:在链表的头部或尾部插入新节点相对简单,只需改变相应节点的引用即可。 - 删除...

    C#实现单向链表C# .net 链表 单向链表

    单向链表是一种常见的数据结构,在计算机科学中被广泛应用于解决各种问题。它由一系列节点组成,每个节点包含一个数据元素以及指向下一个节点的引用。本文将详细介绍如何在C#中实现一个基本的单向链表,并探讨其核心...

Global site tag (gtag.js) - Google Analytics