/*节点Node的相关声明与定义*/
//Node.h
#include<iostream>
using namespace std;
template<typename T>
class Node
{
public:
Node();
Node(T data);
~Node();
void setData(T data);
T getData();
void setNext(Node<T>*next);
Node* getNext();
void printData();
private:
T *m_tpData;
Node<T> *m_tpNext;
};
template<typename T>
Node<T>::Node()
{
m_tpData = new T;
m_tpNext = NULL;
}
template<typename T>
Node<T>::~Node()
{
delete m_tpData;
m_tpNext = NULL;
}
template<typename T>
void Node<T>::setData(T data)
{
*m_tpData = data;
}
template<typename T>
T Node<T>::getData()
{
return *m_tpData;
}
template<typename T>
void Node<T>::setNext(Node<T> *next)
{
m_tpNext = next;
}
template<typename T>
Node<T>*Node<T>::getNext()
{
return m_tpNext;
}
template<typename T>
void Node<T>::printData()
{
cout << *m_tpData << endl;
}
/*链表中相关功能的函数的定义与实现*/
//LinkList.h
#include<iostream>
#include "Node.h"
using namespace std; template<typename T>
class LinkList
{
public:
LinkList();
~LinkList();
bool isListEmpty();
bool clearList();
int getListLength();
int getElemIndex(T &elem);
bool getListElem(int index, T* elem);
bool ListInsert(int index, T &elem);
bool ListDelete(int index, T *elem);
void ListPrint(void);
private:
Node<T> *m_pList;
int m_iLength;
};
template<typename T>
LinkList<T>::LinkList()
{
m_pList = new Node<T>;
m_pList->setData(NULL);
m_pList->setNext(NULL);
m_iLength = ;
}
template<typename T>
LinkList<T>::~LinkList()
{
Node<T>*nextNode = m_pList;
while (nextNode->getNext() != NULL)
{
nextNode = m_pList->getNext();
delete m_pList;
m_pList = nextNode;
}
delete m_pList;//delete last Node
m_pList = NULL;
}
template<typename T>
bool LinkList<T>::isListEmpty()
{
if (m_iLength == )
{
return true;
}
return false;
}
template<typename T>
bool LinkList<T>::clearList()
{
if (isListEmpty())
{
cout << "List empty clear fail" << endl;
return false;
}
Node<T>*nowNode = m_pList->getNext();
Node<T>*nextNode = m_pList->getNext();
while (nextNode->getNext() != NULL)
{
nextNode = nowNode->getNext();
delete nowNode;
nowNode = nextNode;
}
delete nowNode;
m_iLength = ;
m_pList->setNext(NULL);
return true;
}
template <typename T>
int LinkList<T>::getListLength()
{
return m_iLength;
}
template <typename T>
int LinkList<T>::getElemIndex(T &elem)
{
Node<T> *tempNode = m_pList;
for (int i = ; i < m_iLength; i++)
{
tempNode = tempNode->getNext();
if (elem == tempNode->getData())
{
return i;
}
}
return -;
}
template<typename T>
bool LinkList<T>::getListElem(int index, T *elem)
{
if (index < || index >= m_iLength)
{
return false;
}
Node<T>*tempNode = m_pList;
for (int i = ; i <= index; i++)
{
tempNode = tempNode->getNext();
}
*elem = tempNode->getData();
return true;
} template<typename T>
bool LinkList<T>::ListInsert(int index, T &elem)
{
if (index< || index>m_iLength)
{
return false;
}
Node<T>*tempPreNode = m_pList;
for (int i = ; i < index; i++)
{
tempPreNode = tempPreNode->getNext();
}
Node<T>*newnode = new Node<T>;
if (newnode == NULL)
{
cout << "new node create fail" << endl;
return false;
}
Node<T>*tempNode = tempPreNode->getNext();
tempPreNode->setNext(newnode);
newnode->setNext(tempNode);
newnode->setData(elem);
m_iLength++;
return true;
}
template<typename T>
bool LinkList<T>::ListDelete(int index, T *elem)
{
if (index < || index >= m_iLength)
{
return false;
}
Node<T>* tempPreNode = m_pList;
for (int i = ; i < index; i++)
{
tempPreNode = tempPreNode->getNext();
}
Node<T>*tempNode = tempPreNode->getNext();
tempPreNode->setNext(tempNode->getNext());
*elem = tempNode->getData();
delete tempNode;
m_iLength--;
return true;
}
template<typename T>
void LinkList<T>::ListPrint(void)
{
if (isListEmpty())
{
cout << "List empty" << endl;
return;
}
Node<T>*tempNode = m_pList->getNext();
while (tempNode->getNext() != NULL)
{
tempNode->printData();
tempNode = tempNode->getNext();
}
tempNode->printData();
cout << "end" << endl;
}
//主程序main.cpp//
#include<iostream>
#include<string>
#include"LinkList.h"
using namespace std; int main(void)
{
/*insert data check */
int data[] = { ,,,,,,,,, };
LinkList<int>*linklist = new LinkList<int>;
for (int i = ; i < ; i++)
{
linklist->ListInsert(i, data[i]);
}
linklist->ListPrint();
/*getElemIndex check*/
cout << "getElemIndex:" << linklist->getElemIndex(data[]) << endl;
/*getListElem check*/
int getdata;
linklist->getListElem(, &getdata);
cout << "getListElem:" << getdata << endl;
/*delete data check*/
int deletedata;
linklist->ListDelete(, &deletedata);
cout << "delete data:" << deletedata << endl;
linklist->ListPrint();
/*clearList check*/
linklist->clearList();
linklist->ListPrint(); delete linklist;
linklist = NULL;
system("pause");
return ;
}

