单循环链表头插法遍历完直接退出来是怎么回事呀

单循环链表头插法遍历完直接退出来是怎么回事呀?

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>

#define BOOL int
#define FALSE 0
#define TRUE 1

typedef struct link{
    int data;
    struct link* next;
}LinkList;

BOOL InitList(LinkList* L); //初始化
void List_HeadInsert(LinkList* L);//头插法
void List_TailInsert(LinkList* L);//尾插法,正序输入
void display(struct link* p);



int main()
{
    LinkList L; LinkList P;
    List_TailInsert(&L);
    List_HeadInsert(&P);
    
    printf("BYE");
    
    return 0;
}

BOOL InitList(LinkList* L)
{
    L = (LinkList*)malloc(sizeof(LinkList));
    if (L == NULL)
    {
        printf("内存不足");
        return FALSE;
    }
    L->next = L;
    return TRUE;
}

void List_HeadInsert(LinkList* L)
{
    InitList(L);
    int x;
    LinkList* temp = L;
    printf("请输入数据:");
    scanf("%d", &x);
    while (x != 0)
    {
        LinkList* a = (LinkList*)malloc(sizeof(LinkList));
        a->data = x;
        a->next = temp->next;
        temp->next = a;
        printf("请再次输入(输入0结束插入):");
        scanf("%d", &x);
    }
    
    display(L);
}

void List_TailInsert(LinkList* L)
{
    InitList(L);
    int x;
    LinkList* temp = L;
    printf("请输入数据:");
    scanf("%d", &x);
    while (x != 0)
    {
        LinkList* a = (LinkList*)malloc(sizeof(LinkList));
        a->data = x;
        temp->next = a;
        temp = a;
        printf("请再次输入(输入0结束插入):");
        scanf("%d", &x);
    }
    temp->next = L;
    display(L);
}

void display(struct link* p)
{
    struct link* t = p->next;  //凭借电视头指针,p->next指向第一个元素的地址
    while (t != p) //链表的最后一个结点是NULL,遇到NULL就会结束
    {
        printf("%d ", t->data);  //遍历数据区
        t = t->next;  //指向下一个结构的地址
    }
    printf("\n");
}```

修改如下,改动处见注释,供参考:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

#define BOOL int
#define FALSE 0
#define TRUE 1

typedef struct link {
    int    data;
    struct link* next;
}LinkList;

BOOL InitList(LinkList* L); //初始化
void List_HeadInsert(LinkList* L);//头插法
void List_TailInsert(LinkList* L);//尾插法,正序输入
void display(struct link* p);

int main()
{
    LinkList L;
    L.next = &L;   // 修改

    LinkList P;
    P.next = &P;  // 修改 

    List_TailInsert(&L);
    List_HeadInsert(&P);

    printf("BYE");

    return 0;
}

BOOL InitList(LinkList* L)
{
    L = (LinkList*)malloc(sizeof(LinkList));
    if (L == NULL)
    {
        printf("内存不足");
        return FALSE;
    }
    L->next = L;
    return TRUE;
}

void List_HeadInsert(LinkList* L)
{
    //InitList(L);  // 修改
    int x;
    LinkList* temp = L;
    printf("请输入数据:");
    scanf("%d", &x);
    while (x != 0)
    {
        LinkList* a = (LinkList*)malloc(sizeof(LinkList));
        a->data = x;
        a->next = temp->next;
        temp->next = a;
        printf("请再次输入(输入0结束插入):");
        scanf("%d", &x);
    }

    display(L);
}

void List_TailInsert(LinkList* L)
{
    //InitList(L); // 修改
    int x;
    LinkList* temp = L;
    printf("请输入数据:");
    scanf("%d", &x);
    while (x != 0)
    {
        LinkList* a = (LinkList*)malloc(sizeof(LinkList));
        a->data = x;
        temp->next = a;
        temp = a;
        printf("请再次输入(输入0结束插入):");
        scanf("%d", &x);
    }
    temp->next = L;
    display(L);
}

void display(struct link* p)
{
    struct link* t = p->next;  //凭借电视头指针,p->next指向第一个元素的地址
    while (t != p) //链表的最后一个结点是NULL,遇到NULL就会结束
    {
        printf("%d ", t->data);  //遍历数据区
        t = t->next;  //指向下一个结构的地址
    }
    printf("\n");
}

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

【以下回答由 GPT 生成】

问题原因是在List_HeadInsert函数中,没有设置循环终止条件,导致无限循环,最终程序崩溃或直接退出。

具体解决方案如下:

  1. List_HeadInsert函数的while循环中,添加循环终止条件,例如当输入数据为0时,退出循环。
while (x != 0)
{
    // ...
    printf("请再次输入(输入0结束插入):");
    scanf("%d", &x);
}

在插入数据时,先判断是否为0,如果是0则退出循环。

  1. 修改List_HeadInsert函数的参数为指针的指针,并在函数内部对指针进行操作。
void List_HeadInsert(LinkList** L)
{
    InitList(*L);
    int x;
    LinkList* temp = *L;
    printf("请输入数据:");
    scanf("%d", &x);
    while (x != 0)
    {
        LinkList* a = (LinkList*)malloc(sizeof(LinkList));
        a->data = x;
        a->next = temp->next;
        temp->next = a;
        printf("请再次输入(输入0结束插入):");
        scanf("%d", &x);
    }
}

这样更新链表的操作可以直接修改传入的指针,避免传参时修改不成功的问题。

  1. main函数中将List_HeadInsert函数调用中的参数修改为&P
int main()
{
    LinkList L; LinkList P;
    List_TailInsert(&L);
    List_HeadInsert(&P);

    printf("BYE");

    return 0;
}

这样才能正确传入链表的指针地址。

经过以上修改,程序可以正常运行。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^