数据结构(C++)--学习单链表时发现的一些小坑
基于类的链表类无相应构造函数报错
#include<bits/stdc++.h>
using namespace std;
const int MaxSize = 10;
template <class T>
class Seqlist {
public:
Seqlist() { length = 0;}
Seqlist(T [],int);
private:
int length;
T data[MaxSize];
};
class B {
public:
B(T);
B() {} //这个默认的构造函数十分重要
private:
T data;
};
B::B(T n) {
data = n;
}
template <class T>
Seqlist<T>::Seqlist(T arr[], int n) {
if (n > MaxSize) throw "invalid num";
for (int i = 0;i < n;i++) {
data[i] = arr[i];
}
length = n;
}
int main() {
B b[3] = {B(10), B(20), B(30)};
Seqlist<B> list(b,3);
}
在上面部分代码中,如果把有注释的那一行代码删去,则这部分代码不能正常运行,报错信息是
no matching function for call to 'B::B()'[25, 35]
根据这个报错信息找到相应行数,居然在int n这里报错,我寻思着这关n什么事,后面查阅了资料,原因出在第34行的B b[3]这里,定义了一个B类型的数组,没有参数传入,而B类中无适配该成员的构造函数,于是编译器报错
解决方法是,加上相应的构造函数B() {}
线性链表的反转和复制功能
#include<bits/stdc++.h>
using namespace std;
template <class T>
struct Node {
T data;
Node<T>* next;
};
template <class T>
class LinkList {
public:
LinkList(); // create an empty list
LinkList(T[], int);
//~LinkList();
void Reverse(Node<T>* head);
Node<T>* Copy(Node<T>* head);
Node<T>* first;
}
template <class T>
LinkList<T>::LinkList() {
first = new Node<T>;
first->next = NULL;
}
template <class T>
LinkList<T>::LinkList(T arr[], int n) {
first = new Node<T>;
Node<T>* p = first;
for (int i = 0;i < n;i++) {
Node<T>* s = new Node<T>;
s->data = arr[i];
p->next = s;//让first指向第一个节点
p = s;//虽说把s的地址赋给p,但是first的地址和p不一样,对p操作不会改变first
//因此first永远指向链表第一个位置
}
p->next = NULL;
}
template <class T>
void LinkList<T>::Reverse(Node<T>* head) {
Node<T>* pre, *cur;
cur = head->next;
head->next = NULL;
while (cur) {
pre = cur;//让当前节点的上一节点移动到当前节点位置
cur = cur->next;//当前节点移动到下一个位置
pre->next = head->next;//这一操作就是让pre不断指向前一个节点
head->next = pre;//更新节点,让head的next指向pre
}
//在画图理解时,要让cur和pre同时向后移动
//这一部分,建议自己在纸上画出若干个节点和用三个小部件(代表三个指针)模拟一边才能够真正地理解
}
//复盘时自己有个小细节没注意到,这里都是指针变量的赋值操作,这里的赋值只是赋予地址,给予者的值改变,接收者的值不会改变
template <class T>
Node<T>* LinkList<T>::Copy(Node<T>* head) {
Node<T>* headB = new Node<T>;
Node<T>* pb = headB;
Node<T>* pa = head->next;
while (pa != NULL) {
Node<T>* temp = new Node<T>;
temp->data = pa->data;
temp->next = NULL;//这里用到了一个临时指针变量
pb->next = temp;//让pb连上temp
pb = pb->next;
pa = pa->next;
//这里向后移动
}
return headB;
//注意这里返回的是headB,在调用时记得再加一个"->next"
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
LinkList<int> list(arr,5);
cout << "the origin state: " << endl;
list.PrintList();
cout << endl << "copy list a to list b\n";
Node<int>* ptr = new Node<int>;
ptr = list.copy(list.first)->next;
while (ptr != NULL) {
cout << ptr->data << ' ';
ptr = ptr->next;
}
cout << endl << "reverse the list a\n";
list.Reverse(list.first);
list.PrintList();
}
链表反转参考视频
LeetCode力扣刷题 | 剑指Offer 24. 反转链表_哔哩哔哩_bilibili [小姐姐声音很温柔doge]
一分钟教你链表反转_哔哩哔哩_bilibili [这个动画模拟比较贴合代码框的函数]
//谁知道我当时居然还去断点debug把每个节点以及他们的next的地址抄下来去对比
原文出处:Jayden's Blog--数据结构--关于单链表小细节的一些补充
数据结构(C++)--学习单链表时发现的一些小坑的更多相关文章
- 数据结构学习--单链表(python)
概念 链表(linked_list)是物理存储单元上非连续的.非顺序的存储结构,数据元素的逻辑顺序 是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间) ,另一个是指向 ...
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
- PHP数据结构之实现单链表
学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- C++学习---单链表的构建及操作
#include <iostream> using namespace std; typedef struct LinkNode { int elem;//节点中的数据 struct Li ...
- 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)
单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...
- 数据结构-多级指针单链表(C语言)
偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...
- TZOJ 数据结构实验:单链表元素插入
描述 实现函数CreateHeader用于创建空链表,实现Insert函数并调用它完成带头节点链表的创建. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. void PrintLinkL ...
- 使用MyBatis框架时发现的一些小bug
在大配置MyBatis.xml中: 不能有空节点属性 ,否则启动服务器后点击登录没有反应. 异常问题: ause: java.sql.SQLException: Value '0000-00-00 ...
- 数据结构(java版)学习笔记(三)——线性表之单链表
单链表的优点: 长度不固定,可以任意增删. 单链表的缺点: 存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针). 要访问特定元素,只能从链表头开始,遍历到该元素 ...
随机推荐
- js推送网页到扩展屏上--谷歌浏览器
平时我们推送网页.打开窗口都是用的 window.open,但是谷歌却不支持这种方法,也不是不支持,是可以打开窗口,但是无法将窗口移动到扩展屏上. 后面经过百度,发现了一个支持谷歌推送网页到扩展屏的方 ...
- win7系统部署django项目
win7系统部署django项目,在Windows电脑上我使用的是 Apache + mod_wsgi 来部署的 # 背景 Python 3.8.3 Django 3.1.7 Apach ...
- HDC2021技术分论坛:鸿蒙智联平台——智能硬件伙伴的最佳拍档
作者:chengjie,鸿蒙智联生态服务平台运营经理 您在产品开发和运营过程中是否遇到过以下问题: 产品开发千头万绪,无从下手?产品上市后不能清晰地了解消费者的使用情况?用户的意见无法及时传递和答复, ...
- Locust、Jemter、Loadrunner三种工具的分布式压测
前言: 最近公司接了一个云上展会项目,合同里签订的是6w并发连接数和2w QPS的性能指标,还有监理单位,第三方评测单位. 唉,先吐槽一下,有了监理和评测,文档tmd一堆堆,严格按照软件开发来执行,写 ...
- HashMap面试必问的数据结构相关知识总结
1:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树.transient Node<K,V>[] t ...
- Vue3.0 框架搭建的后台管理模板
一个Vue3.0框架搭建的后台管理模板 开源vue3.0版本基于vue3.x+ant-design-vue构建的免费开源admin项目,star高达8.4K+ 支持电脑端.手机.平板等平台 底层使用e ...
- C内存操作API的实现原理
我们在编写C代码时,会使用两种类型的内存,一种是栈内存,另外一种是堆内存,其中栈内存的申请和释放是由编译器来隐式管理的,我们也称为自动内存,这种变量是最简单而且最常用的,然后就是堆内存,堆的申请和释放 ...
- ArcPy自动绘制大量地图并设置地图要素:Python
本文介绍基于Python语言中ArcPy模块,实现ArcMap自动批量出图,并对地图要素进行自定义批量设置的方法. 1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有通过Pyth ...
- WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等
在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 UI 线程互等.这是多 ...
- WPF 如何在静态资源定义字体大小
默认的 WPF 的字体大小的单位是像素,如果想要将字体大小使用 pt 点表示,写在 xaml 里面是直接添加 pt 后缀.但是此时如果在静态资源尝试定义的时候写上了 pt 将会在运行的时候提示无法转换 ...