首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我被困在如何在双向链表中使用C++中的人的名字和姓氏进行排序的算法

在双向链表中使用C++进行人名排序的算法可以采用冒泡排序或插入排序的方式实现。下面是一个示例的排序算法:

代码语言:txt
复制
#include <iostream>
#include <string>
using namespace std;

// 双向链表节点定义
struct Node {
    string firstName;
    string lastName;
    Node* prev;
    Node* next;
};

// 在双向链表中插入节点
void insertNode(Node** head, string firstName, string lastName) {
    Node* newNode = new Node();
    newNode->firstName = firstName;
    newNode->lastName = lastName;
    newNode->prev = nullptr;
    newNode->next = nullptr;

    if (*head == nullptr) {
        *head = newNode;
    } else {
        Node* current = *head;
        while (current->next != nullptr) {
            current = current->next;
        }
        current->next = newNode;
        newNode->prev = current;
    }
}

// 交换两个节点的数据
void swapNodes(Node* a, Node* b) {
    string tempFirstName = a->firstName;
    string tempLastName = a->lastName;
    a->firstName = b->firstName;
    a->lastName = b->lastName;
    b->firstName = tempFirstName;
    b->lastName = tempLastName;
}

// 使用冒泡排序对双向链表进行排序
void bubbleSort(Node* head) {
    if (head == nullptr || head->next == nullptr) {
        return;
    }

    bool swapped;
    Node* current;
    Node* last = nullptr;

    do {
        swapped = false;
        current = head;

        while (current->next != last) {
            if (current->firstName > current->next->firstName) {
                swapNodes(current, current->next);
                swapped = true;
            } else if (current->firstName == current->next->firstName && current->lastName > current->next->lastName) {
                swapNodes(current, current->next);
                swapped = true;
            }
            current = current->next;
        }
        last = current;
    } while (swapped);
}

// 打印双向链表
void printList(Node* node) {
    while (node != nullptr) {
        cout << node->firstName << " " << node->lastName << endl;
        node = node->next;
    }
}

int main() {
    Node* head = nullptr;

    // 插入节点
    insertNode(&head, "John", "Doe");
    insertNode(&head, "Alice", "Smith");
    insertNode(&head, "Bob", "Johnson");
    insertNode(&head, "Charlie", "Brown");

    // 打印排序前的链表
    cout << "Before sorting:" << endl;
    printList(head);

    // 使用冒泡排序对链表进行排序
    bubbleSort(head);

    // 打印排序后的链表
    cout << "After sorting:" << endl;
    printList(head);

    return 0;
}

这个算法使用冒泡排序对双向链表中的节点按照人名进行排序,首先定义了双向链表节点的结构体,包含了名字和姓氏的字符串以及前后指针。然后通过insertNode函数向链表中插入节点。接下来,使用bubbleSort函数对链表进行排序,通过比较节点的名字和姓氏来确定节点的顺序。最后,使用printList函数打印排序前后的链表。

这个算法的时间复杂度为O(n^2),其中n是链表中节点的数量。在实际应用中,可以根据具体需求选择更高效的排序算法,如快速排序或归并排序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

程序员必备50道数据结构算法面试题

编码面试主要包括数据结构基于算法问题,以及一些诸如如何在使用临时变量情况下交换两个整数这样逻辑问题? 认为将编程面试问题划分到不同主题区域是很有帮助。...在面试中经常看到主题区域是数组、链表、字符串、二叉树,以及源于算法问题(例如字符串算法排序算法 quicksort 或基数排序,以及其他杂项),这就是你能在这篇文章中找到主要内容。...4、不使用递归,怎样反转单个链表? 5、在未排序链表,怎样移除重复节点? 6、怎样找出单个链表长度? 7、从单个链表结尾处,怎样找出链表第三个节点? 8、怎样使用栈计算两个链表?...4、如何在给定二叉树上实现序遍历? 5、不使用递归情况下如何使用序遍历输出给定二叉树所有节点? 6、如何实现后序遍历算法? 7、如何不使用递归实现二叉树后续遍历?...编程面试问题之杂项 除了基于数据结构问题之外,大多数编程工作面试还会询问算法、设计、位操作和基于逻辑常规问题,将在本节对其进行介绍。

3.2K11

程序员必备50道数据结构算法面试题

