C语言头插入链表问题

C语言 码拜 8年前 (2016-04-01) 944次浏览
本人想把一个节点加到一个链表的开头,即头插入,代码如下:
#include “stdlib.h”
#include “stdio.h”
#include “string.h”
#define BUF_NUM 40
typedef struct node
{
int num;
char buf[BUF_NUM];
struct node *next;
} NODE;
NODE *creat_node(int i,char *buf)
{
NODE *head;
head = (NODE *)malloc(sizeof(NODE));
head->num = i;
strncpy(head->buf,buf,BUF_NUM);
head->next = 0;
}
void add_node_to_head_2(NODE *head,NODE *insert)
{
NODE *tmp = head;
insert->next = tmp;
head = insert;
}
void print_node(NODE *head)
{
NODE *tmp = head;
while(1)
{
if(tmp == NULL)
break;
printf(“num=%d,%s\n”,tmp->num,tmp->buf);
tmp = tmp->next;
}
}
int main()
{
NODE *head,*insert,*real;
head = creat_node(1,”head”);
real  = head;
insert = (NODE *)malloc(sizeof(NODE));
insert = creat_node(2,”22222222″);
add_node_to_head_2(head,insert);
insert = creat_node(3,”33333″);
add_node_to_head_2(head,insert);
insert = creat_node(4,”444444″);
add_node_to_head_2(head,insert);
print_node(head);
puts(“123”);
return 0;
}

输出结果如下:
num=1,head
123
问一下为什么 add_node_to_head_2()这个函数没能够实现将insert 插入到head的前面?虽然本人有另外的方法可以实现头插入,但是就是想知道这个函数为什么不行?

可以实现的函数如下:
NODE *add_node_to_head(NODE *head,NODE *insert)
{
NODE *tmp = head;
insert->next = tmp;
head = insert;
return head;
}
调用如下: head = add_node_to_head(head,insert);
print_node(head);
这样就可以实现头插入链表了。
但是仔细一看 add_node_to_head 和add_node_to_head_2的区别就是一个返回了地址,一个没有返回地址,问一下各位高手,这有什么讲究么?
解决方案

20

本人来解释一波!
首先你是用head指针作为形参,函数调用的时候
将会生成一个指针,把head地址上的内容赋给
生成指针,最后的时候你只是将insert的地址赋
给函数生成的指针,函数调用完,指针就delete
所以你的主函数里面的head指针还是指向原来的
地址,你调试可以验证一下!
所以,本人觉得你要想改变函数参数内容,最好用引用!

10

改为
void add_node_to_head_2(NODE **head, NODE *insert)
{
    NODE *tmp = *head;
    insert->next = tmp;
    *head = insert;
调用
add_node_to_head_2(&head, insert);
}

原因是你是想改变指针指向的地址,单单只传指针是没用的,这样做最多只能改变指针内容,只有传入指针的指针,才能改变指针的指向。

40

你要改变指针的指向,必须传二级指针或一级指针的引用。
单单传一级指针只能改变指针所指向的内存区域的值。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言头插入链表问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)