首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C中链接列表合并排序实现中丢失的节点

C中链接列表合并排序实现中丢失的节点
EN

Stack Overflow用户
提问于 2017-12-13 05:13:08
回答 3查看 267关注 0票数 1

此实现用于按升序字母顺序排列字符串。我已经包含了负责划分节点的函数。head是链接列表的首字母。

我认为mergeSort函数的工作原理是将列表划分开来。见以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Head: lady apple stone red queen
fast:
slow: stone
front: lady apple stone
back: red queen

Head: lady apple stone
fast:
slow: apple
front: lady apple
back: stone

Head: lady apple
fast: 
slow: lady
front: lady
back: apple

Head: red queen
fast:
slow: red
front: red
back: queen

它清楚地显示了初始列表,lady apple stone red queen被划分为各个节点,所有这些都得到了考虑。

当节点被比较并合并到新的列表中时,问题就出现了。例如:最初,将ladyapple进行比较。它们被合并到列表中:apple, lady。那么这个列表应该与stone合并。但是,首先,将ladystone进行比较,而不是将applestone进行比较。然后生成列表:lady, stone (apple留在后面,而不是在比较中使用)。应该发生的是,将applestone进行比较,然后将ladystone进行比较,然后将条目排序并相应地合并到:apple, lady, stone中。