编码面试主要包括数据结构基于算法问题,以及一些诸如如何在使用临时变量情况下交换两个整数这样逻辑问题? 认为将编程面试问题划分到不同主题区域是很有帮助。...在面试中经常看到主题区域是数组、链表、字符串、二叉树,以及源于算法问题(例如字符串算法排序算法 quicksort 或基数排序,以及其他杂项),这就是你能在这篇文章中找到主要内容。...4、不使用递归,怎样反转单个链表? 5、在未排序链表,怎样移除重复节点? 6、怎样找出单个链表长度? 7、从单个链表结尾处,怎样找出链表第三个节点? 8、怎样使用栈计算两个链表?...4、如何在给定二叉树上实现序遍历? 5、不使用递归情况下如何使用序遍历输出给定二叉树所有节点? 6、如何实现后序遍历算法? 7、如何不使用递归实现二叉树后续遍历?...编程面试问题之杂项 除了基于数据结构问题之外,大多数编程工作面试还会询问算法、设计、位操作和基于逻辑常规问题,将在本节对其进行介绍。

4.2K20

字节算法大佬进阶专属算法笔记:GitHub标星97k+

对于那些知道C++而不熟悉Java程序员,本章对这两种语言主要差别进行了描述。 数组 第⒉章“数组”。集中讨论数组。这里面包含有两层意思:如何使用类来对数据存储结构进行封装接口。...栈队列 第4章“栈队列”涉及到三种可以认为是抽象数据类型(ADT)数据结构:栈、队优先级队列。这些结构在本书中大量重复出现,是许多算法基础。...每一种结构都有一个相应专题applet.ADT概念也会在本章讨论。 链表 第5章“链表”介绍了链表双向链表双端链表。...本章还解释了Java中被称作“无痛指针”使用,并用一个专题applet演示了链表插入、查找删除是如何进行。 递归 第6章“递归”探索了递归知识,这是书中仅有的非数据结构几章之一。...图与带权图 第13章“图”第14章“带权图”处理图相关问题,前者处理未加权图简单地查找算法,后者处理未加权图更加复杂算法最小生成树最短路径。

54520

与机器学习算法相关数据结构

在需要无限扩展数组情况下,可以使用可扩展数组,C++标准模板库(STL)向量类。Matlab常规数组具有类似的可扩展性,可扩展数组是整个Python语言基础。...左子节点中值始终小于父节点中值,而父节点中值又小于右子节点中值。因此,二叉树数据自动排序。插入访问在O(log n)平均有效。与链表一样,它们很容易转换为数组,这是树排序基础。...通常,顶部最高排序值是从堆中提取,以便对列表进行排序。与树不同,大多数堆只是存储在数组,元素之间关系仅是隐式。 堆叠 堆栈定义为“先进后出”,一个元素推到堆栈顶部,覆盖前一个元素。...3乘3等式: image.png 结论 在所做大部分工作使用了很多基本固定长度数组。使用复杂数据结构,使程序在运行方式与外部世界接口方面更加流畅,也更方便用户使用。...真正复杂的人工智能应用程序可能会使用定向无向图等事物,这些图实际上只是树链表概括。如果你无法应对后者,你将如何建造像前者一样东西?

2.4K30

腾讯牛逼,连环追问我基础细节!

空间固定:数组大小在创建时就需要确定,并且不能轻易更改。 空间利用率低:对于可变大小列表,使用数组会造成内存浪费。 链表: 分散存储:链表节点在内存可以分散存储。...双向循环链表(Doubly Circular Linked List):双向循环链表双向链表循环链表结合体,它头节点尾节点相互连接,形成一个环形结构。...双向循环链表:例如双向循环链表双向链表等。 图树等数据结构:例如,在图邻接表,可以使用双向链表来表示节点之间关系;在树子树,可以使用双向链表来表示节点兄弟关系。...双向链表索引修改方便,尤其适合多次插入删除操作场景,因此双向链表索引在部分数据库中被使用。...Vue.js2.x版本是最常用。但是最近Vue2已经停止维护了。所以Vue 3.x也开始越来越多的人使用

17010

数据结构 | 每日一练(72)

