鱼C论坛

 找回密码
 立即注册
查看: 642|回复: 9

[已解决]S1E46 链表

[复制链接]
发表于 2022-2-23 22:46:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么改成这样不行
void addBook(struct Book *library)
{
        struct Book *book;
        static struct Book *tail;
        
        book = (struct Book *)malloc(sizeof(struct Book));
        if(book == 0)
        {
                printf("内存分配失败了!\n");
                exit(1);
        }
        
        getInput(book);
        
        if(library != NULL)
        {
                tail->next = book;
                book->next = NULL; 
        }
        else
        {
                library = book;
                book->next = NULL;
        }
        
        tail = book;
}
...
addBook(library);
最佳答案
2022-2-28 10:38:06

要改变一级指针的指向,需要用二级指针
一级指针无法改变一级指针的指向
$ cat main.c
#include <stdio.h>

int x;

void func(int *p) {
    printf("x: %p\n", &x);
    printf("p: %p\n", p);
    p = &x;
    printf("p: %p\n", p);
}

int main(void) {
    int *a = NULL;
    printf("x: %p\n", &x);
    printf("a: %p\n", a);
    func(a);
    printf("a: %p\n", a);
    return 0;
}
$ gcc-debug -o main main.c
$ ./main
x: 0x564470ec15a0
a: (nil)
x: 0x564470ec15a0
p: (nil)
p: 0x564470ec15a0
a: (nil)
$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-23 23:09:31 | 显示全部楼层
这不是二维数组规范写法呗
好好遵守人家的规则呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 18:37:22 | 显示全部楼层
把代码上全,问题 描述清楚。
你复制代码上来的时候不要用代码格式。(你的代码中有代码格式不兼容的字符)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-27 23:31:08 | 显示全部楼层
ba21 发表于 2022-2-27 18:37
把代码上全,问题 描述清楚。
你复制代码上来的时候不要用代码格式。(你的代码中有代码格式不兼容的字符 ...

这个是原本的
void addBook(struct Book **library)
{
        struct Book *book, *temp;
       
        book = (struct Book *)malloc(sizeof(struct Book));
        if(book == 0)
        {
                printf("内存分配失败了!\n");
                exit(1);
        }
       
        getInput(book);
       
        if(*library != NULL)
        {
                temp = *library;
                *library = book;
                book->next = temp;
        }
        else
        {
                *library = book;
                book->next = NULL;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-27 23:31:52 | 显示全部楼层
ba21 发表于 2022-2-27 18:37
把代码上全,问题 描述清楚。
你复制代码上来的时候不要用代码格式。(你的代码中有代码格式不兼容的字符 ...

这个是我改过的
void addBook(struct Book *library)
{
        struct Book *book, *temp;
       
        book = (struct Book *)malloc(sizeof(struct Book));
        if(book == 0)
        {
                printf("内存分配失败了!\n");
                exit(1);
        }
       
        getInput(book);
       
        if(library != NULL)
        {
                temp = library;
                library = book;
                book->next = temp;
        }
        else
        {
                library = book;
                book->next = NULL;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-27 23:38:55 | 显示全部楼层
LeaflLit 发表于 2022-2-27 23:31
这个是我改过的
void addBook(struct Book *library)
{
把代码上全,问题 描述清楚。


就是要你发完整代码,发完整代码是什么意思?
就是字面意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-28 09:26:02 | 显示全部楼层
人造人 发表于 2022-2-27 23:38
就是要你发完整代码,发完整代码是什么意思?
就是字面意思



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

struct Book
{
        char title[128];
        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 == 0)
        {
                printf("内存分配失败了!\n");
                exit(1);
        }
       
        getInput(book);
       
        if(library != NULL)
        {
                temp = library;
                library = book;
                book->next = temp;
        }
        else
        {
                library = book;
                book->next = NULL;
        }
}

void printLibrary(struct Book *library)
{
        struct Book *book;
        int count = 1;
       
        book = library;
       
        while(book != NULL)
        {
                printf("Book%d", count);
                printf("书名:%s", book->title);
                printf("作者:%s", book->author);
                book = book->next;
                count++;
                putchar('\n');
        }
       
        putchar('\n');
}


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

        }
}

int main(void)
{
        struct Book *library = 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);
        }
       
        releaseLibrary(library);
       
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-28 10:38:06 | 显示全部楼层    本楼为最佳答案   

要改变一级指针的指向,需要用二级指针
一级指针无法改变一级指针的指向
$ cat main.c
#include <stdio.h>

int x;

void func(int *p) {
    printf("x: %p\n", &x);
    printf("p: %p\n", p);
    p = &x;
    printf("p: %p\n", p);
}

int main(void) {
    int *a = NULL;
    printf("x: %p\n", &x);
    printf("a: %p\n", a);
    func(a);
    printf("a: %p\n", a);
    return 0;
}
$ gcc-debug -o main main.c
$ ./main
x: 0x564470ec15a0
a: (nil)
x: 0x564470ec15a0
p: (nil)
p: 0x564470ec15a0
a: (nil)
$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-28 11:09:02 | 显示全部楼层
人造人 发表于 2022-2-28 10:38
要改变一级指针的指向,需要用二级指针
一级指针无法改变一级指针的指向

不能通过形参改变实参的指向的地址  是这个意思吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-28 11:34:40 | 显示全部楼层
LeaflLit 发表于 2022-2-28 11:09
不能通过形参改变实参的指向的地址  是这个意思吗

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 10:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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