尾插法建立链表但输出空白

有没有佬看一下为啥我尝试尾插法建立链表但没法输出数据
编译成功但输出为空白

代码如下,谢谢了佬们

#include
#include
typedef  struct link
{
    int data;
    struct link *next;
}link;
link *ap(link *head,int *d); 
link *dis(link *head);
int main()
{
    int a=1;
    link *head=NULL;
    while(a!=0)
    {
    
        *ap(head,&a);
        *dis(head);
    }
    
}

link *ap(link *head,int *d)
{
    link *p;
    p=(link*)malloc(sizeof(link));
    if(head==NULL)
    {
        head=p;
    }
    else
    {
        while(head->next!=NULL)
        {
            head=head->next;
        }
        
        head->next=p;
    }
    scanf("%d",d);
    p->data=*d;
    p->next=NULL;
    return head;
}

link *dis(link *head)
{
    if(head!=NULL)
    {
        printf("%d",head->data);
        head=head->next;
    }
    return head;
}

在主函数中,你调用了ap和dis两个函数,并将返回值赋值给head,但是你在调用ap和dis函数时使用了*号,这会导致head的值被重新赋值为NULL,导致无法正常输出。

正确的做法应该是:

    head = ap(head,&a);
    head = dis(head);

还有一处需要修改,在while循环里你应该在读入数据之后判断是否继续循环,而不是在读入之前,这样可以保证第一个数据也能被正确读入。

代码如下

#include<stdio.h>
#include<stdlib.h>
typedef  struct link
{
    int data;
    struct link *next;
}link;
link *ap(link *head,int *d); 
link *dis(link *head);
int main()
{
    int a=1;
    link *head=NULL;
    while(a!=0)
    {
        scanf("%d",&a);
        head = ap(head,&a);
        head = dis(head);
    }
}

link *ap(link *head,int *d)
{
    link *p;
    p=(link*)malloc(sizeof(link));
    if(head==NULL)
    {
        head=p;
    }
    else
    {
        while(head->next!=NULL)
        {
            head=head->next;
        }
        head->next=p;
    }
    p->data=*d;
    p->next=NULL;
    return head;
}

link *dis(link *head)
{
    if(head!=NULL)
    {
        printf("%d",head->data);
        head=head->next;
    }
    return head;
}

若对您的问题有帮助,望采纳

题主的代码修改如下,供参考:

#include<stdio.h>
#include<stdlib.h>
typedef  struct _link  //修改
{
    int data;
    struct _link *next;//修改
}link;
link *ap(link *head,int *d);
void  dis(link *head);  //link *dis(link *head);//修改
int main()
{
    int a=1;
    link *head=NULL;
    while(a!=0)
    {
        head = ap(head, &a);//*ap(head,&a);
        dis(head);          //*dis(head);
    }
    return 0;
}

link *ap(link *head,int *d)
{
    link *p, *q = NULL;//修改
    scanf("%d",d);     //修改
    if (*d != 0)       //修改
    {
        p=(link*)malloc(sizeof(link));
        p->data=*d;
        p->next=NULL;
        if(head==NULL)
        {
            head=p;
        }
        else
        {
            q = head;//修改
            while(q->next!=NULL)//while(head->next!=NULL) //修改
            {
                q=q->next;//head=head->next; //修改
            }
            q->next=p;   //head->next=p; //修改
        }
    }
    return head;
}
void dis(link *head)  //link *dis(link *head)//修改
{
    while(head!=NULL) // if(head!=NULL) //修改
    {
        printf(" %d",head->data);
        head=head->next;
    }
    printf("\n");    //修改
    //return head;   //修改
}