IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> (2021.10.10)C++ | 头插法和尾插法链表的建立以及输出 -> 正文阅读

[数据结构与算法](2021.10.10)C++ | 头插法和尾插法链表的建立以及输出

致敬卷风—一位伟大的战士

? ? ? ? 首先用粗俗的语言描述一下链表是什么以及他的作用:

? ? ? ? 链表在某些作用上大致等同于一个动态的数组,尽管链表的编码和管理比数组更复杂,但它们有一些明显的优势。首先,链表可以容易地扩大或缩小。实际上,程序员并不需要知道链表中有多少个结点。它们只是根据需要在内存中创建。这样一来使得内存的利用率大大提高了。当然,使用动态的数组模板还有很多,这里只是对比一下链表与数组的不同。

数组的特点

  • 在内存中,数组是一块连续的区域。
  • 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。
  • 插入数据和删除数据效率低。
  • 随机读取的效率很高。

?链表的特点

  • 内存不要求连续
  • 拓展方便,随意增加大小
  • 随机访问效率低,但是目前而言不需要考虑这一点

? ??

稍微介绍一下几个链表的创建方法:

1.最基本的定义

#include<bits/stdc++.h>
using namespace std;

// 定义一个结构体 就是单个节点  这里是储存包含数据的一个结构 value 
//同时还要有一个指向另一个相同类型节点的指针

struct List
{
	double value;
	List* next;
};


int main()
{
	List* head = nullptr;//初始化
	//不能用list 小写list是容器
	//nullptr是用来代替NULL的宏定义的 一般两者等价

	head = new List;//分配一个新的节点

	head->value = 1;//储存值进入value
	head->next = nullptr;//表示链表的结尾
	List * two = new List;
	two->value = 2;
	two->next = nullptr;
	//这里吧nullptr变成了two指向nest的结果,所以第二个节点现在变成了链表的结尾
	head->next = two;//现在第一个节点的next指向的是two

	cout << head->value<<endl;
	cout << two->value;
	//也可以写成
	//head->next-value;
	
	return 0;

}

2.特别一点的结构内定义函数

(这个方法使得在创建链表的时候变得更加简洁)

#include<bits/stdc++.h>
using namespace std;
struct ListNode
{
    double value;
    ListNode* next;
    //构造函数

    ListNode(double value1, ListNode* next1 = nullptr)
    {
        value = value1;
        next = next1;
    }
};
int main()
{
  
    ListNode* three = new ListNode(5);
    //通过仅指定其 value 部分,而后继指针则默认为 nullptr

    ListNode* secondPtr = new ListNode(13.5,three);
    //通过指定 value 部分和一个指向链表下一个结点的指针。

    ListNode* head = new ListNode(12.5, secondPtr);
    //领悟这个创建列表的方法 注意是倒着写

    cout << head->value<<endl;
    cout<<secondPtr->value<<endl;
    cout << three->value;

}

其次是一个经典的头插法链表

可以用来大炮打小鸡解决倒序问题

#include<bits/stdc++.h>
using namespace std;
struct ListNode
{
    double value;
    ListNode* next;
    //构造函数

    ListNode(double value1, ListNode* next1 = nullptr)
    {
        value = value1;
        next = next1;
    }
};
 int main()
{
  ListNode *one = nullptr;
    double a[5];

    for (int i = 0; i < 5; i++)
    {
        cin >> a[i];
        one = new ListNode(a[i],one);
    
    }

    ListNode* ntr = one;
    while (ntr != nullptr)
    {
        cout << ntr->value;
         ntr=ntr->next;
    }
}

尾插法

#include<bits/stdc++.h>
using namespace std;
struct List
{
	int data;
	List* next;
};
int main()
{
	List* head = new List;//新节点
	int a[5];
	List* rear = head;//开一个尾指针 一直指向尾巴
	for (int i = 0; i < 5; i++)
	{
		cin >> a[i];
		List* one = new List;
		one->data = a[i];
		rear->next = one;//让尾指针指向one
		rear = one;
		/*rear 本来在 one前面,但现在rear在one上,
		因为是赋地址值,原来rear并没有消失,下个循环one = new List,
		就又重新创建一个节点,反复执行*/
	}
	rear->next = nullptr;

	List* h = head->next;
	//头节点没数据 所以h直接指向头节点的next
	while (h != nullptr)
	{
		cout << h->data;
		h = h->next;
	}

}

END

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:45:19  更:2021-10-11 17:47:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:21:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码