人造人 发表于 2023-6-19 10:13
没看懂,用代码说明你的问题吧
简单来说就是 在Merge函数里对传进来的L1L2做节点位置的修改后,返回到main函数里L1 L2节点位置还是传入main函数之前的位置。但是在Merge函数里 直接对L1->Next = NULL做这个动作 是能够影响到main函数的 但是如果移动了节点做这样的动作 是无法影响到main函数的 是为什么呢? 对传进来的L1L2做节点位置的修改
怎么个修改法?
返回到main函数里L1 L2节点位置还是传入main函数之前的位置
这个L1 L2节点位置是什么意思?
是L1 L2这两个指针指向的节点?还是整个链表?
但是如果移动了节点做这样的动作 是无法影响到main函数的
这个无法影响到main函数体现在哪里?
最好还是用代码说明问题,用文字叙述会有太多的变数
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");
}
#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");
}
人造人 发表于 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指针目前所指向的结构体做修改不行对它下一个节点做修改却有效?
人造人 发表于 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;
}
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;
}
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$
{:10_321:}不用gpt,hehe 人造人 发表于 2023-6-19 17:23
一个是修改指针的指向
一个是修改指针指向的值
这两个是不一样的,你需要好好理解一下这两个的不同
谢谢!!
页:
1
[2]