鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: a905448839

[已解决](悬赏贴)求个大佬求助,帮我解答一下本题

[复制链接]
 楼主| 发表于 2023-6-19 10:26:17 From FishC Mobile | 显示全部楼层
本帖最后由 a905448839 于 2023-6-19 10:27 编辑
人造人 发表于 2023-6-19 10:13
没看懂,用代码说明你的问题吧


简单来说就是 在Merge函数里对传进来的L1  L2做节点位置的修改后,返回到main函数里L1 L2节点位置还是传入main函数之前的位置。但是在Merge函数里 直接对L1->Next = NULL做这个动作 是能够影响到main函数的 但是如果移动了节点做这样的动作 是无法影响到main函数的 是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 10:52:23 | 显示全部楼层
对传进来的L1  L2做节点位置的修改
怎么个修改法?
返回到main函数里L1 L2节点位置还是传入main函数之前的位置
这个L1 L2节点位置是什么意思?
是L1 L2这两个指针指向的节点?还是整个链表?

但是如果移动了节点做这样的动作 是无法影响到main函数的
这个无法影响到main函数体现在哪里?

最好还是用代码说明问题,用文字叙述会有太多的变数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 10:58:48 | 显示全部楼层
a905448839 发表于 2023-6-19 10:26
简单来说就是 在Merge函数里对传进来的L1  L2做节点位置的修改后,返回到main函数里L1 L2节点位置还是 ...

但是如果移动了节点做这样的动作 是无法影响到main函数的
可以修改呀
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;

struct Node {
    ElementType Data;
    PtrToNode Next;
};

typedef PtrToNode List;

void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/


void list_free(List L) {
    if(L) list_free(L->Next);
    free(L);
}

void list_append(List L) {
    while(L->Next) L = L->Next;     // 修改L,让他指向最后面
    // 在最后面添加一个节点
    L->Next = malloc(sizeof(*L->Next));
    L->Next->Data = 456;
    L->Next->Next = NULL;
}

int main(void) {
    List L1 = malloc(sizeof(*L1));
    L1->Next = malloc(sizeof(*L1->Next));
    L1->Next->Data = 123;
    L1->Next->Next = NULL;
    Print(L1);
    list_append(L1);
    Print(L1);
    list_free(L1);
    return 0;
}

