C链表中不可能的结果

绝对编码

我一直在尝试创建一个简单的c链表,但结果却很有趣

这是我的代码:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef char * String;

typedef struct node{
    String value;
    struct node * next;
    struct node * prev;
}Node;

struct node * createLinkList(){
    struct node * root=malloc(sizeof(Node));
    root->value="head";
    root->prev=NULL;
    root->next=NULL;
    return root;
}

Node * insert(String val,Node * root){
    Node * tempNode=root;
    Node * newNode=malloc(sizeof(Node));
    printf("head value : %s\n",tempNode->value );
    while(tempNode->next !=  NULL){
        tempNode=tempNode->next;
        printf("latest node value : %s\n", tempNode->value);
    }
    newNode->prev=tempNode;
    newNode->next=NULL;
    newNode->value=val;
    printf("newly added node value : %s\n", newNode->value);
    tempNode->next=newNode;
    return root;
}

int main (int argc, char const *argv[])
{
    Node * dblList=createLinkList();
    String val=malloc(sizeof(char)*100);
    for (int i = 0; i < 2; ++i)
    {
        printf("please enter value(node #%i): ",i);
        scanf("%s",val);
        dblList=insert(val,dblList);
    }
}

这是我得到的结果:

please enter value(node #0): one
head value : head
newly added node value : one
please enter value(node #1): two
head value : head
latest node value : two
newly added node value : two

任何人都可以解释这是怎么回事????我的意思是,当我输入第二个值时,最新节点值必须是我输入的第一个值,但这是新输入的值!

是堆栈溢出还是我做错了!!

巴西尔·斯塔林凯维奇

您应该在循环分配一个新字符串,而不是在它之前:

#define LEN 100
for (int i = 0; i < 2; ++i)
{
    char* val=malloc(LEN);
    memset (val, 0, LEN);
    printf("please enter value(node #%i): ",i);
    fflush(NULL);
    fgets(val, LEN, stdin);
    dblList=insert(val,dblList);
}

实际上,您最好使用getline(3)和代码

for (int i = 0; i < 2; ++i)    {
    char* line=NULL;
    size_t linsiz=0;
    printf("please enter value(node #%i): ",i);
    fflush(NULL);
    ssize_t linlen = getline(&line,&linsiz,stdin);
    dblList=insert(line,dblList);
}

不要忘了以后free再分配堆中的内存区域!阅读内存管理C动态内存分配以及内存泄漏维基页面。还考虑valgrind ...

编译所有警告和调试信息(gcc -Wall -g),并使用调试器(gdb)。或至少调试打印内存区域的地址,例如在几行中

    printf("at %s:%d val=%p\n", __FILE__, __LINE__, (void*)val);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#泛型中这是不可能的吗?

来自分类Dev

为什么在C中不可能重载?

来自分类Dev

AMPL中不可能的推论上限

来自分类Dev

C ++不可能的指针行为

来自分类Dev

弹性搜索:不可能获得桶结果

来自分类Dev

了解“不可能”

来自分类Dev

不可能的NullPointerException

来自分类Dev

C++20 可能和不可能?

来自分类Java

为什么在C#泛型中这是不可能的?

来自分类Dev

不可能返回数组在C中实际上意味着什么?

来自分类Dev

为什么不可能从Objective-C目标文件中隐藏符号?

来自分类Dev

在使用 C# 的 Selenium 页面对象模型中鼠标悬停是不可能的

来自分类Dev

在C#8中,如何检测不可能的空检查?

来自分类Dev

在Python中删除数据中不可能的值

来自分类Dev

Node.js中的无限循环是不可能的吗?

来自分类Dev

ABAP中本地接口的相互引用不可能?

来自分类Dev

在React Native中运行mount()不可能吗?

来自分类Dev

为什么在Haskell中不可能分割整数?

来自分类Python

减少Python中的循环是不可能的吗?

来自分类Java

您如何处理Java中的“不可能”异常?

来自分类Java

堆转储中不可能的Java内存引用

来自分类Dev

Lambda表达式中的不可能值

来自分类Dev

是否不可能在订阅中捕获错误?

来自分类Dev

DS中的Ember设置数组->不可能吗?

来自分类Dev

不可能在硒中定位元素

来自分类Dev

获取在 django 中不可能发生的 http 响应

来自分类Dev

Tkinter标签中的不可能更改文本

来自分类Dev

在 int 子类中重写 int 值是不可能的?

来自分类Dev

在导轨中组装多个模型的关系-不可能吗?