【问题标题】:queue in c Some problems in my code or algorithm?c 中的队列 我的代码或算法中有一些问题?
【发布时间】:2018-08-07 11:46:47
【问题描述】:

如何在c中创建堆栈,程序不会只输出最后输入的所有字符串 发生了什么?不知道该写什么,但网站要求写一些东西,认为没有任何解释。当我想借助指向下一本书的链接打印所有书籍时,它只输出最后输入的内容。是否覆盖?

#include <stdio.h>
#include <string.h>

typedef struct book book;

struct book{
    book *next;
    char name[100];
    int year;
    char author[100];
};

void setter(book *aza, int number){
    char name[100];
    int year;
    char author[100];

    scanf("%s", name);
    scanf(" %d", &year);
    scanf("%s", author);

    strcpy( aza->name , name );
    aza->year = year;
    strcpy( aza->author, author );

    number--;

    if(number==0){
        return;
    }else{
        setter(&aza->next, number);
    }
}

printBooks(book *aza){
    if(aza){
         printf("%s\n", &aza->name);
         printBooks(&aza->next);
    }
}

int main()
{
    book kitap;
    int number;

    scanf("%d", &number);
    setter(&kitap, number);
    printBooks(&kitap);

    return 0;
}

【问题讨论】:

  • 请举例说明预期行为与实际行为

标签: c stack queue


【解决方案1】:
setter(&aza->next, number);

这就是问题的根源——next 指向哪里?它包含一些无用的垃圾值。试图访问它是未定义的行为。这正是你所做的。

分配内存并将其传递给 setter - 否则它会尝试访问一些随机内存并尝试在其中设置值。您可以使用malloc 分配内存并使该结构实例的next 指向它。

为了帮助您,更改将是:-

    aza->next = malloc(sizeof *(aza->next));
    setter(aza->next, number);

还有在printBooks,因为scanf 需要char* 而不是char (*)[],而且函数printBooks 应该使用book*

     printf("%s\n", aza->name);
     printBooks(aza->next);

使用一些代码的插图 - here。您还需要编写函数来释放除第一个结构实例之外的所有这些内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多