鱼C论坛

 找回密码
 立即注册
查看: 7966|回复: 17

[知识点备忘] S1E45:单链表

[复制链接]
发表于 2017-3-24 23:31:58 | 显示全部楼层 |阅读模式
购买主题 已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-11 23:05:07 | 显示全部楼层
视频里提到的那个错误是什么,求大神解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-11 23:09:46 | 显示全部楼层
改成这样以后好了

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

        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 1

使用道具 举报

发表于 2019-6-11 15:01:09 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-16 10:54:39 | 显示全部楼层
本帖最后由 清尘yt 于 2019-8-16 11:01 编辑

#include <stdio.h>
#include <stdlib.h>
//头插法单链表
struct Book
{
        char title[120];
        char author[40];
        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;
        //头插法的操作导致后录入的书籍先打印出来,因为是按照单链表里节点位置顺序打印出来的(头指针从头部遍历到尾部的结果)
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 22 反对 0

使用道具 举报

发表于 2020-2-6 02:54:49 | 显示全部楼层
莫法法 发表于 2017-10-11 23:09
改成这样以后好了

void releaseLibrary(struct Book *library)

能解释一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 15:03:52 | 显示全部楼层
更新 更新
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-23 22:25:06 | 显示全部楼层
看完视频一脸懵逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-12 15:53:22 | 显示全部楼层
清尘yt 发表于 2019-8-16 10:54
#include
#include
//头插法单链表

我直接爱你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 20:00:12 | 显示全部楼层
清尘yt 发表于 2019-8-16 10:54
#include
#include
//头插法单链表

为什么输入完书籍名之后就没有了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-20 11:19:18 | 显示全部楼层
为什么我的代码 输入书名之后回车没有翻译    不会接着打印”请输入作者“这个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-25 11:18:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-30 20:48:55 | 显示全部楼层
Sean_Huang 发表于 2022-3-19 20:00
为什么输入完书籍名之后就没有了

同问,我输入书籍后,界面输出“请输入作者”,然后就没有了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-30 20:57:22 | 显示全部楼层
wzppp 发表于 2022-4-30 20:48
同问,我输入书籍后,界面输出“请输入作者”,然后就没有了,

找到了,在分配完空间后,if条件写了一个等号,不是判断语句,错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-5 16:30:29 | 显示全部楼层
好好学习才能天天向上!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-31 09:34:08 | 显示全部楼层
看了两遍视频,看了一些博客,终于明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-16 17:22:58 | 显示全部楼层

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

struct Book
{
        char title[128];
        char author[40];
        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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-12 10:44:45 | 显示全部楼层
好好学习,天天向上,奥力给
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表