小甲鱼 发表于 2017-3-24 23:31:58

已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览 购买主题

莫法法 发表于 2017-10-11 23:05:07

视频里提到的那个错误是什么,求大神解答

莫法法 发表于 2017-10-11 23:09:46

改成这样以后好了

void releaseLibrary(struct Book *library)
{
        struct Book *temp;
        while (library != NULL) {
                temp = library->next;
                free(library);
                library = temp;

        }
}

lsheihei 发表于 2019-6-11 15:01:09

谢谢分享

清尘yt 发表于 2019-8-16 10:54:39

本帖最后由 清尘yt 于 2019-8-16 11:01 编辑

#include <stdio.h>
#include <stdlib.h>
//头插法单链表
struct Book
{
        char title;
        char author;
        struct Book *next;
};

void getInput(struct Book *book)
{
        printf("请输入书名:");
        scanf("%s",book->title);
        printf("请输入作者:");
        scanf("%s",book->author);
}

void addBook(struct Book **library)
{
        struct Book *book,*temp;
        book=(struct Book *)malloc(sizeof(struct Book));
        if(book==NULL)
        {
                printf("内存分配失败了!");
                exit(1);
        }
        getInput(book);            //输入一个结构体节点的地址,好在里面改值
        if(*library!=NULL)          //单链表头插法的两种情况,相应的操作
        {
                temp=*library;
                *library=book;
                book->next=temp;
        }
        else
        {
                *library=book;
                book->next=NULL;
        }
}

void printBook(struct Book *library)
{
        struct Book *book=library;
        while(book!=NULL)
        {
                printf("书名是:%s\n",book->title);
                printf("作者是:%s\n",book->author);
                book=book->next;            //遍历整个单链表,打印出所有的书籍!
        }
}

void releaseBook(struct Book **library)
{                                                                 //遍历整个单链表进行逐一的释放空间
        struct Book *temp;
        while(*library!=NULL)
        {
                temp=*library;
                *library=temp->next;
                free(temp);
        }
}

int main()
{
        struct Book *library=NULL; //library是头指针,指向单链表第一个元素,即存储的是单链表第一个元素的地址
        char ch;
        /*addBook(&library);       //若是通过library直接改值改不了,因为实参与形参单项传递,形参的改变不能影响实参,但如果传的是地址就可以改了
        printf("添加书籍成功!现在打印:\n");
        printf("书名是:%s\n作者是:%s\n",(*library).title,library->author); //两种形式进行操作! */
       
        while(1)                //增加用户体验的操作,可以添加想要输入的书籍并一次性打印出来!!!
        {
                printf("是否添加书籍(Y/N):");
                do                                                        //防止用户乱输入字符
                {
                        ch=getchar();
                }while(ch!='Y' && ch!='N' && ch!='y' &&ch!='n');
                if(ch=='Y' || ch=='y')
                {
                        addBook(&library);
                }
                else
                {
                        break;
                }
        }
        printf("是否打印书籍信息(Y/N):");
        do
        {
                ch=getchar();
        }while(ch!='Y' && ch!='N' && ch!='y' &&ch!='n');
        if(ch=='Y' || ch=='y')
        {
                printBook(library);                //不需要改值,所以直接传library值,即其指向的节点的地址;将单链表存储的内容一一打印出来
        }
        releaseBook(&library);                         //释放空间,刚刚malloc分配了内存空间
        return 0;
        //头插法的操作导致后录入的书籍先打印出来,因为是按照单链表里节点位置顺序打印出来的(头指针从头部遍历到尾部的结果)
}

秦111 发表于 2020-2-6 02:54:49

莫法法 发表于 2017-10-11 23:09
改成这样以后好了

void releaseLibrary(struct Book *library)


能解释一下吗?

ArmandXiao 发表于 2020-4-14 15:03:52

更新 更新

咔咔Zzy 发表于 2021-11-23 22:25:06

看完视频一脸懵逼

未来村服露娜 发表于 2021-12-12 15:53:22

清尘yt 发表于 2019-8-16 10:54
#include
#include
//头插法单链表


我直接爱你

Sean_Huang 发表于 2022-3-19 20:00:12

清尘yt 发表于 2019-8-16 10:54
#include
#include
//头插法单链表


为什么输入完书籍名之后就没有了

Sean_Huang 发表于 2022-3-20 11:19:18

为什么我的代码 输入书名之后回车没有翻译    不会接着打印”请输入作者“这个代码{:10_266:}

yjgy 发表于 2022-3-25 11:18:52

{:10_256:}

wzppp 发表于 2022-4-30 20:48:55

Sean_Huang 发表于 2022-3-19 20:00
为什么输入完书籍名之后就没有了

同问,我输入书籍后,界面输出“请输入作者”,然后就没有了,

wzppp 发表于 2022-4-30 20:57:22

wzppp 发表于 2022-4-30 20:48
同问,我输入书籍后,界面输出“请输入作者”,然后就没有了,

找到了,在分配完空间后,if条件写了一个等号,不是判断语句,错了。

Puppet16 发表于 2022-5-5 16:30:29

好好学习才能天天向上!

arouse233 发表于 2023-5-31 09:34:08

看了两遍视频,看了一些博客,终于明白了

Lijfishc@l 发表于 2024-5-16 17:22:58


不使用指针的指针,未加释放内存函数
#include <stdio.h>
#include <stdlib.h>

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

void addBook(struct Book *plibrary);
void getBook(struct Book *newBook);
void printLibrary(struct Book *plibrary);

void getBook(struct Book *newBook)
{
      newBook->next=NULL;
      printf("请输入书籍的名称:");
      scanf("%s",newBook->title);
      printf("请输入书籍的作者:");
      scanf("%s",newBook->author);
}

void addBook(struct Book *plibrary)
{
      struct Book *temp;
      temp=plibrary;
      struct Book * newBook;
      newBook=(struct Book *)malloc(sizeof(struct Book));
      if(newBook==NULL)
      {
                printf("内存分配失败了");
                exit(1);
      }
      else
      {
                if(temp->next==NULL)
                {
                        getBook(newBook);
                        temp->next=newBook;
                }
                else
                {
                        while(temp->next !=NULL)
                        {
                              temp=temp->next;
                        }
                        getBook(newBook);
                        temp->next=newBook;
                }
      }
}
void printLibrary(struct Book *plibrary)
{
      struct Book * link;
      link =plibrary;
      int count=1;
      while(link->next != NULL)
      {
                link=link->next;
                printf("第%d本书籍信息\n",count);
                printf("%s\n",link->title);
                printf("%s\n",link->author);
                count++;
      }
}

int main()
{
      static struct Book library;
      library.next=NULL;
      int ch;
      while(1)
      {
                printf("请问是否需要录入书籍:(y/n)");
                do
                {
                        ch=getchar();
                }while(ch !='y' && ch != 'n');
                if(ch=='y')
                {
                        addBook(&library);
                }
                else
                {
                        break;
                }
      }
      printf("请问是否需要打印书籍信息(y/n)");
      do
      {
                ch=getchar();
      }while(ch != 'y' && ch != 'n');
      if(ch=='y')
      {
                printLibrary(&library);
      }
      return 0;
}

页: [1]
查看完整版本: S1E45:单链表