为什么调用printList(&h)后,后面的 printf("\n");不执行了?

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Node
{
    Elemtype data;
    struct Node *next;
}Node,*LinkList;
/*初始化单链表*/
void InitList(LinkList *h)
{
    *h=(LinkList)malloc(sizeof(Node));
    (*h)->next=NULL;
}
/*创建一个单链表*/
void creatList(LinkList h)
{
    LinkList p,q;
    q=h;
    p=(LinkList)malloc(sizeof(struct Node));
    scanf("%d",&p->data);
    while(p->data!=-1)
    {
        q->next=p;
        q=p;
        p=(LinkList)malloc(sizeof(struct Node));
        scanf("%d",&p->data);
        q->next=NULL;
    }
}
int printList(LinkList *L)
{
    Node *p,*q;
    p=*L;
    while(p)
     {
        q=p->next;
        printf("%5d",q->data);
        p=p->next;
    }
    return 0;
}
int main()
{
    LinkList h;
    InitList(&h);
    printf("请输入数据(以-1结束):\n");
    creatList(h);
    printf("单链表中的数据为:");
    printList(&h);
    printf("123");
    return 0;
}

在代码中出现了错误,导致程序没有完整运行。

我将代码进行了修改:

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Node
{
    Elemtype data;
    struct Node *next;
}Node,*LinkList;
/*初始化单链表*/
void InitList(LinkList *h)
{
    *h=(LinkList)malloc(sizeof(Node));
    (*h)->next=NULL;
}
/*创建一个单链表*/
void creatList(LinkList h)
{
    LinkList p,q;
    q=h;
    p=(LinkList)malloc(sizeof(struct Node));
    scanf("%d",&p->data);
    while(p->data!=-1)
    {
        q->next=p;
        q=p;
        p=(LinkList)malloc(sizeof(struct Node));
        scanf("%d",&p->data);
        p->next=NULL;
    }
}
int printList(LinkList L)
{
    Node *p;
    p=L->next;
    while(p)
     {
        printf("%5d",p->data);
        p=p->next;
    }
    return 0;
}
int main()
{
    LinkList h;
    InitList(&h);
    printf("请输入数据(以-1结束):\n");
    creatList(h);
    printf("单链表中的数据为:");
    printList(h);
    printf("\n");
    printf("123\n");
    return 0;
}

代码出错的原因是:

在printLink列表的时候,当p已经指向了倒数第一个节点的时候,也就是p->next==NULL,而p!=NULL的时候;还要使用q=p->next,输出q中的data内容,由于此时q已经是NULL了,所以无法取出其中的数值,导致等价于print("%5d", NULL->data);这种情况。

 

我可以理解你使用q指针来避免输出哨位节点中的数值的情况。我修改的代码,将q指针删除了。

如果继续使用q指针,可以将while(p),改为while(p->next);

看打印提示按任意键,继续往后执行,你按键程序往后走

您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632