1.设民航公司有一个自动预订飞机票系统,该系统中有一张用双重链表乘客表,表结点按乘客 姓氏字母序相链。例如,下面是张某个时刻乘客表。...[题目分析] 本题所用数据结构是静态双向链表,其结构定义为: typedef struct node {char data[maxsize];∥用户姓名,maxsize是可能达到用户名大长度...}unode; unode user[max];∥max是可能达到多客户数。 设av是可用数组空间小下标,当有客户要订票时,将其姓名写入该单元data域,然后在静态链表 查找其插入位置。...void Insert(unode user[max],int av)∥user是静态双向链表,表示飞机票订票系统,元素包含data、LlinkRlink三个域,结点按来客姓名排序。...由于空间使用无优先级,故可将退票释放空间作为下个 可利用空间,链入可利用空间表

6353229

开发成长之路(6)-- C++从入门到开发(C++知名库:STL入门·容器(一))

为了建立数据结构与算法一套标准,降低其间耦合关系,以及提升各自交互性、弹性、独立性,C++社群诞生了STL. STL是一个开源项目,所以有很多个版本。...---- STL可不止有容器 对于大部分接触过STL的人来说,对于STL印象应该是极好,不过大部分人可能也是简单将容器STL全部画起了等号,最多再加上算法,毕竟我们使用STL常用到也就那两套头文件...容器 各种数据结构,Vector、List、Map,用于存放数据。 算法 各种常见算法排序、增删查等。从实现来看,STL算法属于泛型函数。...list迭代器vector不同,它要求更高一些。因为链表使用存储空间往往是零零散散,所以list迭代器必须有能力在杂乱存储空间中快速跳转。...SGI list不仅仅是一个双向链表,还是个环状双向链表,所以它只需要一个指针,便可以完整表现链表

31710

三十分钟掌握STL

3)           算法是用来操作容器数据模板函数。例如,STL用sort()来对一个vector数据进行排序,用find()来搜索一个list对象。...这些类用于创建函数对象,对容器数据进行各种各样操作。下面的几节解释如何使用函数函数对象。 函数断言 经常需要对容器数据进行用户自定义操作。...由于它们是模板,所以能够用于任何类型,包括C/C++固有的数据类型,long。有些函数对象从名字中就可以看出它用途,plus()multiplies()。...尽管有时候使用标准C函数确实方便(使用sprintf()进行格式化输出)。但是C函数不使用异常机制来报告错误,也不适合处理新数据类型。...STL最主要两个特点:数据结构算法分离,非面向对象本质。访问对象是通过象指针一样迭代器实现;容器是象链表,矢量之类数据结构,并按模板方式提供;算法是函数模板,用于操作容器数据。

2.1K80

【数据结构与算法】详解什么是双向链表,并用代码手动实现一个双向链表

上一篇文章跳转链接——【数据结构与算法】详解什么是链表,并用代码手动实现一个链表结构 本文就来详细讲解一下双向链表概念以及如何实现一个双向链表。 ?...这一列座位就相当于一个 双向链表。 假如有一天,老师还没记住每个学生名字,于是就问:这一列第三个人叫什么名字?...;属性 tail 表示双向链表最后一个元素 (2)创建内部构造函数 双向链表每一个元素都有三个属性,即prev 、item next,分别表示该元素前一个元素是谁 、存储着该元素该元素后一个元素是谁...五、总结 双向链表讲解就到这里了,希望大家对双向链表有了更深一层理解。下一篇文章将讲解一下哈希表。...大家可以关注,之后还会一直更新别的数据结构与算法文章来供大家学习,并且我会把这些文章放到【数据结构与算法】这个专栏里,供大家学习使用

58020

开发成长之路(15)-- 数据结构:编程基石

但是链表失去了数组随机读取优点,同时链表由于增加了结点指针域,空间开销比较大。 链表有很多种不同类型:单向链表双向链表以及循环链表。...关于链表实现代码可以移步:为实习准备数据结构(2)-- 详尽链表篇 ---- 栈 栈(stack)又名堆栈,它是一种运算受限线性表。限定仅在表尾进行插入删除操作线性表。...由于每一棵红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上查找算法,在查找过程不需要颜色信息。 红黑树是每个结点都带有颜色属性二叉查找树,颜色或红色或黑色。...因此在一些热门项目里用来替代平衡树, redis, leveldb 等。 跳表是一个随机化数据结构,实质就是一种可以进行二分查找有序链表。...而当使用哈希表进行查询时候,就是再次使用哈希函数将key转换为对应数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组定位性能进行数据定位。

