使用scanf的动态数据结构

时间:2011-02-09 06:57:11

标签: c data-structures input linked-list dynamic-data

我有一个非常基本的问题,感谢您的耐心等待。

我有一个动态数据结构,只有一个整数值和一个指向下一个结构的指针。我正在使用scanf获取用户输入以获取5个值以添加到结构并尝试在结尾处打印输出。我在使用语法输入结构时遇到问题。我查看了StackOverflow和Google,但没有用(可能因为它太基本了!)

这是代码:

#include <stdio.h>

struct List
{
    int value;
    struct List *nextaddr;
};

int main()
{
    int int1, int2, int3, int4, int5;

    printf("please enter the first integer: ");
    scanf("%d", int1);
    struct List t1 = {int1};

    printf("please enter the second integer: ");
    scanf("%d", int2);
    struct List t2 = {int2};

    printf("please enter the third integer: ");
    scanf("%d", int3);
    struct List t3 = {int3};

    printf("please enter the fourth integer: ");
    scanf("%d", int4);
    struct List t4 = {int4};

    printf("please enter the fifth integer: ");
    scanf("%d", int5);
    struct List t5 = {int5};

    struct List *first;

    first = &t1;
    t1.nextaddr = &t2;
    t2.nextaddr = &t3;
    t3.nextaddr = &t4;
    t4.nextaddr = &t5;
    t5.nextaddr = NULL;

    printf("%i\n%i\n%i\n%i\n%i\n",first->value,t1.nextaddr->value,t2.nextaddr->value,t3.nextaddr->value,t4.nextaddr->value);

    return 0;
}

如何将用户输入到结构中?

2 个答案:

答案 0 :(得分:1)

一些事情 -

通常,在使用链接结构(如链接列表)时(如本例所示),使用malloc而不是堆栈为堆上的对象分配内存。这背后的基本原理是您希望链接结构的元素比创建它们的函数更长,因此堆叠分配单个单元格不太可能正常工作。您可能希望通过编写类似

的内容来创建结构
struct List* entry = malloc(sizeof(struct List));

作为后续行动,由于从用户读取链接列表单元格内容并将其添加到列表中的逻辑对于您正在阅读的每个单元格都是相同的,因此您可能不希望仅复制它的代码五次。相反,考虑编写一个这样的函数:

struct List* ReadListEntry(void) {
    struct List* entry = malloc(sizeof(struct List));
    /* ... initialize 'entry' ... */

    return entry;
}

这样,main中的代码可以缩短五倍,如果您发现代码中有任何错误(就像您似乎已经做过的那样),您只需要更改一次,而不是五次。

关于你原来的问题,我认为问题在于你在写

scanf("%d", myValue);

而不是

scanf("%d", &myValue);

第一个版本不正确,可能会在运行时导致崩溃。 scanf假设您在使用%d格式说明符时将指针提供给整数而不是整数作为参数,因此明确的&符可能是什么伤害了你。

结合上述想法使用辅助函数生成堆分配列表单元格,您可能想尝试编写这样的函数:

struct List* ReadListEntry(void) {
    struct List* entry = malloc(sizeof(struct List));

    scanf("%d", &entry->value);
    entry->nextaddr = NULL;

    return entry;
}

鉴于此,您可以重写main函数,使其比现在简单得多。我将把它作为练习留给读者。 : - )

希望这有帮助!

答案 1 :(得分:0)

scanf应该获取整数的地址,如:scanf("%d", &int1);