C++实现单链表的构造

单链表的构造,包括最常用函数,setData(),Insert(),Remove(),getData(),Search()。

代码如下:

#include <iostream>
#include <stdlib.h>

using namespace std;

template<class T>
struct LinkNode{
   T data;
   LinkNode<T> *link;
   LinkNode(LinkNode<T> *ptr=NULL){link=ptr;}
   LinkNode(const T& item, LinkNode<T> *ptr=NULL){data=item; link=ptr;}
};

template<class T>
class List{
public:
   List(){first=new LinkNode<T>;}
   List(const T& x){first=new LinkNode<T>(x);}
   List(List<T> &L);
   ~List(){makeEmpty();}
   void makeEmpty();
   int Length()const;
   LinkNode<T> *getHead()const{return first;}
   LinkNode<T> *Search(T x);
   LinkNode<T> *Locate(int i);
   bool getData(int i, T &x)const;
   void setData(int i,T &x);
   bool Insert(int i,T &x);
   bool Remove(int i, T &x);
   bool IsEmpty()const{return (first->link==NULL)?true:false;}
   bool IsFull()const{ return false;}
   void Sort();
   void inputFront(T endTag);
   void inputRear(T endTag);
   void output();
   List<T>& operator=(List<T> &L);
private:
   LinkNode<T> *first;
};

template<class T>
void List<T>::makeEmpty(){
   //if(first->link==NULL)return;
   LinkNode<T> *p=first->link;
   while(p!=NULL){
      first->link=p->link;
      delete p;
      p=first->link;
   }
}

template<class T>
LinkNode<T> *List<T>::Search(T x){
   LinkNode<T> *p=first->link;
   while(p!=NULL){
      if(p->data==x)break;
      p=p->link;
   }
   return p;//无论是否找到都返回p,若找到则返回p,没有则返回空指针
}

template<class T>
LinkNode<T> *List<T>::Locate(int i){
   //这个定位函数的作用还是非常大的,方便后来的函数根据i定位到相应位置的节点
   if(i<0)return NULL;
   int sum=0;
   LinkNode<T> *p=first;
   while(p!=NULL&&sum<i){
      sum++;
      p=p->link;
   }
   return p;//无论是否为空指针,返回的都是到达i位置的指针,如果没有到达就是已经到结尾了
}

template<class T>
bool List<T>::getData(int i, T& x)const{
   if(i<0)return false;
   LinkNode<T> *p=Locate(i);
   if(p==NULL)return false;
   else{
    x=p->data;
    return true;
   }
}

template<class T>
void List<T>::setData(int i, T& x){
   if(i<0)return;
   LinkNode<T> *p=Locate(i);
   if(p==NULL)return;
   else{
      p->data=x;
   }
}

template<class T>
bool List<T>::Insert(int i, T &x){
      //LinkNode<T> *pre=Locate(i-1);
      //这里是指插入到第i个元素之后的情况
      LinkNode<T> *cur=Locate(i);
      if(cur==NULL)return false;
      LinkNode<T> *p=new LinkNode<T>(x);
      if(p==NULL){cerr<<"存储分配错误!"<<endl;exit(1);}
      //if(pre==NULL||cur==NULL||p==NULL)return false;
      else{
         p->link=cur->link;
         cur->link=p;
         return true;
      }
}

template<class T>
bool List<T>::Remove(int i, T& x){
   //删除第i个位置的元素
   LinkNode<T> *pre=Locate(i-1);
   if(pre==NULL)return false;
   LinkNode<T> *current=pre->link;
   if(current==NULL)return false;
   x=current->data;
   pre->link=current->link;
   delete current;
   return true;
}

template<class T>
void List<T>::output(){
   LinkNode<T> *current=first->link;
   while(current!=NULL){
      cout<<current->data<<" ";
      current=current->link;
   }
}

template<class T>
List<T>& List<T>::operator=(List<T>& L){
   //这是赋值方法
   LinkNode<T> *srcptr=L.getHead(), *p=srcptr->link;
   LinkNode<T> *desptr=first=new LinkNode<T>;
   T value;
   while(p!=NULL){
      value=p->data;
      desptr->link=new LinkNode<T>(value);
      desptr=desptr->link;
      p=p->link;
   }
   return *this;
   //用上面这种方法可以更好地实现赋值
//   LinkNode<T> *pre=L.getHead();
//   if(pre==NULL){
//      first=NULL;
//      return *this;
//   }
//   LinkNode<T> *p=first=new LinkNode<T>;
//   first->link=p;
//   int sum=L.Length();
//   T &x;
//   int i=1;
//   while(i<=sum){
//      L.getData(i++,x);
//      p=new LinkNode<T>(x);
//      p=p->link;
//   }
//   return *this;

}