void Print(List L) {
    List p = L->Next;
    if(p) {
        List r;
        r = L;
        while(r->Next) {
            r = r->Next;
            printf("%d ", r->Data);
        }
    } else {
        printf("NULL");
    }
    printf("\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 11:00:58 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;

struct Node {
    ElementType Data;
    PtrToNode Next;
};

typedef PtrToNode List;

void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/


void list_free(List L) {
    if(L) list_free(L->Next);
    free(L);
}

void list_append(List L, ElementType v) {
    while(L->Next) L = L->Next;     // 修改L,让他指向最后面
    // 在最后面添加一个节点
    L->Next = malloc(sizeof(*L->Next));
    L->Next->Data = v;
    L->Next->Next = NULL;
}

int main(void) {
    List L1 = malloc(sizeof(*L1));
    L1->Next = NULL;
    Print(L1);
    list_append(L1, 123);
    Print(L1);
    list_append(L1, 456);
    Print(L1);
    list_free(L1);
    return 0;
}

void Print(List L) {
    List p = L->Next;
    if(p) {
        List r;
        r = L;
        while(r->Next) {
            r = r->Next;
            printf("%d ", r->Data);
        }
    } else {
        printf("NULL");
    }
    printf("\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-19 13:24:33 | 显示全部楼层

写了个代码开验证  代码后面的备注是我错误的理解
我发现直接用传入函数的指针做移动 假设这个指针是p 无论移动到哪里或者不移动
对p做修改是无效的 比如p=NULL 但是对p->Next的修改是有效的 比如p->Next = NULL;

代码1对指针p直接做修改 无效:
#include<stdio.h>
#include <stdlib.h>

struct sum {
    int a;
    struct sum  *Next;
}; 

struct sum* read( struct sum  *p);
void print(struct sum  *p);
void move( int i, struct sum  *p);//把这个链表第i个结构体里的下一个结构体指针设为NULL 
void Nomove(struct sum  *p); 

struct sum* read(struct sum* p)
{
    int i = 10;
    struct sum* head = p;
    while (i)
    {
        p->a = i;
        if (i == 1)
            p->Next = NULL;
        else
            p->Next = (struct sum*)malloc(sizeof(struct sum));
            
        p = p->Next;
        i--;
    }
    return head;
}
void print(struct sum  *p)
{
        printf("此时链表为:head->");
        while(p)
        {
                printf("%d->",p->a);
                p = p->Next;
        } 
        printf("NULL\n");
}

void move(int i, struct sum  *p)//把这个链表第i个结构体里的下一个结构体指针设为NULL 
{
        i = i-1;
        while(i--)
        p = p->Next; //直接用传进来的指针做移动节点 

        p = NULL; 
//        p->Next = NULL;

        //移动到i的位置后让p指向NULL 即i的位置p->Next = NULL
        //但是结束后回到main函数并没有影响整个链表
        //但是如果不移动节点 直接让传进来的指针为NULL 也不返回这个指针 能够影响到main函数的链表
        //如下 
        
}

void Nomove(struct sum  *p)
{
        p = NULL;        
//        p->Next = NULL;
        
}

int main(void)
{
        struct sum *p;
        p = (struct sum*)malloc(sizeof(struct sum));
        p = read(p);
        print(p);
        
        move(4,p); 
        print(p);

        Nomove(p);
        print(p);

        return 0;
}
2d0ed444b832446ccc71c9bd2372b99.png
代码2对指针p->Next做修改 有效:
#include<stdio.h>
#include <stdlib.h>

struct sum {
    int a;
    struct sum  *Next;
}; 

struct sum* read( struct sum  *p);
void print(struct sum  *p);
void move( int i, struct sum  *p);//把这个链表第i个结构体里的下一个结构体指针设为NULL 
void Nomove(struct sum  *p); 

struct sum* read(struct sum* p)
{
    int i = 10;
    struct sum* head = p;
    while (i)
    {
        p->a = i;
        if (i == 1)
            p->Next = NULL;
        else
            p->Next = (struct sum*)malloc(sizeof(struct sum));
            
        p = p->Next;
        i--;
    }
    return head;
}
void print(struct sum  *p)
{
        printf("此时链表为:head->");
        while(p)
        {
                printf("%d->",p->a);
                p = p->Next;
        } 
        printf("NULL\n");
}

void move(int i, struct sum  *p)//把这个链表第i个结构体里的下一个结构体指针设为NULL 
{
        i = i-1;
        while(i--)
        p = p->Next; //直接用传进来的指针做移动节点 

//        p = NULL; 
        p->Next = NULL;

        //移动到i的位置后让p指向NULL 即i的位置p->Next = NULL
        //但是结束后回到main函数并没有影响整个链表
        //但是如果不移动节点 直接让传进来的指针为NULL 也不返回这个指针 能够影响到main函数的链表
        //如下 
        
}

void Nomove(struct sum  *p)
{
//        p = NULL;        
        p->Next = NULL;
        
}

int main(void)
{
        struct sum *p;
        p = (struct sum*)malloc(sizeof(struct sum));
        p = read(p);
        print(p);
        
        move(4,p); 
        print(p);

        Nomove(p);
        print(p);

        return 0;
}

386863bd77c1d828723b4cb65e87f08.png

为什么对p指针目前所指向的结构体做修改不行  对它下一个节点做修改却有效?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-19 13:32:49 | 显示全部楼层

我想用一个二级指针a指向指针p

这样通过         *a = NULL; 来修改还是无法改变结果。。

void Nomove(struct sum  *p)
{
//        p = NULL;        
//        p->Next = NULL;
        
         struct sum** a = &p;
         
         *a = NULL; 
}

8a1f4412bc5dfbd46fbeacb966b1f0c.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 17:23:42 | 显示全部楼层
a905448839 发表于 2023-6-19 13:24
写了个代码开验证  代码后面的备注是我错误的理解
我发现直接用传入函数的指针做移动 假设这个指针是p  ...

一个是修改指针的指向
一个是修改指针指向的值
这两个是不一样的,你需要好好理解一下这两个的不同
#include <stdio.h>

int main(void) {
    int a = 123;
    int b = 456;
    int *p = NULL;
    p = &a;         // 修改指针p的指向
    *p = 789;       // 修改指针p指向的值
    p = &b;         // 修改指针p的指向
    *p = 100;       // 修改指针p指向的值
    printf("%d %d\n", a, b);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 17:28:21 | 显示全部楼层
a905448839 发表于 2023-6-19 13:32
我想用一个二级指针a指向指针p

这样通过         *a = NULL; 来修改还是无法改变结果。。

你这修改的是指针的指向,不是指针指向的值
sh-5.1$ cat main.c
#include <stdio.h>

int b = 456;

void func(int *p) {
    int **x = &p;
    *x = &b;        // 修改指针p的指向
    **x = 789;      // 修改指针p指向的值
}

int main(void) {
    int a = 123;
    func(&a);
    printf("%d %d\n", a, b);
    return 0;
}
sh-5.1$ ./main
123 789
sh-5.1$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 17:50:11 | 显示全部楼层
不用gpt,hehe
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-20 00:08:11 From FishC Mobile | 显示全部楼层
人造人 发表于 2023-6-19 17:23
一个是修改指针的指向
一个是修改指针指向的值
这两个是不一样的,你需要好好理解一下这两个的不同

谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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