无法在c中打印链表中的元素

无法在c中打印链表中的元素,c,C,我只是在学习链表。 当我试图在链表中插入元素时,我无法打印这些插入的元素 int main() { int i,x,n; struct node* head = NULL; printf("Enter number of elements to insert into likedlist :"); scanf("%d",&n); printf("Enter elements: "); for(i=0;i<n;i++)

我只是在学习链表。 当我试图在链表中插入元素时,我无法打印这些插入的元素

int main()
{
    int i,x,n; 
    struct node* head = NULL; 
    printf("Enter number of elements to insert into likedlist :"); 
    scanf("%d",&n); 
    printf("Enter elements: "); 
    for(i=0;i<n;i++) 
    {
        scanf("%d",&x);
        insert(head,x);
    }
    print(head);
} 

struct node* insert(struct node* head,int x)
{
    struct node* p = (struct node*)malloc(sizeof(struct node));
    p->data = x;
    p->next = NULL;
    if(head == NULL)
    {
        head = p;
        return head;
    }
    p->next = head;
    head = p;
    return head;
}
那么,这个代码有什么问题呢。 输出是这样的

样本输入:

 Enter number of elements to insert into likedlist :5
 Enter elements: 1 2 3 4 5
样本输出:

NULL

阅读更多关于C编程的内容(首先是一些好的教程,然后是一些,稍后再参考C11标准)。我们不能用几段来教你

C使用a

因此,至少对于新手来说,传统上建议(但不是必需的)永远不要将形式参数用作某些赋值的左侧目标,因为对形式参数的任何更改都是具有该形式参数的函数的局部更改,并且不会影响调用方


因此,使用所有警告和调试信息编译:
gcc-Wall-Wextra-g
使用调试器(例如)了解程序的行为(您的错误可能不在您显示的代码块中)

理解整个程序的行为并对其进行调试的能力是开发人员的一项基本技能。编译器的警告和调试器都可以帮助您理解程序的行为。另请参见,以获取有用的信息

因此,
insert
中的
head
形式参数是调用方实际参数的本地副本

您只修改该副本,而不是原始副本。因此
head=p是完全无用的(并且令人困惑),您最好用
返回p替换上面大括号中的块

我们不知道您如何调用
insert
,我们无法提供更多帮助

也许
insert
应该得到某个指针的地址。。。。或者您的
main
应该使用它的返回值

在已编辑的问题中,在
主文中
,替换

    insert(head,x); //WRONG
(不会更改
main
中声明的本地
,即使
insert
正在更改其第一个形式,因为通过值调用参数传递)


使用所有警告和调试信息编译:
gcc-Wall-Wextra-g
with。使用调试器(例如)了解您的程序的行为StackOverflow不是DoMy Home service。您没有提供任何。您显示的代码工作正常。因此,您没有显示的代码必须被破坏。这就是为什么网站规则要求。如果问题不包括a,则该问题不属于主题。确保
main()
does
head=insert(head,n)
这就是它返回新值的原因。是的,但我们都猜测OP在
main
中没有使用它,所以这是
main()
的问题,而不是这个函数的问题更改呼叫站点上的某些内容谢谢各位,对于给您带来的不便,我深表歉意。
if(head == NULL)
{
    head = p;
    return head;
}
    insert(head,x); //WRONG
    head = insert(head, x);