数据结构_单链表-1.23

2024-01-24 18:36
文章标签 数据结构 单链 1.23

本文主要是介绍数据结构_单链表-1.23,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习内容

一. 1.19

移除一个元素,删掉重复元素

思路:采用两个下标,一个下标遍历数组,一个下标辨别特殊情况的发生,并将特殊情况的数据结果保存起来。
问题:我用的只有num[i], 其空间复杂度是O(N),满足题目要求,但是结果就是在oj里栈溢出了。可能它默认有时间复杂 度的限制。
解答:是内存出问题,因为你没有考虑数组的情况,要先判断输入为空的情况下才行。

C++简介

C++近似=C语言+面向对象+通用编程。

书里说学C++要忘掉写C的一些习惯(我C都不精通呢?还能学C++忘掉C?)
如果你没有学过C,就不用忘记(笑傲江湖的吸星大法散内功?)
书里还说,C++比C不是多学几个关键词那么简单,有很多其它的东西。
(之前我一直觉得C++是C的一种进阶,现在看来几乎可以看作两种不同的语言了)

二. 1.22

链表

链表是逻辑上连续的数据结构。为实现顺序表难以实现的功能而生。

1.顺序表优缺点

优点
1)可访问你想访问的位置(物理地址上的连续,简单的加减数字即可达到你所要的地址)
2)缓存命中率高(读数据先读缓存中的,缓存里有编译器要的数据就算命中,没有,则去内存里面取数据)
预加载:访问一个数据会把数据那一段都从内存放进缓存里,顺序表是连续的,有效数据存进缓存的概率就高。
缺点
1)复杂度摆在那,O(N),插入删除都要挪动整个数组。
2)指数增的扩容很容易就造成资源浪费(这算法没网络阻塞控制的转为加法增好,可具体算法也算顺序表的缺点?不敢苟同,我在超过一万的时候翻倍两万浪费了,下次遇到一万的时候,我加一千不行?我加一百不行?浪费微乎极微。)(虽然相比链表那种,确实是浪费了)

2.尝试先自己写的单链表增删

https://download.csdn.net/download/weixin_48278060/88771732

3.遇到的问题
1.如果确定第一个链表结点?

1)最开始的链表结构体中,我没定义长度len。我在开辟动态空间时,发现每次都会多开辟了一块空间,只要发现链表节点指向的下一个地址为NULL,就自动开辟一块空间(这里导致了一直多开了一个空间)
2)于是我想能不能用第一个链表的data值来确定?不行,如果data值本身就为0或者是你初始化的那个值呢?,之后我想能不能通过第一个链表的next值为NULL确定?还是行不通,因为你通过第一个链表next的值为NULL判断要在第一个链表输入数据,你的第二个链表空间怎么开辟(开辟第二个链表时,第一个链表的next也还是NULL)?
3)在链表结点加一给len搞定,len==1时,数据写在已有链表空间里,len>1,开辟新的空间。这也为之后的展示,提供了方便。

2.第一个链表的位置改变了,其长度len也需要跟着传过去

1)在对第一个链表操作时,比如加一个链表,这时就产生了一个新的首链表地址,这里我忘了讲原来链表中的len值传给这个新的首链表结点,在调试发现,len=8478788878类似这样的。
2)因为你新的首链表节点的len没有被初始化
3)总之,改变就把旧数据先传过来,别给丢了

3. 首链表的考虑情况不周

SListNode* SListPopFront(SListNode* pos)
{   assert(pos);SListNode* tmp = pos->next;//if (tmp == NULL);tmp->len = --pos->len;return tmp;
};

调试时,一直遇到写入权限不行啥的,在网上查了下,是因为出现空指针的情况。恍然大悟,pos->next要是第一个链表结点不就是NULL?空指针,就要加个判断,是不是弹出第一个。

三. 1.23的一半

与参考代码的差距

1.找尾可以不用长度len(固化思维了)
我的:
while (cur != NULL){store = cur;cur = cur->next;}
不用len找尾:
while (cur->next != NULL){cur = cur->next;}

1)之前写了cur!=NULL,默认把它模块化使用了,才导致后来想半天没想明白怎么确定第一个或最后一个链表。
2)直接cur->next!=NULL判断是否有下一个链表,有就走。

2.main()里面创建的是链表结点指针
我的:SListNode pos;SListInitial(&pos);
不用len:SListNode* pos=NULL;SListInitial(&pos);

需要用二级指针,传址才能修改。所以为什么不创建一个链表结点呢?
我能想到的是,指针就一个小变量,创建一个链表结点会固定一个内存空间?那我既然用了一个链表结点,我创建一个怎么了?你二级指针可以之后动态开辟内存,我这就固定开一个有区别吗?

3.pop用free()
我的:pos->len--;
不用len:free(*pphead);*pphead=NULL;

直接释放的好,内存不能泄露吧。大问题,大问题。一个链表结点不用就释放了。

4.malloc()没强制类型转换

我没转换为什么还能正常运行?看了别人文章,C环境下确实不用强制类型转换,单但C++要。
https://blog.csdn.net/qq_52959401/article/details/130218761

5.常加#pragma once

这篇关于数据结构_单链表-1.23的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640610

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Go 1.23中Timer无buffer的实现方式详解

《Go1.23中Timer无buffer的实现方式详解》在Go1.23中,Timer的实现通常是通过time包提供的time.Timer类型来实现的,本文主要介绍了Go1.23中Timer无buff... 目录Timer 的基本实现无缓冲区的实现自定义无缓冲 Timer 实现更复杂的 Timer 实现总结在

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

Go语言构建单链表

package mainimport "fmt"type ListNode struct {Val intNext *ListNode}func main() {list := []int{2,4,3}head := &ListNode{Val:list[0]}tail := head //需要头尾两个指针for i:=1;i<len(list);i++ {//方法一 数组直接构建链表tai

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre