单链表 为什么不能打印出单链表 能够调用函数


#include<stdio.h>
#include<malloc.h>
#define elemType int
//定义数据元素
typedef struct LNode{
    elemType data;            //数据域 
    struct LNode *next;       //指针域 
}LNode,*List;
//头插法创建单链表
List ListHeadInsert(List p){
    List s;
    int x;
    p = (List)malloc(sizeof(LNode)); //创建空结点 
    p->next = NULL;
    printf("请输入数据(以9999结束):\n");
    scanf("%d",&x);
    while(x!=9999){
    s = (List)malloc(sizeof(LNode));
    s->data = x;
    s->next = p->next; 
    p->next=s;
    scanf("%d",&x); 
    }
    return p;
}
//打印单链表
List PrintList(List p){
    printf("调用成功");
    while(p){
        printf("%d",p->data);
        p=p->next;
    }
//    if(!p->next){
//        printf("该单链表为空链表"); 
//    }
    return p;
}
int main(){
    List p ;
    ListHeadInsert(p);
    printf("创建成功\n"); 
    PrintList(p);
}








ListHeadInsert函数逻辑写错了,给你改一下


#include<stdio.h>
#include<malloc.h>
#define elemType int
//定义数据元素
typedef struct LNode{
    elemType data;            //数据域 
    struct LNode *next;       //指针域 
}LNode,*List;
//头插法创建单链表
List ListHeadInsert(List p){
    List s,tt; //修改1,多声明一个变量
    int x;
    p = (List)malloc(sizeof(LNode)); //创建空结点 
    p->next = NULL;

    tt = p; //修改2,下面的操作用tt,避免改变p的值

    printf("请输入数据(以9999结束):\n");
    scanf("%d",&x);
    while(x!=9999){
        s = (List)malloc(sizeof(LNode));
        s->data = x;
        s->next = NULL;//p->next;  修改3
        tt->next = s ;//p->next=s; 修改4
        tt = s;  //修改5
        scanf("%d",&x); 
    }
    return p;
}
//打印单链表
void PrintList(List p){ //修改5,打印函数不用返回
    List t = p->next; //修改6:因为你的头结点中没有存放数据,所以从p->next开始遍历输出
    printf("调用成功");
    while(t){
        printf("%d",t->data);
        t=t->next;
    }
    //    if(!p->next){
    //        printf("该单链表为空链表"); 
    //    }
    //return p;  //打印函数,不用再返回了
}
int main(){
    List p = 0 ;
    ListHeadInsert(p);
    printf("创建成功\n"); 
    PrintList(p);
    return 0;
}

List p = 0 ;
ListHeadInsert(p); //这里,改成p = ListHeadInsert(p);