热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c++基础知识——STL之链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、什么是链表二、链表的分类顺序链表链表结构图2.逆序链表链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



文章目录

  • 前言
  • 一、什么是链表
  • 二、链表的分类
    • 顺序链表
      • 链表结构图
    • 2.逆序链表
  • 链表的库函数(模板函数)
      • STL之list的应用
  • 总结




前言

在c语言数据结构中链表作为一种很基础但是又重要的结构。在学生管理系统中就用到了链表,而在c++中,链表也是一种重要的存储结构,不过在c++中有很多库函数,可以减少我们的麻烦,下面就给你们介绍一下;



在这里插入图片描述

提示:以下是本篇文章正文内容,下面案例可供参考


一、什么是链表

链表是动态存储分配的数据结构。链表的每个结点都是一个结构体变量,包含数据域(存放数据本身)和指针域(存放下一个结点)的地址;
结构体可以定义为以下方式:
struct Node{
int data;
Node*next;
};


二、链表的分类


顺序链表

由多个结点组成的一条线性的数据结构;


链表结构图

在这里插入图片描述

代码如下(示例):

#include
using namespace std;
struct Node
{int data;Node* next;
};
//创建顺序链表
Node* creatNode(int n)
{Node* headnode = new Node;//申请动态空间;headnode->next = NULL;Node* p = headnode;while (n--){Node* q = new Node;cin >> q->data;q->next = p->next;p->next = q;p = q;//每次把头结点后移,重复上面操作;}return headnode;
}
//链表的打印;
void printList(Node* headnode)
{Node* pmove=headnode->next;while (pmove){printf("%5d", pmove->data);pmove = pmove->next;}
}
//调试函数;
int main(void)
{int n;Node *list;cin >> n;list = creatNode(n);printList(list);
}

在这里插入图片描述


2.逆序链表

其实说白了逆序链表就是先进入的结点向后走,后进的结点在前,然后遍历,就可以得到逆序链表;
在这里插入图片描述

代码如下(示例):

#include
#include
using namespace std;
struct Student
{int data;Student* next;
};
//构建链表;
Student* Init_headnode()
{Student* headnode = new Student;headnode->next = NULL;return headnode;
}
//链表的构建;
void creatList(Student* headnode, int n)
{assert(headnode != NULL);Student* p = headnode;while (n--){Student* newnode = new Student;cin >> newnode->data;newnode->next = p->next;p->next = newnode;}
}
//打印链表函数
void printList(Student* headnode)
{assert(headnode != NULL);Student* pmove = headnode->next;while (pmove){printf("%5d", pmove->data);pmove = pmove->next;}
}
//调试函数;
int main(void)
{Student* headnode= Init_headnode();int n;cin >> n;creatList(headnode, n);printList(headnode);
}

在这里插入图片描述
通过这两个例子,我们可以认识到链表,链表的操作还有很多,比如删除特定的值,或者特定位置插入,删除表头,清空链表,判空以及排序等一系列的操作方式,但是如果每个操作都定义一个函数,这样太过麻烦,那我们有没有什么模板来简化这些问题喃?这就是我们今天讲的STL(模板)之链表(list)
在这里插入图片描述


链表的库函数(模板函数)

在这里插入图片描述
在这里插入图片描述
代码演示:

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include//包含头文件,引用STL中的list模板
using namespace std;
list<int>createList(int n)//建立顺序链表
{list<int>myList;int t;for (int i &#61; 0; i < n; i&#43;&#43;){cin >> t;myList.push_back(t);//将t连接到链表的尾部;}return myList;
}
//输出链表;
void prtList(list<int>myList)
{list<int>::iterator it;//list::iterator类型迭代器;for (it &#61; myList.begin(); it !&#61; myList.end(); it&#43;&#43;)//注意&#xff0c;在STL模板中&#xff0c;迭代器没有小于号的重载&#xff0c;故只能用it&#xff01;&#61;myList.end&#xff08;&#xff09;来结束;{if (it !&#61; myList.begin())cout << " ";cout << *it; //此时it就相当于c语言中的一个结构体指针;}cout << endl;
}
//比较函数;降序排列;
bool cmp(int a, int b)
{return a >&#61; b;
}
//调试函数;
int main(void)
{int n;cin >> n;list<int>myList &#61; createList(n);prtList(myList);cout << myList.size() << endl;//获取链表的长度;myList.push_front(3);//在链表的头部位置加入3;myList.push_back(3);//在链表的尾部位置加入3;prtList(myList);myList.reverse();//链表的逆置;prtList(myList);//归并链表;myList.merge(myList,cmp);myList.sort(cmp);//按照降序排列;prtList(myList);
}

链表中的这些函数不用去背&#xff0c;一般在编译器上会有提示&#xff0c;不过要熟练掌握他的格式和用意。这些模板为我们解决一些问题减少了很多时间&#xff0c;方便&#xff0c;所以熟练掌握这些很重要;


STL之list的应用

#include
#include
using namespace std;
struct Node
{string name;int age;
};
//创建链表;
list<Node>creatListQueue(int n)
{list<Node>myList;Node t;for (int i &#61; 0; i < n; i&#43;&#43;){cin >> t.name >> t.age;myList.push_back(t);}return myList;
}
//打印函数;
void prtList(list<Node>myList)
{list<Node>::iterator it;for (it &#61; myList.begin(); it !&#61; myList.end(); it&#43;&#43;){if (it !&#61; myList.begin())cout << " ";cout << it->name << it->age;}cout << endl;
}
//排序函数;
bool cmp(Node a, Node b)
{if (a.age !&#61; b.age)return a.age > b.age;return a.name < b.name;
}
//调试函数;
int main(void)
{int n;cin >> n;list<Node>myList&#61;creatListQueue(n);prtList(myList);//对链表进行排序;myList.sort(cmp);prtList(myList);myList.reverse();//逆置链表;prtList(myList);Node t;cin >> t.name >> t.age;myList.insert(myList.begin(), t);prtList(myList);
}

总结

前面我们学习了STL之vector&#xff0c;仔细观察&#xff0c;这些模板之间都有很多相似之处&#xff0c;所以不需要去背这些代码&#xff0c;学会活学活用才最好&#xff0c;本节的list模板就讲到这里&#xff0c;其中有很多的模板函数在我们去实现代码的时候会有很大的帮助&#xff0c;尤其是一些常用的函数&#xff0c;上面我列举的函数都比较常用&#xff0c;需要熟练掌握;


推荐阅读
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
author-avatar
小白石
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有