结果图:

参考:https://www.cnblogs.com/HongYi-Liang/p/7172345.html?utm_source=itdadao&utm_medium=referral

2018-04-2215:46:49

数据结构c++实现代码-链表的更多相关文章

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

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

  2. 数据结构:DHUOJ 删除链表的顺数及倒数第N个节点

    删除链表的顺数及倒数第N个节点 作者: turbo时间限制: 1S章节: DS:数组和链表 题目描述: 可使用以下代码,完成其中的removeNth函数,其中形参head指向无头结点单链表,n为要删除 ...

  3. JavaScript 数据结构与算法3(链表)

    学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.链表 本章学习如何实现和使用链表这种动态的数据结构 ...

  4. php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))

    php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...

  5. jdk1.8HashMap底层数据结构:散列表+链表+红黑树,jdk1.8HashMap数据结构图解+源码说明

    一.前言 本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系. 二.jdk1.8 HashMap底层数据结构图 三.源码 1.散列表(Hash table ...

  6. Java数据结构和算法之链表

    三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...

  7. 再次复习数据结构:c语言链表的简单操作

    最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...

  8. JavaScript数据结构与算法(六) 链表的实现

    // 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个 // 元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成.下图展 // 示了一个链表的 ...

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

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

随机推荐

  1. 第一节,Windows10下Darkflow的安装与测试(YOLO)

    1.下载Darkflow:https://github.com/thtrieu/darkflow 2.解压到目录,打开cmd,进入到解压的目录,并输入python setup.py build_ext ...

  2. 图片转换base64编码,点击div的时候选择文件

    有时候我们希望文件上传的时候预览图片,下面插件可以实现上传前预览图片 (也可以提取文件的base64编码) max-height: 140px;max-width: 120px;可以指定图片的最大宽度 ...

  3. 一个是EF内联多表查询,一个是EF中写SQL文。

    public IList<MenuModel> GetAllMenu() { using (IMMEntities context = new IMMEntities()) { var m ...

  4. 将replicated数据与元数据关联

    本章介绍元数据的用法以及如何将replicated数据与元数据相关联. 12.1概述 将数据从一个表复制到另一个表时,重要的考虑因素是源表和目标表的列结构(元数据)是否相同. Oracle Golde ...

  5. SpringSecurity基于数据库RBAC数据模型控制权限

    ⒈通用RBAC(Role - Based Access Control)数据模型 ⒉如何使用 1. package cn.coreqi.ssoserver.rbac; import org.sprin ...

  6. Linxu基础知识:终端、终端模拟器、shell

    实验楼课程第二个实验的讲解部分出现了三个词,我不知道它们三个是什么关系.查阅了度娘,归纳如下: - 终端: 在UNIX/LINUX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端就成为S ...

  7. linux CPU动态调频【转】

    转自:https://www.xuebuyuan.com/2185926.html 针对sep4020的linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时 ...

  8. apache做反向代理服务器

    apache代理分为正向代理和反向代理: 1 正向代理: 客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web(需要在客户端的浏览器中设置代 ...

  9. $Django cbv源码分析 djangorestframework框架之APIView源码分析

    1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...

  10. Css样式压缩、美化、净化工具 源代码

    主要功能如下: /* 美化:格式化代码,使之容易阅读 */ /* 净化:将代码单行化,并去除注释 */ /* 压缩:将代码最小化,加快加载速度 */ /* 以下是演示代码 */ /*reset beg ...