问题--链表指针传参,修改next指针只传值

发布时间 2023-07-26 18:32:09作者: DawnTraveler

1.问题--链表指针传参,修改next指针只传值

Link_creat_head(&head, p_new);//将新节点加入链表
在这当中head头指针传的是地址,而p_new传的是值,这二者有什么区别?

#include <stdio.h>
#include <stdlib,h>
//定义结点结构体
typedef struct student
{
    //数据域
    int num;
    //学号
    int score;
    //分数
    char name[20];/姓名
    
    //指针域
    struct student *next;
}STU;

void link_creat_head(STU **p_head,STU *p_new)
{
    STU *p_mov *p_head;
    if(*p_head==NULL)//当第一次加入链表为空时,head执行p_new
    {
        *p_head = p_new;
        p_new->next=NULL;   
	}
	else//第二次及以后加入链表
{
    while(p_mov->next!=NULL)
    {
        p_mov=p_mov->next;//找到原有链表的最后一个节点
        p_mov->next = p_new;
        //将新申请的节点加入链表
        p_new->next = NULL;
    }
}

int main()
{
		STU *head = NULL,*p_new = NULL;
 		int num, i;
		printf("请输入链表初始个数:\n");	
    	scanf("%d",&num);
        for(i = 0;i < num;i++)
        p_new=(STU*)malloc(sizeof(STU));//申请一个新节点
        printf("请输入学号、分数、名字:\n");//给新节点赋值
        scanf("%d %d %s",&p_new->num,&p_new->score,p_new->name);
        Link_creat_head(&head, p_new);//将新节点加入链表
	}
}

2.解决

二者的核心操作分别是:*p_head = p_new; p_new->next=NULL;

可以明显看到*p_head = p_new;一步中
p_head内部所存储的地址变成了p_new,里面存储的内容实实在在改变了,所以要传地址

而在p_new->next=NULL; 或写作(*(p_new).next = NULL;)更清楚,改变的是该指针所指向的存储区域中的值,该指针本身所存的地址还是该存储区域,并没有发生改变,所以仅仅传值即可