我正在学习C,在这个程序中,我试图实现一个简单的链表。列表的每个节点都包含一个整数和一个指向下一个节点的指针。指针head指向列表中的第一个节点,但最初列表是空的,所以我初始化了head = NULL。
我想在列表上做两个操作--填充它,然后打印它。
为了填充列表,我使用两个参数调用函数insert_node:head和要插入的整数。
问题是,我需要函数insert_node来更改head的值(因此它指向更新的列表,而不是NULL)。我不知道如何做到这一点,所以我将head作为一个全局变量,并试图更改它的值。由于某些原因,即使head的值在函数insert_node中被更改,当我再次调用该函数时,head的值仍然为NULL。
问题:
insert_node函数返回指向列表的指针,这是一个好方法吗?#include #include结构节点{ int数据;struct节点*link;};void insert_node(struct节点*head,int n);void print_list(struct节点*head);struct节点*head = NULL;main() { int i;for(i=1;i<5;i++) insert_node(head,i*i);print_list(head);}print_list(结构节点*头){if( ==空)返回;否则{ printf("%i ",头->数据);print_list(头->链接);}返回;}insert_node(结构节点*头,int n) {结构节点N= {n,NULL};结构节点*下一步,*prev;int prev_data = 0;//案例一:列表为空点头到N,并将N.link设置为空if( ==空) head = &N;//case 2:n小于列表中的第一个元素: N.link =N.link;N.link= &N;} next = head;//案例三: N.data等于现有元素,不做任何操作:this( next != NULL) { if(n == next->data) {printf(“此元素已经存在。\n\n”);返回;} prev = next;//保存当前元素next=next->链接;//查看下一个元素} //case 4: N.data大于最后一个元素: if(n > prev->data) { prev->link = &N;返回;} //case 5: N.data位于列表元素之间: next = head;而( next != NULL) { prev_data = next->data;//保存当前元素prev = next;//保存指向当前元素的指针next = next->link;//查看下一个元素if (n > prev_data) && (n< next ->data){prev-> N.link = next;返回;}}返回;}
发布于 2013-10-06 21:45:17
head 按值传递给insert_node()函数。
然后函数insert_node()生成局部变量(顺便说一句,它的名称head可能会使您感到困惑,因为它是本地的而不是全局的)。修改本地head,并且这些更改在全局变量head中不可见。这就是所谓的隐藏(具有相同名称但在本地范围内的变量与任何具有相同名称的其他变量不同)。声明
void insert_node(struct node **ptr_to_head, int n);使用
insert_node(&head, 5);现在,您可以通过在ptr_to_head函数中取消引用insert_node来修改head:
(*ptr_to_head)=&new_node;
     ^            ^
     |            |
   head       =  value returned by malloc 是的,您可以从head函数返回insert_node,但不要忘记在main函数中为head分配任务。
https://stackoverflow.com/questions/19214293
复制相似问题