70730

数据结构-散列表(下)

LRU 缓存淘汰算法链表那一节提到,借助散列表,我们可以把 LRU 缓存淘汰算法时间复杂度降低为 O(1)。...前驱后继指针是为了将结点串在双向链表,hnext 指针是为了将结点串在散列表拉链。 Redis 有序集合 在跳表那一节,讲到有序集合操作时,稍微做了些简化。...解答开篇 & 内容小结 弄懂刚刚这三个例子,开篇问题也就不言而喻了。这里总结一下,为什么散列表链表经常一块使用?...因为散列表是动态数据结构,不停地有数据插入、删除,所以每当我们希望按顺序遍历散列表数据时候,都需要先排序,那效率势必会很低。为了解决这个问题,我们将散列表链表(或者跳表)结合在一起使用。...、 课后思考 今天讲几个散列表链表结合使用例子里,我们用都是双向链表。如果把双向链表改成单链表,还能否正常工作呢?为什么呢?

52720

三十分钟掌握STL

3)           算法是用来操作容器数据模板函数。例如,STL用sort()来对一个vector数据进行排序,用find()来搜索一个list对象。...这些类用于创建函数对象,对容器数据进行各种各样操作。下面的几节解释如何使用函数函数对象。 函数断言 经常需要对容器数据进行用户自定义操作。...由于它们是模板,所以能够用于任何类型,包括C/C++固有的数据类型,long。有些函数对象从名字中就可以看出它用途,plus()multiplies()。...尽管有时候使用标准C函数确实方便(使用sprintf()进行格式化输出)。但是C函数不使用异常机制来报告错误,也不适合处理新数据类型。...STL最主要两个特点:数据结构算法分离,非面向对象本质。访问对象是通过象指针一样迭代器实现;容器是象链表,矢量之类数据结构,并按模板方式提供;算法是函数模板,用于操作容器数据。

1.2K40

从“成都-go-戒炸鸡”面试题开始说起