实际的最终输出是:lady, red, stone。很明显,applequeen在某个地方迷路了。我不知道什么是违规代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void mergeSort(Node *head) {

    Node *front = NULL, *back = NULL, *fast, *slow;

    if(head == NULL || head->next == NULL)
        return;

    ...

    mergeSort(front);
    mergeSort(back);

    head = mergeLists(front, back);

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-13 05:58:30

你的代码几乎是完美的。您正在合并两个列表并将其返回给head。但是,您不能将确切的head返回到以前的mergeSort调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Node* mergeSort(Node *head) {

    Node *front = NULL, *back = NULL, *fast, *slow;

    if(head == NULL || head->next == NULL)
        return head; // return head
    ...

    front = mergeSort(front); // save it to front
    back = mergeSort(back); // save it to back

    head = mergeLists(front, back); // save it to head
    return head; // return head
}

在调用mergeSort的主函数中,使用head = mergeSort(head)。代码现在应该起作用了。

票数 2
EN

Stack Overflow用户

发布于 2017-12-13 05:29:03

一个更容易(而且可能更有效,尤其是对于大列表)的方法是首先将链接列表转换为数组。请考虑以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char ** arr;
int size=getLinkedListSize(head);
arr = malloc(sizeof(*arr)*size);
linkedList2Array(head, arr);
mergeSort(arr, size);
array2LinkedList(arr, size, head);

注意,我使用的是char **类型。点(合)是指向链接列表中的数据。如果数据比简单的字符或ints更复杂,则可以避免不必要的数据复制。

这是更容易写,即使它有一些样板,它不影响任何事情。函数(您必须编写) getLinkedListSizelinkedList2Arrayarray2LinkedList都可以具有O(n)的复杂性,而mergeSort无论做什么都是O(n*log )。此外,要考虑到此方法对缓存更友好。

唯一的缺点是,它需要更多的内存,但不是太多。数组的最大大小将与列表相同。

我提到的三个函数编写起来很简单。下面是其中的两个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int getLinkedListSize(Node * head)
{
    int ret=0;
    while(head) {
        ret++;
        head=head->next;
    }
    return ret;
}

void linkedList2Array(Node * head, char ** arr)
{
    int index=0;
    while(head) {
        arr[index++]=&head->data;
        head=head->next;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2017-12-13 07:12:53

不需要慢/快方法(Floyds algoritm)。它也是计数器-effective:排序将总是采取N个日志(N)操作,即使是在排序列表上。

您可以利用现有的订单,只需删除无序元素,并保留其余的元素。然后(递归)对无序部分进行排序,并合并这两个部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct list {
        struct list *next;
        char* data;
        };

#define COMPARE(a,b) strcmp((a),(b))

struct list *splitmerge(struct list *org)
{
struct list *rest ,*this, **pp;

if(!org|| !org->next) return org;

        /* Split off out-of-order nodes*/
rest = NULL;
for (this = org; this;  ){
        struct list* next;
        if(!this->next)break;

        next = this->next;
        if(COMPARE( this->data,  next->data) <= 0) {
                this= next;continue;
                }
                /* Cut next out of the chain */
        this->next = next->next;
        next->next = rest;
        rest = next;
        }

        /* At this point, org is guaranteed to be sorted
        ** rest is not.
         */


        /* Order the trash */
rest = splitmerge(rest);


        /* Merge with the trash */
this=NULL;
for(pp = &this; org && rest; pp = &(*pp)->next ) {
        if(COMPARE( org->data, rest->data) <= 0) {
                *pp = org; org=org->next;
                }
        else    {
                *pp = rest; rest=rest->next;
                }
        }
*pp = (org) ? org : rest;

return this;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47793914

复制
相关文章
WordPress 技巧:给管理员显示 PHP 错误
在 WordPress 开发的时候,debug 是最麻烦的一件事情,下面这段代码可以让管理员立刻看到 PHP 错误:
Denis
2023/04/15
3940
WordPress后台首页显示RSS错误的解决办法
这两天,麻烦不断,可能是因为我折腾的比较频繁吧!老是出现奇奇怪怪的问题,而且百度、GG 居然搜不到有用的解决办法!折腾了大半天,终于被我搞定,虽然还是很笨的方法,但至少解决了问题,就贴出来一下,希望对以后有同样问题的网友有所参考。 解决问题前,我忘记了截取错误图片,只好文字说明一下了: 就是进入 WP 后台首页(仪表盘),【Wordpress 新闻】下工具显示如下类似的报错信息: RSS 错误:WP HTTP Error: Operation timed out after 10000 millisecon
张戈
2018/03/23
1.7K0
点击显示错误
双折线点击一个,另一显示a b 错误.PNG 正确.PNG 隐藏一条线 tooltip: { // 气泡 trigger: "axis"
用户4344670
2019/08/28
1.2K0
点击显示错误
wordpress显示作者信息
作者:matrix 被围观: 2,932 次 发布时间:2013-06-22 分类:Wordpress 兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
5880
wordpress显示作者信息
Wordpress显示所有文章
使用下面loop只能展示当前分类下的文章 <?php if(have_posts()): ?> <?php while(have_posts()):the_
切图仔
2022/09/14
7370
添加wordpress后台验证功能
作者:matrix 被围观: 1,931 次 发布时间:2013-11-04 分类:Wordpress 兼容并蓄 | 12 条评论 »
HHTjim 部落格
2022/09/26
4330
WordPress 显示相对日期
相对日期,文章或者评论发表日期以“发表于1小时前”,这种形式显示,相对日期会给人一种发布的内容条目距现在很近的感觉,所以很多新闻类的网站和社交媒体网站都喜欢用这种相对日期。
星哥玩云
2022/08/13
9130
WordPress 显示相对日期
spring之如何将验证错误信息显示在相应界面
在后台获取到验证错误之后可以这么在前端中进行显示:(利用springmvc验证的,而不是自己定义的)
西西嘛呦
2020/08/26
6390
spring之如何将验证错误信息显示在相应界面
「R」显示英文错误
中文使用 R 经常看到各种乱码文字,让人看不懂意思,特别是在 Windows 系统上。
王诗翔呀
2020/07/02
1.8K0
WordPress添加FPS帧率显示
如果经常打游戏的话,对于FPS帧率波动变化是非常在意的一件事,在游戏的世界里帧率越低就越容易卡段,其实我们也可以尝试让自己的网站显示FPS帧率,教程也是很简单,只需一段js代码即可实现我们的这个需求!今天就给朋友们分享一下如何在WordPress添加帧率显示的教程,请继续往下看!
若梦
2022/04/01
5490
WordPress添加FPS帧率显示
我们经常打游戏时非常的关注游戏里的帧率的变化,游戏帧越低就越容易卡段,那么我们是否也可以给网站弄个FPS帧率显示呢?毋庸置疑当然可以啦,如果注意观察我网站的左上角,就会发现有xxFPS这几个字不断的发生变化,没错,它就是今天的主角FPS。其实非常的简单,只需一句js代码即可实现!今天就给大家分享一下WordPress添加帧率显示的教程,请往下看!
小狐狸说事
2022/11/17
5250
WordPress添加FPS帧率显示
WordPress评论添加验证码
WordPress在互联网上面有34%的使用率,从业余爱好的博客到新闻网站很多都是使用的WordPress源码,因为使用的人比较多,所以很多的人开发了一些发送垃圾评论的软件,自动化批量的发送垃圾评论,所以在安装时WordPress自带有一个Akismet Anti-Spam的插件,但是还是会有一些漏网之鱼,一般可以开启评论审核不让垃圾评论第一时间显示,但这并不能阻断垃圾评论的产生。所以我们需要验证码防止机器人评论广告信息。
爱游博客
2019/08/07
1.4K0
WordPress评论添加验证码
WordPress 主题教程 #8:验证 XHTML
验证 XHTML 是从零开始创建 WordPress 主题系列教程的第八篇。在开始学习 CSS 并修改 style.css 文件之前,我们需要学习如何验证代码,简单说,验证(Validate/Validating/Validation)就是检查下代码有没有错误,而验证又分为:XHTML Validator 和 CSS Validator,这篇我们学到 XHTML 验证器。
Denis
2023/04/15
4180
WordPress IP验证不当漏洞修复
修复方案:找到/wp-includes/http.php这个文件,在文件的465行附近找到:
iDavid丶
2018/06/25
1.5K3
WordPress IP验证不当漏洞修复
出现“内部错误,无法显示”
This page contains the following errors: error on line 2 at column 6: XML declaration allowed only at the start of the document Below is a rendering of the page up to the first error. 提示信息是头部有错误,我登录后台查看我修改过的页面,然后找到home.php我看了十几分钟没有发现那里有错误~~ 莫非头部不能有空格? 去掉试试
苦咖啡
2018/05/07
3.2K0
linux python 中文显示错误
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 20-25: ordinal not in range(128)
py3study
2020/01/07
5.4K0
wordpress接入腾讯验证码的人机验证方法
网站安全一直是人们最关心的话题。人机验证的使用可以有效地提高网站的安全性,防止网站接口被机器程序窃取。如刷短信、刷邮件、刷评论等。
Hello-1
2022/08/30
1.3K0
wordpress接入腾讯验证码的人机验证方法
thinkphp验证码不显示
分析了半天,用下面的代码发现图片输出前已经输出了有3个字节字符,导致图片无法被正确识别
老高的技术博客
2022/12/27
1K0
WordPress底部显示页面加载时间
效果预览 方法 1.将以下代码加入到主题的functions.php中 //页面加载时间自动检测 function wp_page_speed() { date_default_tim
回忆大大
2021/08/09
1.7K0
WordPress底部显示页面加载时间
点击加载更多

相似问题

WordPress Caldera表单在验证时显示错误消息

10

如何显示wordpress设置api验证错误信息?

11

Wordpress the_content()验证错误

11

WordPress RSS提要验证错误

44

显示验证错误

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文