数据结构--单链表single linked list(无表头哨兵)重写

针对上次写的单链表中不足的地方进行修改:

1.构造函数需要让用户输入(bad)

2.函数功能不单一,既操作链表,还打印输出(bad)

代码链接(包含无头\有头单链表、循环单链表、双链表、循环双链表)

接口 singleList.h

//
// Created by mingm on 2019/3/18.
//
#ifndef _SINGLELIST_H
#define _SINGLELIST_Hstruct SNode		//结点的基本数据类型
{int data;SNode* pNext;
};typedef unsigned int UINT;
typedef SNode* ListNode;class SingleList
{public:SingleList(void);~SingleList(void);bool IsEmpty() const;//判断链表是否为空UINT GetLength() const;//获取当前链表的长度ListNode GetHeadNode() const;//获取链表的头结点ListNode GetTailNode() const;//获取链表的尾结点ListNode GetMidNode();//获得链表的中间结点void AddHead(const int &data);//在链表的头部插入新的结点void AddTail(const int &data);//在链表的尾部插入新的结点bool posInList(ListNode pos);//检查节点指针是否在链表中ListNode InsertAt(ListNode pos, const int &data);//在指定结点前插入数据,并返回新结点的地址ListNode ModifyAt(ListNode pos, const int &data);//修改指定结点的数据,并返回当前节点的地址ListNode RemoveAt(ListNode pos);//删除指定结点,并返回被删除结点的下一结点的地址ListNode RemoveAtBack(UINT nCountBack);//删除倒数第n个节点,并返回被删除结点的下一结点的地址ListNode Find(const int &data);//在当前链表中找到和要查找数据相等的第一个结点的地址void Erase();//删除链表的所有结点void PrintList() const;//打印链表所有结点的数据void Reverse();//反转链表private:ListNode m_pHead;   //头结点UINT m_nListLen;    //链表数据长度
};#endif

类实现文件 singleList.cpp

