我一直在尝试创建一个简单的 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);
}
不要忘记稍后释放
堆内分配的内存区域!阅读 memory management & C dynamic memory allocation & memory leak维基页面。另请考虑valgrind ...
使用所有警告和调试信息进行编译 (gcc -Wall -g
) 并使用调试器 (gdb
)。或者至少,调试打印内存区域的地址,例如在几个地方放一行像
printf("at %s:%d val=%p\n", __FILE__, __LINE__, (void*)val);
关于c - C 链表中不可能的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060398/