C++ 数据结构学习二(单链表)
模板类
//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++ 数据结构学习二(单链表)的更多相关文章
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
- PHP数据结构之实现单链表
学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- 自己动手实现java数据结构(二) 链表
1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是, ...
- c++学习笔记—单链表基本操作的实现
用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include ...
- 链表学习二:链表反转与查找倒数第K个
//单链表反转 ListNode* RevertList(ListNode* m_pHead){ ListNode* pCurrent = m_pHead; ListNode* pPrev=NULL; ...
- 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)
单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...
- c++学习之单链表以及常用的操作
新学数据结构,上我写的代码. #include <iostream> #include <cstdlib> using namespace std; typedef int E ...
- C语言学习016:单链表
#include <stdio.h> //定义一个链表,链表是一种递归结构,在定义的时候必须要给结构起一个名字 typedef struct folder{ int level; char ...
随机推荐
- 【收藏】十大Webserver漏洞扫描工具
如今有很多消息令我们感到Web的危急性,因此,当前怎样构建一个安全的Web环境成为网管员和安全管理员们义不容辞的责任.可是巧妇难为无米之炊,该选择哪些安全工具呢? 扫描程序能够在帮助造我们造就安全的W ...
- 修改Chrome的User Agent的方法 真实有效
如何修改Chrome的User Agent: 通过网络上查找,修改Chrome的Usre Agent有3种方式,但有的方式是不起作用的. 给Chrome添加启动参数(有作用) 通过扩展-User-Ag ...
- 自定义按照index和key访问的List
List<T>用起来比较方便,但是有时候要按照Index来访问List中的对象有些繁琐,所以想是不是扩展一下,既能按照Index来访问,又能按照Key访问. 实现方法: public cl ...
- 怎么使用dreamweaver制作网页教程 dw建站设计网页
对于网页制作相关专业人士一定对dreamweaver有所认识,下面小编就问大家总结一下相关网页制作的一些步骤,喜欢的朋友可以一起来学习一下 Dreamweaver这一款专业的网页制作软件,相信相关 ...
- TcpClient
public class TcpClientSession { protected TcpClient Client { get; set; } /// <summary> /// 远程地 ...
- 在eclipse上提交任务到集群执行
win7下eclipse远程开发hadoop程序,分为两种: (1)运行[Run As] Java Application, 打包程序为jar,上传集群执行(这里不做解释) (2)运行[Run As] ...
- HDU1789(Doing Homework again)题解
HDU1789(Doing Homework again)题解 以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定任务分数和其截止日期,每日可完成一任务,输出当罚分尽可能小时 ...
- spring集成mongodb jar包版本问题
在开发过程中,spring集成mongodb的jar包. 如果需要使用排序功能. spring-data-mongodb-1.4.1.RELEASE.jar 的版本为1.4.1,如果使用如下代码: Q ...
- linux下mysql忘记root密码怎么办
Linux下MySQL忘记root密码怎么办? Linux下MySQL忘记root密码怎么办? 1. 修改MySQL配置文件 默认MySQL的配置文件为/etc/my.cnf,在[mysqld]下面添 ...
- 5.7.2.2 min()和max()方法
Math对象还包含许多方法,用于辅助完成简单和复杂的数学计算. 其中,min()和max()方法用于确定一组数值中的最小值和最大值.这两个方法都可以接受任意多个数值参数,如下例子: var max = ...