template<class T>
int List<T>::Length()const{
   int sum=0;
   LinkNode<T> *p=first->link;
   while(p!=NULL){
      sum++;
      first->link=p->link;
      delete p;
      p=first->link;
   }
   return sum;
}

//前插法建立单链表
template<class T>
void List<T>::inputFront(T endTag){
   LinkNode<T> *newNode;
   T value;
   makeEmpty();
   cin>>value;
   while(value!=endTag){
      newNode=new LinkNode<T>(value);
      if(newNode==NULL){cerr<<"内存分配错误!"<<endl; exit(1);}
      newNode->link=first->link;
      first->link=newNode;
      cin>>value;
   }
}

//后插法建立单链表
template<class T>
void List<T>::inputRear(T endTag){
   LinkNode<T> *newNode=new LinkNode<T>, *last;
   T value;
   last=first=new LinkNode<T>;
   cin>>value;
   while(value!=endTag){
      newNode=new LinkNode<T>(value);
      if(newNode==NULL){cerr<<""<<endl;exit(1);}
      last->link=newNode;
      last=newNode;
      cin>>value;
   }
}

//复制构造函数
template<class T>
List<T>::List(List<T> &L){
   //复制构造函数
   T value;
   LinkNode<T> *srcptr=L.gethead(), p=srcptr->link;
   LinkNode<T> *desptr=first->link=new LinkNode<T>;
   while(p!=NULL){
      value=p->data;
      desptr=new LinkNode<T>(value);
      desptr=desptr->link;
      p=p->link;
   }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++中单链表的建立与基本操作

    准备数据 准备在链表操作中需要用到的变量及数据结构 示例代码如下: 复制代码 代码如下: struct Data   //数据结点类型 { string key;  //关键字  string name; int age;};struct CLType  //定义链表结构 { Data nodeData; Data *nextNode;}; 定义了链表数据元素的类型Data以及链表的数据结构CLType.结点的具体数据保存在一个结构Data中,而指针nextNode用来指向下一个结点. 我们可以

  • 利用C++简单实现顺序表和单链表的示例代码

    本文主要给大家介绍了关于C++实现顺序表和单链表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 一.顺序表示例代码: #include <assert.h> #include <iostream> using namespace std; typedef int Datatype; class SeqList { public: SeqList() :_array(NULL) ,_size(0) ,_capacity(0) { } SeqList(const

  • C++ 单链表的基本操作(详解)

    链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素 + 指针,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据.如下图: 2.链表的基本操作 SingleList.cpp: #include "stdafx.h" #include "SingleList.h&

  • 浅析C++中单链表的增、删、改、减

    首先是是一个简单的例子,单链表的建立和输出.程序1.1 复制代码 代码如下: #include<iostream>#include<string>using namespace std;struct Student{ string name; string score; Student *next;//定义了指向Candidate类型变量的指针};int main(){ int n;// cout<<"请输入学生的总数:"; cin>>n

  • C++实现单链表按k值重新排序的方法

    本文实例讲述了C++实现单链表按k值重新排序的方法.分享给大家供大家参考,具体如下: 题目要求: 给定一链表头节点,节点值类型是整型. 现给一整数k,根据k将链表排序为小于k,等于k,大于k的一个链表. 对某部分内的节点顺序不做要求. 算法思路分析及代码(C) 思路:将链表分为小于k.等于k.大于k的三个链表,然后再合并. 链表结点定义: typedef struct Node { int data; struct Node* next; }node, *pNode; 算法代码: pNode s

  • C++使用模板实现单链表

    本文实例为大家分享了用模板实现单链表,供大家参考,具体内容如下 话不多说 直接上代码 #include <iostream> using namespace std; template<typename E> class CLink; template<typename T> class Node { friend class CLink<T>; public: /* 构造函数和析构函数一般不加类型参数 本类类中除了构造函数和析构函数以外 其它的地方都要加上

  • C++使用模板实现单链表(类外实现)

    本文实例为大家分享了C++使用模板实现单链表的具体代码,供大家参考,具体内容如下 这一篇可以和上一篇点击打开链接 模板实现单链表进行对比 看类外实现和类内实现的区别 代码: #include <iostream> using namespace std; template<typename T> class CLink { public: class Node; CLink();//无参的构造函数 void InsertHead(T data);//头插 void InsertTa

  • C++ 实现静态单链表的实例

    C++ 实现静态单链表的实例 利用数组实现的静态单链表,与严蔚敏书实现略有不同,不另设回收空间.有任何BUG或错误,希望各位朋友多多反馈~~感激不尽 /* Author : Moyiii * Mail: lc09@vip.qq.com * 静态链表实现,仅作学习之用,当然如果 * 你想拿去用,随你好啦. */ #include <iostream> using namespace std; #define MAX_LIST_SIZE 100 class Node { public: int d

  • C++实现单链表删除倒数第k个节点的方法

    本文实例讲述了C++实现单链表删除倒数第k个节点的方法.分享给大家供大家参考,具体如下: 题目: 删除单链表中倒数第k个节点 解题思路及算法代码: 标尺法,定义两个指针指向链表头结点,先让一个走k步,然后两个指针同时开始走,当先走的指针走到末尾时,后走的指针指向的结点就是需要删除的结点. 单链表结构定义: typedef struct Node { int data; struct Node* next; }node, *pLinkedList; 删除倒数第K结点操作代码: //head表示头结

  • C++实现单链表的构造

    单链表的构造,包括最常用函数,setData(),Insert(),Remove(),getData(),Search(). 代码如下: #include <iostream> #include <stdlib.h> using namespace std; template<class T> struct LinkNode{ T data; LinkNode<T> *link; LinkNode(LinkNode<T> *ptr=NULL){l

  • C语言创建和操作单链表数据结构的实例教程

    1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一.我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费. 我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要.链表就是我们需要的动态数组.它是在程序的执行过程中根据需要有数据存储就向系统要求

  • PHP实现单链表翻转操作示例

    本文实例讲述了PHP实现单链表翻转操作.分享给大家供大家参考,具体如下: 当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表. 这里给出了一个单链表的定义及翻转操作方法: <?php /** * @file reverseLink.php * @author showersun * @date 2016/03/01 10:33:25 **/ class Node{ private $value; private $next; public function __construct($

  • Java单链表的简单操作实现教程

    前言 用Java实现单链表的简单操作,阅读本文和上一篇文章体会Java中类与C++中结构体指针的区别 提示:以下是本篇文章正文内容,下面案例可供参考 一.基本实现思路 构造结点类 构造链表类 具体测试实现 二.代码实现 1.定义结点类 package list.test01; /* *定义结点类 */ public class Node { private int data; public Node next; public Node(int data) { this.data = data;

  • 详解go语言单链表及其常用方法的实现

    目的 在刷算法题中经常遇到关于链表的操作,在使用go语言去操作链表时不熟悉其实现原理,目的是为了重温链表这一基础且关键的数据结构. 1.链表的特点和初始化 1.1.链表的特点 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的) 1.2.结点 结点(node) 数据域 => 存储元素信息 指针域 => 存储结点的直接后继,也称作指针或链 首元结点 是指链表中存储的第一个数据元素的结点 头结点 是在首元结点之前附设的一个结点,其指针域指向首元结点(非必须) 头指

  • Java单链表反转图文教程

    前言 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享

  • Java使用单链表实现约瑟夫环

    本文实例为大家分享了Java使用单链表实现约瑟夫环的具体代码,供大家参考,具体内容如下 构建一个单向的环形链表思路 1.先创建第一个节点, 让first指向该节点, 并形成环形 2.后面当我们每创建一个新的节点, 就把该节点加入到已有的环形链表中即可. 遍历环形链表思路 1.先让一个辅助指针(变量)curBoy, 指向first节点 2.然后通过一个while循环遍历该环形链表即可 curBoy.next == first 结束 生成小孩出圈顺序的思路 1.根据用户的输入, 生成一个小孩出圈的顺

  • C++数据结构之单链表的实现

    目录 一.单链表的定义 二.单链表的基本操作的实现 1.初始化 2.取值 3.查找 4.插入 5.删除 三.完整代码 四.测试一下代码 一.单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. 单链表中结点类型的描述如下: typedef struct LNode{ // 定义单链表节点类型 ElemType data; // 数据域 struct

  • C++详解如何实现单链表

    目录 单链表 单链表的基本操作 1.初始化 2.取值 3.查找 4.插入 5.删除 示例代码 开发环境 运行结果 单链表 链表内存空间不一定连续,其扩展性较好.多余的不多说了.该文主要记录单链表的实现,该单链表含有一个非空的头节点.链表的操作实际上是对其指针域与数据域的操作. 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. 单链表中结点类型的描述如下: t

随机推荐