a905448839 发表于 2023-6-19 10:26:17

本帖最后由 a905448839 于 2023-6-19 10:27 编辑

人造人 发表于 2023-6-19 10:13
没看懂,用代码说明你的问题吧

简单来说就是 在Merge函数里对传进来的L1L2做节点位置的修改后,返回到main函数里L1 L2节点位置还是传入main函数之前的位置。但是在Merge函数里 直接对L1->Next = NULL做这个动作 是能够影响到main函数的 但是如果移动了节点做这样的动作 是无法影响到main函数的 是为什么呢?

人造人 发表于 2023-6-19 10:52:23

对传进来的L1L2做节点位置的修改
怎么个修改法?
返回到main函数里L1 L2节点位置还是传入main函数之前的位置
这个L1 L2节点位置是什么意思?
是L1 L2这两个指针指向的节点?还是整个链表?

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

最好还是用代码说明问题,用文字叙述会有太多的变数

人造人 发表于 2023-6-19 10:58:48

a905448839 发表于 2023-6-19 10:26
简单来说就是 在Merge函数里对传进来的L1L2做节点位置的修改后,返回到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");
}

人造人 发表于 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");
}

a905448839 发表于 2023-6-19 13:24:33

人造人 发表于 2023-6-19 11:00


写了个代码开验证代码后面的备注是我错误的理解
我发现直接用传入函数的指针做移动 假设这个指针是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;
}

代码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;
}



为什么对p指针目前所指向的结构体做修改不行对它下一个节点做修改却有效?

a905448839 发表于 2023-6-19 13:32:49

人造人 发表于 2023-6-19 11:00


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

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


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


人造人 发表于 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;
}

人造人 发表于 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$

sfqxx 发表于 2023-6-19 17:50:11

{:10_321:}不用gpt,hehe

a905448839 发表于 2023-6-20 00:08:11

人造人 发表于 2023-6-19 17:23
一个是修改指针的指向
一个是修改指针指向的值
这两个是不一样的,你需要好好理解一下这两个的不同

谢谢!!
页: 1 [2]
查看完整版本: (悬赏贴)求个大佬求助,帮我解答一下本题