Qsen 发表于 2023-12-25 20:08:25

求助

为什么写入两个节点,第一个数据不见了


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

struct Book
{
      char title;
      char author;
      struct Book* next;
};
void printBook (struct Book* book)
{
      do
      {
                printf("%s\n",book->title);
                printf("%s\n",book->author);
                book = book->next;
      }
      while(book->next!=NULL);
}
void getinput (struct Book** book)
{
      struct Book* new_book,*temp;
      new_book = (struct Book *)malloc(sizeof(struct Book));
      scanf("%s%s",new_book->title,new_book->author);
      if (*book == NULL)
      {
                *book = new_book;
                new_book->next = NULL;
      }
      else
      {
                temp = *book;
                *book = new_book;
                new_book->next = temp;
      }
}
void realse_book(struct Book* book)
{
      struct Book * nextone;
      do
      {
                nextone = book->next;
                free(book);
                book = nextone;
      }
      while(book->next!=NULL);
}
int main()
{
      int ch = 1;
      struct Book *book = NULL,*library = NULL;
      while (1)
      {
                printf("请输入要插入的书名和作者");
                getinput(&library);
                printf("是否退出?(1/0)");
                scanf("%d",&ch);
                if (ch ==0)
                {
                        break;
                }
      }
      printBook(library);
      return 0;
}

FishC 发表于 2023-12-25 20:08:43

问题出在getinput函数中,当book不为空时,你将新节点插入到了链表的头部,但是并没有把原始的链表连接起来。所以只有第一个输入的数据能够正常输出,后续的数据都无法访问。

解决方法是,在将新节点插入到链表头部之后,需要把原始的链表连接到新节点的next上,使得链表保持完整。

以下是修改后的代码:

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

struct Book
{
    char title;
    char author;
    struct Book* next;
};

void printBook(struct Book* book)
{
    while (book != NULL) {
      printf("%s\n", book->title);
      printf("%s\n", book->author);
      book = book->next;
    }
}

void getinput(struct Book** book)
{
    struct Book* new_book = (struct Book*)malloc(sizeof(struct Book));
    scanf("%s%s", new_book->title, new_book->author);
    new_book->next = *book;// 将原始链表连接到新节点的next上
    *book = new_book;// 更新链表头指针
}

void release_book(struct Book* book)
{
    struct Book* nextone;
    while (book != NULL) {
      nextone = book->next;
      free(book);
      book = nextone;
    }
}

int main()
{
    int ch = 1;
    struct Book* library = NULL;
    while (ch == 1) {
      printf("请输入要插入的书名和作者: ");
      getinput(&library);
      printf("是否退出?(1/0)");
      scanf("%d", &ch);
    }
    printBook(library);
    release_book(library);
    return 0;
}

这样,即使插入多个节点,也能够正确输出所有的数据。同时,使用完链表后记得释放内存。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助