2014-01-11 69 views
2

我一直在試圖創建一個簡單的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 

任何人能解釋一下是怎麼回事???? 我的意思是當我輸入第二個值時 最近的節點值必須是我輸入的第一個值,但是它是新輸入的值!

它是一個堆棧溢出或我做錯了什麼!?

+1

編譯所有警告和調試信息(例如'gcc -Wall -g')。然後**使用調試器**(例如'gdb')。你也可以使用'%p'格式控制來調試打印指針... –

+0

我已經使用gcc -o 4編譯了它4.c -mmacosx-version-min = 10.5 -Wall -g' – abzcoding

回答

2

你應該,而不是之前它分配一個新的字符串循環

#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在堆內分配的內存區域!閱讀memory management & C dynamic memory allocation & memory leak wikipages。請考慮valgrind ...

編譯所有警告和調試信息(gcc -Wall -g)並使用調試器(gdb)。或者至少調試打印存儲區的地址,例如在幾個地方放一條線如

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

@Random_Default_User:什麼是這很奇怪嗎?你的鏈表包含指針'val'。你最初用''one''填充'val',然後用''two''填充它。但是這兩次,它指向相同的內存位置,並且鏈接列表仍包含它。 – ruakh

+0

你在這裏是當我已經移動了'String val = malloc(sizeof(char)* 100)的結果;'for循環內部:'請輸入值(節點#0):1 head value:頭 新添加的節點值:一個 請輸入值(節點#1):二 頭值:頭 最新的節點值:一個 新添加的節點值:two' – abzcoding

+0

任何人都可以解釋爲什麼動環的內部的分配解決問題? – abzcoding