【问题标题】:Adding a linked list to another linked list in C programming在 C 编程中将链表添加到另一个链表
【发布时间】:2022-01-21 11:44:30
【问题描述】:

我是初学者尝试使用 c 将链表添加到另一个链表。问题是程序正在进入无限循环,我不知道为什么。 这是下面的c代码

typedef struct bookInfo
{
    int code;
    struct bookInfo *next;
} bookInfo;

typedef struct subscriber
{
    int code;
    struct bookInfo *books;
    struct subscriber *next;
    struct subscriber *prec;
} subscriber;

typedef bookInfo *Book;
typedef subscriber *Subscriber;
typedef Subscriber *SubscriberList;

void newBook(Book *bk, int val)
{
    bookInfo *new_node = malloc(sizeof(bookInfo));
    bookInfo *last = *bk;
    new_node->code = val;
    new_node->next = NULL;

    if (*bk == NULL)
    {
        *bk = new_node;
    }
    else
    {
        while (last->next != NULL)
            last = last->next;
        last->next = new_node;
    }
}

Subscriber Add_book(Subscriber S, Book Bk)
{
    bookInfo *newNode = malloc(sizeof(bookInfo));
    bookInfo *tmp;
    newNode->next = NULL;
    newNode->code = Bk->code;
    if (S == NULL)
        printf("\nl'abonnee est nulle");
    else
    {
        if (S->books == NULL)
            S->books = newNode;    
        else
        {
            tmp = S->books;
            while (tmp != NULL)
                tmp = tmp->next;
            tmp->next = newNode;
            printf("\nl'ajout du livre a ete effectue");
        };
    }
    return S;
};

希望你们能帮助我,谢谢。我不知道是函数 newBook 中的问题还是什么,这是我的主要函数

int main()
{
    book_ref, sub_ref = NULL;
    newSubscriber(&sub_ref);
    bookInfo b1 = {20,NULL};
    Add_book(sub_ref, &b1);
    printf("\n%d : %d", sub_ref->code, sub_ref->books->code);
}

【问题讨论】:

  • 你应该学习如何使用调试器,因为它是有价值的。调试器是您自己解决此类问题的绝佳工具。
  • Wassim Ben Fatma,很好奇,为什么使用Subscriber S 而不是subscriber * S
  • 据我所知,您需要一个指针才能更改全局变量。但我不知道我的工作是否正确。我真的是 C 编程的初学者。
  • 我知道这似乎是一个深奥的抱怨,但错误消息确实属于 stderr。 fprintf(stderr, "...");。永远不要将错误消息写入标准输出。

标签: c data-structures linked-list singly-linked-list


【解决方案1】:

在您的代码中,

while (tmp != NULL) tmp = tmp->next; 当此循环结束时,tmp 为 NULL,因此下一行将尝试访问空指针。

你应该更正它,while(tmp->next != NULL)

【讨论】:

  • 我修好了,但问题仍然存在
  • 对于给定的代码段,我们只能说这么多。共享代码的其他相关部分。你为什么要返回 S ?这个 Add_book() 如何在您的其余代码中使用。
【解决方案2】:

为了消除无限循环,我所要做的就是将订阅者结构中的书籍指针定义为NULL

void newBook(Book *bk, int val)
{
    bookInfo *new_node = malloc(sizeof(bookInfo));
    bookInfo *last = *bk;
    new_node->code = val;
    new_node->next = NULL;
    new_node->books = NULL;

    if (*bk == NULL)
    {
        *bk = new_node;
    }
    else
    {
        while (last->next != NULL)
            last = last->next;
        last->next = new_node;
    }
}

Subscriber Add_book(Subscriber S, Book Bk)
{
    bookInfo *newNode = malloc(sizeof(bookInfo));
    bookInfo *tmp;
    newNode->next = NULL;
    newNode->code = Bk->code;
    newNode->books = NULL;
    if (S == NULL)
        printf("\nl'abonnee est nulle");
    else
    {
        if (S->books == NULL)
            S->books = newNode;    
        else
        {
            tmp = S->books;
            while (tmp != NULL)
                tmp = tmp->next;
            tmp->next = newNode;
            printf("\nl'ajout du livre a ete effectue");
        };
    }
    return S;
};

一切正常。

【讨论】:

  • 你的bookInfo结构没有名为books的成员,不清楚你在做什么,newNode->books
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多