写了个代码开验证 代码后面的备注是我错误的理解
我发现直接用传入函数的指针做移动 假设这个指针是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指针目前所指向的结构体做修改不行 对它下一个节点做修改却有效?
|