模板类

//LinkList.h 单链表
#ifndef LINK_LIST_HXX
#define LINK_LIST_HXX
#include <iostream>
using namespace std;

template<class T>
struct Node
{
  T data;
  Node * next;
};

template<class T>
class LinkList
{
  public:
    LinkList(); //无参构造函数,建立只有头结点的空链表
    LinkList(T a[],int n); //有参构造函数,建立有n个元素的单链表
    ~LinkList(); //析构函数
    int Length(); //求单链表长度
    T Get(int i); //按位查找,在单链表中查找第i个结点的元素值
    int Locate(T x); //按值查找,在单链表中查找值为x的元素序号
    void Insert(int i,T x); //插入操作,在第i个位置插入元素值为x的结点
    T Delete(int i); //删除操作,在单链表中删除第i个结点
    void PrintList(); //遍历操作,按顺序依次输出各元素
  private:
    Node<T> * first; //单链表的头指针
};

template<class T>
LinkList<T>::LinkList()
{
  first=new Node<T>; //生成头结点
  first->next=NULL; //头结点指针置空
}

/*
template<class T>
LinkList<T>::LinkList(T a[],int n) //头插法建立单链表LinkList
{

  first=new Node<T>;
  first->next=NULL; //初始化一个空链表
  for(int i=0;i<n;i++)
  {
    Node<T> *s=new Node<T>;
    s->data=a[i]; //为每个元素建立一个结点
    s->next=first->next;
    first->next=s; //将结点s插入到头结点之后
  }
}
*/

template<class T>
LinkList<T>::LinkList(T a[],int n) //尾插法建立单链表LinkList
{
  first=new Node<T>;
  Node<T> *r=new Node<T>;
  r=first;
  for(int i=0;i<n;i++)
  {
    Node<T> *s=new Node<T>;
    s->data=a[i]; //为每个元素建立一个结点
    r->next=s; //将结点s插入到终结点之后
    r=s;
  }
  r->next=NULL; //单链表建立完毕,将终结点的指针置空

}

template<class T>
LinkList<T>::~LinkList()
{
  while(first!=NULL) //释放单链表的每一个结点的存储空间
  {
    Node<T> *q=new Node<T>;
    q=first; //暂存被释放的结点
    first=first->next;//first指向被释放结点的下一个结点
    delete q;
  }
}

template<class T>
int LinkList<T>::Length()
{
  Node<T> *p=first->next;
  int count=0; //工作指针p和累加器count初始化
  while(p!=NULL)
  {
    p=p->next;
    count++;
  }
  return count; //注意count的初始化和返回值的关系
}

template<class T>
T LinkList<T>::Get(int i)
{
  Node<T> *p=first->next;
  int count=1;
  while(p!=NULL&&count<i)
  {
    p=p->next;
    count++;
  }
  if(p==NULL) throw "位置错误";
  else return p->data;
}

template<class T>
int LinkList<T>::Locate(T x)
{
  Node<T> *p=first->next;
  int count=1;
  while(p!=NULL)
  {
    if(p->data==x) return count; //查找成功,结束返回位号
    p=p->next;
    count++;
  }
  return 0; //返回0表明查找失败
}

template<class T>
void LinkList<T>::Insert(int i,T x)
{
  Node<T> *p=first->next; //工作指针指向头结点
  int count=1;
  while(p!=NULL&&count<i-1) //查找第i-1个结点
  {
    p=p->next; //工作指针后移
    count++;
  }
  if(p==NULL) throw "位置"; //没有找到第i-1个结点
  else{
    Node<T> *s=new Node<T>;
    s->data=x;
    s->next=p->next; //将结点s插到结点p之后
    p->next=s;
  }
}
template<class T>
T LinkList<T>::Delete(int i)
{
  Node<T> *p=new Node<T>;
  p=first->next;
  int count=1;

  while(p!=NULL&&count<i-1)
  {
    p=p->next;
    count++;
  }
  if(p==NULL||p->next==NULL) throw "位置"; //结点p不存在 或者 p指向的下一个结点不存在
  else{
    Node<T> *q=new Node<T>;
    q=p->next;
    T x=p->data;
    p->next=q->next; //摘链

    delete q;
    return x;
  }
}
template<class T>
void LinkList<T>::PrintList()
{
  Node<T> *p=first->next;
  while(p!=NULL)
  {
    cout<<p->data<<endl;
    p=p->next;
  }
}
#endif

