模板类

//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. jQuery提交form表单

    <form id="search_form" name="search_form" method="post"> <inp ...

  2. Android_Layout_xml布局

    本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/11840079 1.构建xml布局文件 使用android提供的xml ...

  3. 优先队列(priorityqueue)

    队列是先进先出的线性表,顾名思义,优先队列则是元素有优先级的队列,出列的顺序由元素的优先级决定.从优先队列中删除元素是根据优先权的高低次序,而不是元素进入队列的次序.优先队列的典型应用是机器调度等. ...

  4. ASP.NET MVC 3 配置EF自动生成模型

    Tools(工具) =>  扩展工具 => Nuget Tools(工具) => Nuget=>程序包管理器控制台 Nuget 程序包管理器 => Install-Pac ...

  5. HTML——表格与表单

    1.表格 <table></table> background:背景图片. 属性 值 描述 align left center right 不赞成使用.请使用样式代替. 规定表 ...

  6. 读书笔记-Coding faster(英文版)

    读书笔记-Coding faster(英文版) Getting More Productive with Microsoft visual Studio Author: Zain Naboulsi S ...

  7. 关于C语言指针几个容易混淆的概念

    前言: 大多数学习过C/C++或者正在学习的同学在对指针概念把握时,总是感觉不太明了,小弟我也不例外啊,于是翻开资料复习整理一下,并把自己的学习心得拿出来供大家分享,讨论. 基本概念掠过,主要来探讨一 ...

  8. Inno Setup教程

    一.简介 Inno Setup是一款免费的安装制作软件,小巧.简便.精美是其最大特点,支持pascal脚本,能快速制作出标准Windows2000风格的安装界面,足以完成一般安装任务.该软件用Delp ...

  9. html5 canvas 画hello ketty

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  10. 关于const限定符

    1.  指向非常量数据的非常量指针 具有最高的数据访问极限 .不包含const关键字. 2. 指向常量数据的非常量指针 指针可以被改写,使其指向相应类型的任何数据项, 但是它所指向的数据项的值是不能被 ...