/*节点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. 微信小程序入门八头像上传

    1. action-sheet 底部弹出可选菜单组件 2. wx.uploadFile 将本地资源上传到服务器 3. wx.chooseImage 从本地相册选择图片或使用相机拍照. 4. wx.pr ...

  2. vmware常用命令

    控制台桌面执行快捷键ctrl+alt+f2 可以进入命令行

  3. 生产者消费者模型java

    马士兵老师的生产者消费者模型,我感觉理解了生产者消费者模型,基本懂了一半多线程. public class ProducerConsumer { public static void main(Str ...

  4. python 获取本机IP的三种方式

    python获取本机IP的方式 第一种: #!/usr/bin/python import socket import fcntl import struct def get_ip_address(i ...

  5. Templates<2>

    Part:template specialized Part1:template specialized #include <iostream> #include <stdio.h& ...

  6. 使用sudo而无需输入密码的设置

    在linux上,root用户是老大,什么事都能做.但是,很多时候由于安全等各种原因,我们不希望把root用户开放给大家,但是又希望其他的用户可以有root的权限,所以就有了sudo用户.而执行sudo ...

  7. Food HDU - 4292 网络流 拆点建图

    http://acm.hdu.edu.cn/showproblem.php?pid=4292 给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料 写的时候一共用了2种 ...

  8. selenium控制浏览器

    1.要把浏览器设置为全屏,否则有些元素是操作失败的,如对下图进行操作按钮是失败的,因为按钮没有显示出来 2.设置浏览器的宽.高 3.控制前进.后退(不建议使用driver.black().driver ...

  9. locale and system laungues

    In computing, a locale is a set of parameters that defines the user's language, region and any speci ...

  10. 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)

    题目: 1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) ...