//单向链表(不带头)
// Created by mingm on 2019/3/18.
//
#include "singleList.h"
#include <iostream>SingleList::SingleList():m_pHead(NULL),m_nListLen(0){}SingleList::~SingleList()
{Erase();
}
void SingleList::Erase()
{if(m_pHead != NULL){ListNode temp = m_pHead, del;while(temp != NULL){del = temp;temp = temp->pNext;delete del;}m_pHead = NULL;m_nListLen = 0;}
}
bool SingleList::IsEmpty() const
{return m_pHead == NULL;
}
UINT SingleList::GetLength() const
{return m_nListLen;
}
ListNode SingleList::GetHeadNode() const
{return m_pHead;
}
ListNode SingleList::GetTailNode() const
{if(!m_pHead)return NULL;ListNode temp = m_pHead;while(temp->pNext != NULL){temp = temp->pNext;}return temp;
}
ListNode SingleList::GetMidNode()   //快慢指针法
{ListNode fast = m_pHead, slow = m_pHead;while(fast){if(fast->pNext != NULL){fast = fast->pNext->pNext;}else{break;}slow = slow->pNext;}//简洁写法
//    while(fast && fast->pNext)
//     {
//        fast = fast->pNext->pNext;
//        slow = slow->pNext;
//     }return slow;
}
void SingleList::AddHead(const int &data)
{ListNode newNode = new SNode;newNode->data = data;newNode->pNext = NULL;if(m_pHead == NULL){m_pHead = newNode;}else{newNode->pNext = m_pHead;m_pHead = newNode;}m_nListLen++;
}
void SingleList::AddTail(const int &data)
{ListNode newNode = new SNode;newNode->data = data;newNode->pNext = NULL;if(m_pHead == NULL){m_pHead = newNode;}else{GetTailNode()->pNext = newNode;}m_nListLen++;
}
bool SingleList::posInList(ListNode pos)
{if(m_pHead == NULL)return false;else{ListNode temp = m_pHead;while(temp && temp != pos){temp = temp->pNext;}if(temp == NULL)    //指针地址不在链表内return false;elsereturn true;}
}
ListNode SingleList::InsertAt(ListNode pos, const int &data)
{if(pos == NULL)return NULL;else if(pos == m_pHead){AddHead(data);return m_pHead;}else{ListNode temp = m_pHead;ListNode preNode = NULL;while(temp && temp != pos){preNode = temp;temp = temp->pNext;}if(temp == NULL)    //指针地址不在链表内return NULL;else{ListNode newNode = new SNode;newNode->data = data;newNode->pNext = NULL;newNode->pNext = pos;preNode->pNext = newNode;m_nListLen++;return newNode;}}
}
ListNode SingleList::ModifyAt(ListNode pos, const int &data)
{if(!posInList(pos))return NULL;else{pos->data = data;return pos;}
}
ListNode SingleList::RemoveAt(ListNode pos)
{if(!posInList(pos))return NULL;else{ListNode temp = m_pHead;if(pos == m_pHead){temp = pos->pNext;delete pos;m_nListLen--;m_pHead = temp;return temp;}else{while(temp->pNext != pos){temp = temp->pNext;}temp->pNext = pos->pNext;delete pos;m_nListLen--;return temp->pNext;}}
}
ListNode SingleList::RemoveAtBack(UINT nCountBack)//先让快指针先走n-1步,然后快慢指针一起动,快指针到达尾部,慢指针指向倒数第n个
{if(nCountBack == 0 || nCountBack > m_nListLen)return NULL;else{ListNode fast = m_pHead;ListNode slow = m_pHead;for(int i = 0; i < nCountBack-1 && fast; ++i){fast = fast->pNext;}while(fast->pNext){fast = fast->pNext;slow = slow->pNext;}fast = RemoveAt(slow);return fast;}
}
ListNode SingleList::Find(const int &data)
{ListNode temp = m_pHead;while(temp && temp->data != data){temp = temp->pNext;}return temp;
}
void SingleList::PrintList() const
{std::cout << "----- print start ----" << std::endl;ListNode temp = m_pHead;for(int i = 0; i < m_nListLen && temp; ++i){std::cout << "No. " << i+1 << " node is " << temp->data << std::endl;temp = temp->pNext;}std::cout << "----- print end ----" << std::endl;
}
void SingleList::Reverse()  //就地反转法
{if(m_pHead && m_pHead->pNext){ListNode preNode, curNode, tempNode;preNode = curNode = tempNode = m_pHead;curNode = preNode->pNext;preNode->pNext = NULL;while(curNode->pNext){tempNode = curNode;curNode = curNode->pNext;tempNode->pNext = preNode;preNode = tempNode;}curNode->pNext = preNode;m_pHead = curNode;}
}

测试主程序 test_singleList.cpp

测试程序包含长度从0开始的 list,以便检查边界情况下程序是否正常运行。

//
// Created by mingm on 2019/3/20.
//
#include "singleList.cpp"
#include <iostream>
using namespace std;
int main()
{for(int k = 0; k < 5; ++k){cout << "------------ test start ----------------" << endl;SingleList intList;if(intList.IsEmpty())cout << "empty list!" << endl;cout << intList.GetLength() << " node(s) !" << endl;cout << "---------------" << endl;cout << "add 0  to " << k-1 << " into list: " << endl;for(int j = 0; j < k; ++j){intList.AddTail(j);}cout << intList.GetLength() << " node(s) !" << endl;intList.PrintList();cout << "------------- reverse list" << endl;intList.Reverse();intList.PrintList();if(intList.GetHeadNode()){cout << "head node: " << intList.GetHeadNode()->data << endl;cout << "tail node: " << intList.GetTailNode()->data << endl;cout << "middle node: " << intList.GetMidNode()->data << endl;}cout << "--------------- addTail " << k << endl;intList.AddTail(k);intList.PrintList();if(intList.posInList(intList.GetMidNode()))cout << "midNode in List !" << endl;cout << "100 insert at midNode ";if(intList.GetMidNode())cout << intList.GetMidNode()->data ;cout << " front " << endl;intList.InsertAt(intList.GetMidNode(),100);intList.PrintList();cout << "modify head to 99 " << endl;intList.ModifyAt(intList.GetHeadNode(),99);intList.PrintList();cout << "del Tail" << endl;intList.RemoveAt(intList.GetTailNode());intList.PrintList();cout << "del the " << intList.GetLength()-1 << "th node count from end !" << endl;intList.RemoveAtBack(intList.GetLength()-1);intList.PrintList();cout << "address of first " << k-3 << " is ";if(intList.Find(k-3))cout << intList.Find(k-3) << endl;elsecout << "not exits !" << endl;}return 0;
}

Valgrind检查内存是否泄漏(部分结果展示如下)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下

一只小狐狸带你解锁炼丹术&NLP秘籍神经网络模型除了部署在远程服务器之外&#xff0c;也会部署在手机、音响等智能硬件上。比如在自动驾驶的场景下&#xff0c;大部分模型都得放在车上的终端里&#xff0c;不然荒山野岭没有网的时候就尴尬了。对于BERT这类大模型来说&#…

LS-GAN:把GAN建立在Lipschitz密度上

最近很多关心深度学习最新进展&#xff0c;特别是生成对抗网络的朋友可能注意到了一种新的GAN-- Wasserstein GAN。其实在WGAN推出的同时&#xff0c;一种新的LS-GAN (Loss Sensitive GAN&#xff0c;损失敏感GAN)也发表在预印本 [1701.06264] Loss-Sensitive Generative Adver…

java程序员必看经典书单,以及各个阶段学习建议

最近&#xff0c;部分读者一直希望我给大家推荐java程序员必读书籍&#xff0c;以及java程序员每个阶段的学习建议。 今天&#xff0c;先给大家推荐1.0版本&#xff0c;后面再不断完善程序员必读书籍2.0版本。 希望&#xff0c;你早日成为牛逼的程序员。 程序员进阶之路 上图是…

数据结构--链表--单链表归并排序mergesort

思路&#xff1a; 1.将链表的中点找到&#xff0c;对其切分成2条 2.继续步骤1&#xff0c;切成4条&#xff0c;8条。。。,直至每段链表只有1个元素 3.归并操作&#xff0c;对两两链表进行合并排序&#xff0c;并返回回并后的链表的头结点&#xff0c;依次向上递归回去 C代码…

我们的实践:事理图谱,下一代知识图谱

原文链接&#xff1a;https://mp.weixin.qq.com/s/iLfXeVeWE5CCs_sM_NAOSw 一、人工智能与认知智能 当前人工智能时代下&#xff0c;机器与人类之间的博弈一直在进行着。如图1所示&#xff0c;从1956年达特茅斯会议的召开标志人工智能诞生到深度学习模型在若干人工智能领域大规…

领域应用 | 偷偷告诉你,那些二次元萌妹都有个叫知识图谱的爸爸

本文转载自公众号&#xff1a;AI 时间。《AI108将》是AI时间全新的AI行业人物专访栏目。艾伦麦席森图灵说&#xff1a;有时&#xff0c;那些人们对他们并不抱有期望的人&#xff0c;却能做到人们不敢期望的事情。Sometimes Its very people who no one imagines angthing of wh…

白话生成对抗网络 GAN,50 行代码玩转 GAN 模型!【附源码】

今天&#xff0c;带大家一起来了解一下如今非常火热的深度学习模型&#xff1a;生成对抗网络&#xff08;Generate Adversarial Network&#xff0c;GAN&#xff09;。GAN 非常有趣&#xff0c;我就以最直白的语言来讲解它&#xff0c;最后实现一个简单的 GAN 程序来帮助大家加…

java架构师进阶之独孤九剑(一)-算法思想与经典算法

“ 这是整个架构师连载系列&#xff0c;分为9大步骤&#xff0c;我们现在还在第一个步骤&#xff1a;程序设计和开发->数据结构与算法。 我们今天讲解重点讲解算法。 算法思想 1 贪心思想 顾名思义&#xff0c;贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并…

数据结构--链表--单链表中环的检测,环的入口,环的长度的计算

就如数字6一样的单链表结构&#xff0c;如何检测是否有6下部的○呢&#xff0c;并且求交叉点位置 思路 使用快慢指针&#xff08;一个一次走2步&#xff0c;一个走1步&#xff09;&#xff0c;若快慢指针第一次相遇&#xff0c;则有环 慢指针路程 sabs absab 快指针路程 2sa…

ACL 2010-2020研究趋势总结

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;哈工大SCIR 车万翔教授导读2020年5月23日&#xff0c;有幸受邀在中国中文信息学会青年工作委员会主办的AIS&#xff08;ACL-IJCAI-SIGIR&#xff09;2020顶会论文预讲会上介绍了ACL会议近年来的研究趋势&#xff0c;特整…

架构师进阶之独孤九剑:设计模式详解

我们继续架构师进阶之独孤九剑进阶&#xff0c;目前我们仍然在第一阶段&#xff1a;程序设计和开发环节。 “ 设计模式不仅仅只是一种规范&#xff0c;更多的是一种设计思路和经验总结&#xff0c;目的只有一个&#xff1a;提高你高质量编码的能力。以下主要分为三个环节&…

知识表示发展史:从一阶谓词逻辑到知识图谱再到事理图谱

研究证实&#xff0c;人类从一出生即开始累积庞大且复杂的数据库&#xff0c;包括各种文字、数字、符码、味道、食物、线条、颜色、公式、声音等&#xff0c;大脑惊人的储存能力使我们累积了海量的资料&#xff0c;这些资料构成了人类的认知知识基础。实验表明&#xff0c;将数…

领域应用 | 基于知识图谱的警用安保机器人大数据分析技术研究

本文转载自公众号&#xff1a;警察技术杂志。 郝久月 樊志英 汪宁 王欣 摘 要&#xff1a;构建大数据支撑下的智能应用是公安信息化发展的趋势&#xff0c;警用安保机器人大数据分析平台的核心功能包括机器人智能人机交互和前…

数据挖掘学习指南!!

入门数据挖掘&#xff0c;必须理论结合实践。本文梳理了数据挖掘知识体系&#xff0c;帮助大家了解和提升在实际场景中的数据分析、特征工程、建模调参和模型融合等技能。完整项目实践&#xff08;共100多页&#xff09;后台回复 数据挖掘电子版 获取数据分析探索性数据分析&am…

数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)

栈结构&#xff1a;先进后出&#xff0c;后进先出&#xff0c;像叠盘子一样&#xff0c;先叠的后用。 代码github地址 https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/stack 1.顺序栈&#xff08;数组存储&#xff0c;需给定数组大小&#xff0c…

银行计考试-计算机考点2-计算机系统组成与基本工作原理

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/sinat_33363493/article/details/53647129 </div><link rel"stylesheet" href"https://csdnimg.cn/release/pho…

我们的实践: 400万全行业动态事理图谱Demo

历史经验知识在未来预测的应用 华尔街的独角兽Kensho&#xff0c;是智能金融Fintech的一个不得不提的成功案例&#xff0c;这个由高盛领投的6280万美元投资&#xff0c;总融资高达7280万美元的公司自推出后便名声大噪。Warren是kensho是一个代表产品&#xff0c;用户能够以通俗…

蚂蚁花呗团队面试题:LinkedHashMap+SpringCloud+线程锁+分布式

一面 自我介绍 map怎么实现hashcode和equals,为什么重写equals必须重写hashcode 使用过concurrent包下的哪些类&#xff0c;使用场景等等。 concurrentHashMap怎么实现&#xff1f;concurrenthashmap在1.8和1.7里面有什么区别 CountDownLatch、LinkedHashMap、AQS实现原理 …

肖仰华 | SIGIR 2018、WWW2018 知识图谱研究综述

本文转载自公众号&#xff1a;知识工场。全国知识图谱与语义计算大会&#xff08;CCKS: China Conference on Knowledge Graph and Semantic Computing&#xff09;由中国中文信息学会语言与知识计算专委会定期举办的全国年度学术会议。CCKS源于国内两个主要的相关会议&#xf…

数据结构--栈--共享顺序栈

共享顺序栈&#xff1a;内部也是一个数组 将两个栈放在数组的两端&#xff0c;一个从数组首端开始压栈&#xff0c;一个从数组尾部开始压栈&#xff0c;等到两边栈顶在中间相遇时&#xff0c;栈满。 共享顺序栈在某些情况下可以节省空间。 头文件 sharingStack.h //共享顺序…