模板类

//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. Android_通过ContentObserver监听短信数据变化

    1.简单介绍 在小米等一些机型,无法接收系统发出的短信广播. 仅仅能通过观察者ContentObserver,去监听短信数据的变化 2.SMS数据介绍 content://sms/inbox     ...

  2. swift http请求返回json数据和分析

    1 AppDelegate.swift // // AppDelegate.swift // QQDemo // // Created by 赵超 on 14-6-21. // Copyright ( ...

  3. 好用的侧边栏菜单/面板jQuery插件

    我想大家都用过一些APP应用,它们的菜单展示是以侧边栏滑动方式展现,感觉很新鲜,而现在网页设计也是如此,不少网站也效仿这样的方式来设计.使用侧边栏的好处就是可以节约空间,对于一些内容多或者喜欢简约的网 ...

  4. 【迪杰斯特拉双关键字最短路】【HDU3790】【最短路径问题】

    题目大意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 只需要再更新的时候判断一下就好 voi ...

  5. java命令行运行main时jar及其配置

    run.bat中的内容如: set mypath=%cd%/../set classpath=%mypath%\conf;%mypath%\lib\*start /b java -Xms64m -Xm ...

  6. maven01 hello maven

    安装省略,注意jdk的版本1.7: 目录:

  7. Nullable<T> 与 T?

    Nullable<T> : 基础类型为值类型的对象,值类型的对象和引用类型的对象一样也可以分配 null.可空类型. Nullable<int> 与 int?是同样的意思. ; ...

  8. windows 安装paramiko模块

    首先需要安装pycrypto这个模块,这个下源码编译安装的不能用报错warning: GMP or MPIR library not found; Not building这个用编译好的模块安装已编译 ...

  9. C# 启动EXE文件及带启动参数EXE

    (一).先制作一个带启动参数的EXE文件. 步骤: 1.定义全局私有变量:private string[] s = new string[1];  //这里为了简单起见,只做一个参数 2.  在窗体的 ...

  10. c# 读取IntPtr 中的数据

    c++的写法是这样的:LRESULT CPictureQueryDlg::OnQueryPicNty(WPARAM wp, LPARAM lp){EnableWindow(TRUE); BYTE *p ...