吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 786|回复: 4
收起左侧

[求助] C 链表排序

[复制链接]
ing 发表于 2020-3-9 23:37
本帖最后由 ing 于 2020-3-11 21:00 编辑

当我让2个指针(p 和 指针integrate)建立关系后,p指针删除元素,integrate也会减少
捕获.PNG

现在,删除一个元素,发现2个指针的内容都减少了
捕获2.PNG


但是这里却不会,main 指针和 b1指针建立了关系
捕获.PNG

b1多次删去元素之后,发现只有会b1减少了元素
捕获2.PNG

___________________________________________________
问题由此引起
p->next = p->next->next;
改成 p = p->next 就不会出现这种情况


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define KeyType int
#define Block 2

typedef struct link
{
        KeyType data;
        struct link *next;
}Link;

typedef struct
{
        KeyType key;
        int start;
}newIndex[Block];

void initLink(int array[], int start, int length, Link **p)
{
        *p = (Link*)malloc(sizeof(Link));
        Link *temp = *p;

        //结束位置等于 总长度/分成的块数+起始位置
        int e = length/Block + start;
        for (size_t i = start; i < e; i++)
        {
                Link *a = (Link*)malloc(sizeof(Link));
                a->data = array[i];
                a->next = NULL;

                temp->next = a;
                temp = temp->next;
        }
}

void merge(Link **main, Link *b1, Link *b2)
{
        *main = b1;

        while (b1->next)
        {
                b1 = b1->next;
        }

        while (b2)
        {
                b1->next = b2->next;
                b1 = b1->next;
                b2 = b2->next;
        }
}

void swap(Link **integrate, int length)
{
        Link *p = *integrate;

        for (size_t i = 1; i < length; i++)
        {
                for (size_t j = 1; j < length; j++)
                {
                        if (p->next->data > p->next->next->data)
                        {
                                Link *temp = p->next;
                                p->next->data = p->next->next->data;
                                p->next->next->data = temp->data;
                        }
                        p->next = p->next->next;
                        p->next->next = p->next->next->next;
                        if (!p->next->next) break;
                }
        }
}

void main()
{
        int a[] = { 33, 42, 44, 38, 24, 48, 22, 12, 13,  
                                8, 9, 20, 60, 58, 74, 49, 86, 53 
                                };
        Link *a1, *a2;
        initLink(a, 0, 18, &a1);
        initLink(a, 9, 18, &a2);

        Link *integrate;
        merge(&integrate,a1,a2);

        swap(&integrate,18);

}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

atlas.吾爱破解 发表于 2020-3-10 07:08
因为C语言的指针本身就是地址传递,变一个也会导致另一个跟着变
行星波动 发表于 2020-3-10 11:05
本帖最后由 行星波动 于 2020-3-10 11:37 编辑

楼主这个代码的问题好像有点多。。
首先p->next没有删掉节点只是指针后移了,你再怎末移动指针对这个地址上的值没影响的,看起来integrate值变了应该是交换的问题(不太确定,没仔细分析)
temp的问题的话。。。你设置的temp也是个指针。它指向的是你p的后面一个结点的地址,这很重要,因为你下一句改变了p的下一个节点的data,也就是说temp指向的data变了
说起来有点麻烦,我画个图帮助楼主理解下
下载.png
可以选择设置temp为int类型只保存data值,这样就不会导致值丢失了
还有就是个人觉得楼主的循环挺绕的,我一直没转过弯来,改了两下结果出现野指针了。。我又重写了一遍代码希望可以帮到楼主
[C++] 纯文本查看 复制代码
void swap(Link* integrate, int length)
{
	integrate = integrate->next;
	Link* p = integrate;
	Link* head = integrate;
	for (int i = 1; i < length; i++)
	{
		for(int j=1;j<length;j++)
		{
			if (p->data > p->next->data)
			{
				int temp = p->next->data;
				p->next->data = p->data;
				p->data = temp;
			}
			print(head);
			p = p->next;
		}
	
		p = integrate;
		
	}
}


另外我也是刚入坑小白,有哪里不对的,不好的还希望大佬们多多指正

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
ing + 2 + 1 我很赞同!

查看全部评分

 楼主| ing 发表于 2020-3-11 21:15
行星波动 发表于 2020-3-10 11:05
楼主这个代码的问题好像有点多。。
首先p->next没有删掉节点只是指针后移了,你再怎末移动指针对这个地址 ...

我发现我的问题(参数中的指针 **integrate 后移)是由
p->next = p->next->next
引起的了,可我没理解这是为什么

p 是指针类型,p->next 也是指针,并且指针地址全都是不同的,为什么
p = p->next 不会导致参数中的指针 **integrate 后移?

然后,这是循环的思想,外层循环是 起泡次数,内层循环是 比较次数
捕获.PNG
古月不傲 发表于 2020-3-11 21:58
本帖最后由 古月不傲 于 2020-3-11 22:14 编辑
ing 发表于 2020-3-11 21:15
我发现我的问题(参数中的指针 **integrate 后移)是由
p->next = p->next->next
引起的了,可我没理解 ...

[C] 纯文本查看 复制代码
void swap(Link **integrate, int length)
{
        Link *p = *integrate;
        for (size_t i = 1; i < length; i++)
        {
                 for (size_t j = 1; j < length; j++)
                {
                        if (p->next->data > p->next->next->data)
                        {
                                Link *temp = p->next;
                                p->next->data = p->next->next->data;
                                p->next->next->data = temp->data;
                        }
                        p = p->next;
                        //p->next->next = p->next->next->next;
                        if (p->next->next == NULL) 
                                p = *integrate;
                                break;
                }
        }
}

就算最后地址不为NULL 你成功了  
但是指针还是动了 你第二次循环就已经错了 下一个元素早已经变化
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 19:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表