如果类B类C同时有一个成员变了m,m如何在D对象内存地址上分布?是否会相互覆盖?...还有一些经典问题也经常被问到,两个链表如何判断有环(在2017年面试饿了么二面、上海黄金交易所一面问过)。...当时面试官时先问链表,接着问哈希冲突解决方案,后来让写一个哈希插入算法,这里需要注意是,你算法插入元素一定要是通用元素,所以对于 C++ 或者 Java 语言,一定要使用模板这一类参数作为哈希插入算法对象...然后,就是哈希表多个元素冲突时,某个位置元素使用链表往后穿成一串方案。...技术比重与薪资 这里根据我自己招人经验来谈一谈技术水平与薪资,就上面的面试题来看: 第一层次:如果面试者能答出上面面试题中C++基础问题算法与数据结构题目( C++ 函数与hash冲突解决、innodb

1.1K30

排序算法(1)---基本概念

排序与我们日常生活息息相关,比如,我们要从电话簿中找到某个联系人首先会按照姓氏排序、买火车票会按照出发时间、买东西会按照销量排序、查找文件会按照最近修改时间排序等等。...在程序设计排序也是最基本算法,在一般数据处理或分析,首先就需要对数据进行排序排序基本概念 排序,其实就是让指定记录,使之按关键字递增(或递减)次序排列起来。...2.待排文件常用存储方式 (1) 以顺序表作为存储结构 排序过程:直接对记录进行物理移动。 (2) 以链表作为存储结构 排序过程:无须移动记录,仅需修改指针。...(3) 用顺序方式存储待排序记录,但同时建立一个辅助表(包括关键字指向记录位置指针组成索引表) 排序过程:只需对辅助表表目进行物理重排。...讨论不同算法效率高低以及讲讲不同算法使用场景。

50520

《逆袭进大厂》第四弹之C++重头戏STL30问30答

想开辟大块内存就会失败;2.若自由链表上挂很多内存块没有使用,当前进程又占着内存不释放,这时别的进程在堆上申请不到空间,也不可以使用当前进程空闲内存,由此就会引发多种问题。...只能通过指针访问数据,所以list随机存取非常没有效率,时间复杂度为o(n);但由于链表特点,能高效地进行插入删除。非连续存储结构:list是一个双链表结构,支持对链表双向遍历。...但对数据插入删除操作等都比较方便,改变指针指向即可。list是单向,vector是双向。vector迭代器在使用后就失效了,而list迭代器在使用之后还可以继续使用。...195、如何在共享内存上使用stl标准库?...由于array不能动态改变空间大小,用vector代替array是一个不错选择。 那heap算法有哪些?常见有的插入、弹出、排序构造算法,下面一一进行描述。

1.5K20

面银行软开,最自信了!!

Collections类方法包括排序、查找、替换、反转、随机化等等。这些方法可以对实现了Collection接口集合进行操作,ListSet。...LinkedList本质是一个双向链表,与ArrayList相比,,其插入删除速度更快,但随机访问速度更慢。 Set不允许存在重复元素,与List不同,set元素是无序。...LinkedHashSet继承自HashSet,通过LinkedHashMap实现,使用双向链表维护元素插入顺序。...另外,LinkedHashMap 在上面结构基础上,增加了一条双向链表,使得上面的结构可以保持键值对插入顺序。同时通过对链表进行相应操作,实现了访问顺序相关逻辑。...LinkedList使用链表实现,通过节点之间指针进行元素访问操作。

17110

C++标准库:使用STL提供数据结构算法

C++标准库:使用STL提供数据结构算法C++标准模板库(Standard Template Library,STL)是C++标准库一个重要组成部分。...算法(Algorithms)STL还提供了一系列强大算法,用于处理容器数据。常用算法有:排序算法(Sorting):sort(),用于对容器元素进行排序。...结论STL提供了丰富数据结构算法,大大简化编程工作。使用STL容器算法,更加高效地进行数据存储、操作和处理。熟练掌握STL使用方法,对于C++编程来说是非常重要。...,使用STL向量容器排序算法,存储管理图书信息。...使用std::sort()算法根据图书标题对容器图书进行排序,输出排序图书列表。 这个示例代码用作图书馆管理系统一部分,方便图书存储、检索排序

31620

【图解数据结构与算法】LRU缓存淘汰算法面试时到底该怎么写

链表实现LRU缓存淘汰算法时间复杂度是O(n),当时也提到了,通过散列表可以将这个时间复杂度降低到O(1)。 Redis有序集合是使用跳表来实现,跳表可以看作一种改进版链表。...因为通过链表法解决哈希冲突,所以每个结点在两条链双向链表 前驱后继指针是为了将结点串在双向链表 散列表拉链 hnext指针是为了将结点串在散列表拉链 查找 散列表查找数据时间复杂度接近...通过散列表双向链表组合使用,实现了一个高效、支持LRU缓存淘汰算法缓存系统原型。 Redis有序集合 在有序集合,每个成员对象有两个重要属性,key(键值)score(分值)。...LinkedHashMap“Linked”实际上是指的是双向链表,并非指用链表法解决哈希冲突。 为什么hash表链表经常一块使用?...因为散列表是动态数据结构,不停地有数据插入、删除,所以每当我们希望按顺序遍历散列表数据时候,都需要先排序,那效率势必会很低。为了解决这个问题,我们将散列表链表(或者跳表)结合在一起使用

44020

深度思考:拥有多年开发经验你为何会被多家大厂拒绝?安卓开发还有什么能学习

Java中有几种引用关系,它们区别是什么? GC收集算法有哪些?它们特点是什么? 如何判断一个对象是否回收,有哪些GC算法,实际虚拟机使用最多是什么GC算法?(美团) Jvm内存 结构说一下。...算法和数据结构 主要知识点: 1.数组,链表,队列,栈,图 2.不会直接问你,会让你找到用处,比如Activity任务栈 3.算法 4.基本几种排序复杂度思路 5.几种查找复杂度思路 6.串处理...腾讯 如何在给定整数数组中找到重复数字? 小米 如何在排序整数数组中找到最大值最小值? 字节跳动 在Java如何从给定数组删除多重复制? 百度 常用数据结构有哪些?...B站 一个数组插入删除查找链表效率对比?如果一个数组要反复插入删除怎么优化降低时间复杂度? 腾讯 arrayList底层原理 滴滴 字节跳动 如何在一次遍历中找到单个链表中值?...中国平安 如何证明给定链表是否包含循环?如何找到循环头节点? 优酷 两个有交叉链表,求交叉点 华为如何得到单链表长度? 360 如何在使用递归情况下逆转单链表?

91700
领券