原理可访问https://www.cnblogs.com/yang901112/p/11674333.html

头文件

 #ifndef RLIST_H
#define RLIST_H
#include <iostream> template <class T> class List; template <class T>
class ListNode
{
friend class List<T>;
public:
ListNode() { next = ; }
ListNode(T el, ListNode* ptr = ) {
data = el; next = ptr;
}
private:
T data;
ListNode *next;
}; template <class T>
class List
{
public:
List() {
head = ;
head = tail = ; }
~List();
int isEmpty() {
return head == ;
}
void addToHead(T); //从头插入结点
void addToTail(T); //从尾部插入节点
void disPlay() const;
T deleteFromHead(); //从头删除结点//若不需要返回值可以使用void
T deleteFromTail(); //从尾部删除节点
void deleteNode(T); //按值删除结点
bool isInList(T) const; //判断值是否在链表里
void Invert(); //反转链表
private:
ListNode<T> *head, *tail;
}; template <class T>
List<T>::~List() {
for (ListNode<T> *p; !isEmpty();) {
p = head->next;
delete head;
head = p;
}
} template <class T>
void List<T>::addToHead(T el) {
head = new ListNode<T>(el, head);
if (tail == )
tail = head;
} template <class T>
void List<T>::addToTail(T el) {
if (tail != ) {
tail->next = new ListNode<T>(el);
tail = tail->next;
}
else head = tail = new ListNode<T>(el);
} template <class T>
T List<T>::deleteFromHead() {
T el = head->data;
ListNode<T> *tmp = head;
if(head==tail)
{
head = tail = ;
}
else head = head->next;
delete tmp;
return el;
} template <class T>
T List<T>::deleteFromTail() {
T el = tail->data;
if(head==tail)
{
delete head;
head = tail = ;
}
else {
ListNode<T> *tmp;
for (tmp = head; tmp->next != tail; tmp = tmp->next);
delete tail;
tail = tmp;
tail->next = ;
}
return el;
} template <class T>
void List<T>::deleteNode(T el) {
ListNode<T> *previous = ;
ListNode<T> *current;
for (current = head; current && current->data != el;
previous = current, current = current->next);
if (current)
{
if (previous) { previous->next = current->next; }
else head = head->next;
delete current;
}
} /*****************************************/
//template <class T>
//bool List<T>::isInList(T el) const {
// bool flag = false;
// ListNode<T> *tmp;
// tmp = head->next;
// while (tmp) {
// if (tmp->data == el) {
// flag = true;
// break;
// }
// tmp = tmp->next;
// }
// return flag;
//} //可以使用for循环代替while代码可以简洁一些
template <class T>
bool List<T>::isInList(T el) const {
ListNode<T> *tmp;
for (tmp = head; tmp && tmp->data != el; tmp = tmp->next);
return tmp != ;
}
/*****************************************/ template <class T>
void List<T>::Invert() {
ListNode<T> *p = head, *q = ;
while (p)
{
ListNode<T> *r = q; q = p;
p = p->next;
q->next = r;
}
head = q;
} template <class T>
void List<T>::disPlay() const{
//ListNode<T> *p;
//p = head;
//while (p)
//{
// std::cout << p->data;
// if (p->next) { std::cout << "->"; } //就是仅在数字之间加"->"
// p = p->next;
//}
for (ListNode<T> *current = head; current; current = current->next)
{
std::cout << current->data;
if (current->next) std::cout << "->";
}
std::cout << std::endl;
} #endif

源文件

 #include <iostream>
#include"Rlist.h"
#include <iomanip>
using namespace std; int main()
{
cout << "测试" << endl;
List<int> ilist;
ilist.addToTail();
ilist.addToTail();
ilist.addToTail();
ilist.addToTail();
ilist.disPlay();
ilist.deleteFromHead();
ilist.disPlay(); List<int> ilist2;
ilist2.addToHead();
ilist2.addToHead();
ilist2.addToHead();
ilist2.addToHead();
ilist2.disPlay();
cout << ilist2.isInList() << endl;
ilist2.deleteFromTail();
ilist2.disPlay();
cout << ilist2.isInList() << endl; List<char> charlist1;
charlist1.addToTail('a');
charlist1.addToTail('b');
charlist1.addToTail('c');
charlist1.addToTail('d');
charlist1.disPlay();
charlist1.Invert();
charlist1.disPlay();
charlist1.deleteNode('c');
charlist1.disPlay();
charlist1.deleteNode('e'); //虽然'e'不存在,但是不影响
charlist1.disPlay(); return ;
}

数据结构-单链表-类定义C++的更多相关文章

  1. 数据结构-单链表-类定义2-C++

    上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...

  2. C# 数据结构--单链表

    什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是 ...

  3. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  4. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  5. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  6. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  7. 数据结构 - 单链表 C++ 实现

    单链表 单链表的定义 typedef int ElemType; typedef struct LNode { ElemType data; LNode *next; } LNode, *LinkLi ...

  8. 数据结构—单链表(类C语言描写叙述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ...

  9. 数据结构实验2:C++实现单链表类

    太简单了,直接贴题目然后上代码. 题目: 实验2 2.1 实验目的 熟练掌握线性表的链式存储结构. 熟练掌握单链表的有关算法设计. 根据具体问题的需要,设计出合理的表示数据的链式存储结构,并设计相关算 ...

随机推荐

  1. #C++初学记录(N皇后#回溯递归)

    <font size=5 face"微软雅黑">N皇后Problem Description <font size=4 face"微软雅黑"& ...

  2. Spring 中开启Mybatis缓存

    mybatis的一级缓存默认是开启的,二级缓存开启的方法: 在每个Mapper.xml文件中加入一个

  3. Jar hell问题以及解放方法

    当一个类或一个资源文件存在多个jar中,就好存在jar hell问题 可以通过以下代码来诊断问题:

  4. snmpwalk 安装与使用详解-windows下

    snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户.通过snmpwalk也可以查看支持SNMP协议( ...

  5. clientHeight,offsetHeight,scrollHeight迷一样的三个值

    https://blog.csdn.net/qq_39083004/article/details/78498178 https://www.imooc.com/article/17571  推荐 o ...

  6. fa-list-alt

    你可以用 <i> 标签把 Font Awesome 图标放在任意位置. <i class="fa fa-list-alt" aria-hidden="t ...

  7. 【PV和PVC】kubernetes存储 persistent volume(持久化硬盘)和 persistent volume claim(持久化硬盘请求)

    报错:pod has unbound immediate PersistentVolumeClaims (repeated 11 times) pv没有满足pvc需求 https://www.cnbl ...

  8. centos配置/etc/mail.rc发邮件

    安装mailx: yum install mailx vi /etc/mail.rc set from=524755798@qq.comset smtp="smtps://smtp.qq.c ...

  9. 【Leetcode_easy】1154. Day of the Year

    problem 1154. Day of the Year solution class Solution { public: int dayOfYear(string date) { // 平年 闰 ...

  10. Amazon MWS Scratchpad

    https://mws.amazonservices.com/scratchpad/index.html Use this page to test Amazon MWS API request an ...