测试

//LinkListDemo.cpp

#include <iostream>

#include "LinkList.h"
using namespace std;

int main()
{
  int a[10]={1,2,3,4,5,6,7,8,9,10};

  LinkList<int> linkList(a,10);
  cout<<"原始单链表数据"<<endl;
  linkList.PrintList();
  cout<<"数据总量"<<linkList.Length()<<endl;

  linkList.Delete(5);
  cout<<"删除后数据"<<endl;
  linkList.PrintList();
  cout<<"数据总量"<<linkList.Length()<<endl;

  linkList.Insert(5,108);
  cout<<"插入后数据"<<endl;
  linkList.PrintList();
  cout<<"数据总量"<<linkList.Length()<<endl;

  cout<<"查询数据"<<linkList.Get(10)<<endl;

  cout<<"查询位置"<<linkList.Locate(108);

  return 0;

}

C++ 数据结构学习二(单链表)的更多相关文章

  1. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

  2. PHP数据结构之实现单链表

    学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...

  3. js数据结构与算法--单链表的实现与应用思考

    链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...

  4. 自己动手实现java数据结构(二) 链表

    1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是, ...

  5. c++学习笔记—单链表基本操作的实现

    用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include  ...

  6. 链表学习二:链表反转与查找倒数第K个

    //单链表反转 ListNode* RevertList(ListNode* m_pHead){ ListNode* pCurrent = m_pHead; ListNode* pPrev=NULL; ...

  7. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  8. c++学习之单链表以及常用的操作

    新学数据结构,上我写的代码. #include <iostream> #include <cstdlib> using namespace std; typedef int E ...

  9. C语言学习016:单链表

    #include <stdio.h> //定义一个链表,链表是一种递归结构,在定义的时候必须要给结构起一个名字 typedef struct folder{ int level; char ...

随机推荐

  1. opengl笔记——旋转,一段代码的理解

    重看:opengl笔记——OpenGL好资料备忘 在找到这段代码,对理解opengl旋转很有帮助 ... glPushMatrix(); // initialze ModelView matrix g ...

  2. chrome插件 postman 可以调用restful服务

    chrome插件 postman 可以调用restful服务

  3. SecureCRT 绝佳配色方案

    终端有一个好的配色,不仅能保护自己的眼睛,也能给人一个好心情,本配色方案适合任意一种SSH客户端软件. 设置背景颜色 Options => Sessions options => Term ...

  4. C#核编之字符串类型介绍与操作

    一.关于字符串操作的方法 System.String类提供了很多工具方法,包括返回字符数据长度,查找当前字符串中的子字符串和转换大小写等方法. 在String类中常用的比较字符串的方法主要有Compa ...

  5. Ext 随笔

    /-------------------------//清空panel等后面空白属性//------------------------- baseCls:"x-plain" // ...

  6. jQuery :lt()选择器

    定义和用法 :lt() 选择器选取 index 值小于指定数字的元素.(不包含指定值) index 值从 0 开始.(从0开始计数) 最常见的用法:与其他选择器一起使用,选取指定组合中特定序号之前的元 ...

  7. Spring配置多数据源

    如何在应用启动之后灵活切换数据源的关键点: 将SessionFactory接口中的dataSource配置为AbstractRoutingDataSource的instance,sessionFact ...

  8. [Linked List]Remove Duplicates from Sorted List

    Total Accepted: 90247 Total Submissions: 254602 Difficulty: Easy Given a sorted linked list, delete ...

  9. 【11.2noip冲刺赛】 循环整数 (分段打表)

    [问题描述]moreD在学习完循环小数之后发现循环是个很美好的性质.自己只需要记住短短的循环节以及循环次数(次数大于1,且是整数)就可以记住整个数字了.因为背诵数字变得方便了,moreD决定背诵[L, ...

  10. 有了bootstrap,为什么还要做amaze ui

    1.Bootstrap介绍Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加 ...