Невозможный результат в связанном списке 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 : %sn",tempNode->value );
while(tempNode->next != NULL){
tempNode=tempNode->next;
printf("latest node value : %sn", tempNode->value);
}
newNode->prev=tempNode;
newNode->next=NULL;
newNode->value=val;
printf("newly added node value : %sn", 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
Кто-нибудь может объяснить, что здесь происходит???? Я имею в виду, когда я ввел второе значение последнее значение узла должно быть первым значением, которое я ввел, но это новое значение!
Это переполнение стека или я делаю что-то не так!?
1 ответ:
Вы должны выделить новую строку Внутри цикла , а не перед ним:
#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) и code
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 динамическое выделение памяти & утечка памяти wikipages. Рассмотрим такжеvalgrind ...Скомпилировать со всеми предупреждениями и отладочной информацией (
gcc -Wall -g
) и использовать отладчик (gdb
). Или, по крайней мере, debug-вывести адрес зоны памяти, например, поставить в нескольких местах строку типаprintf("at %s:%d val=%p\n", __FILE__, __LINE__, (void*)val);