2013-06-30 19 views
0

我有以下代碼:不能新創建的鏈接列表分配給另一個變量

Price *ptr=NULL; 

Price *ptr1 = ptr; 

ptr_file =fopen(pvalue,"r"); 
if (!ptr_file) 
    exit(1); 

while ((c=fgetc(ptr_file))!=EOF) 
{  
    if(c==',' && flag==2) 
    { 
     temp_price[i] = '\0'; 
     i = 0; 
     flag = 0; 
     ptr->Price = atoi(temp_price); 
     ptr->sold_cpy=0; 
    } 

    if(flag == 2) 
     temp_price[i++]=c; 

    if(c==',' && flag == 1) 
    { 
     ptr->BookId[i++]='\0'; 
     i=0; 
     flag=2; 
    } 
    if(!fflag) 
    { 
     ptr = (Price*) malloc (sizeof(Price)); 
     if (ptr==NULL) 
      exit (1); 
     flag=1; 
     fflag=1; 
    } 

    if(flag == 1) 
     ptr->BookId[i++] = c; 

    if(c=='\n') 
    { 
     ptr = ptr->Next_Price; 

     ptr = (Price*) malloc (sizeof(Price)); 
     if (ptr==NULL) 
      exit (1);  
     flag =1;    
    } 
} 
ptr->Next_Price = NULL; 
fclose(ptr_file); 

for(ptr = ptr1;ptr!=NULL;ptr=ptr->Next_Price) 
    printf("%s %d %d\n",ptr->BookId,ptr->Price,ptr->sold_cpy); 

問題是值正確分配到PTR而不是PTR1。我已經指出與PTR1節點的開頭:

Price *ptr1 = ptr; 

這裏是結構定義:

typedef struct Price_ Price; 
struct Price_{ 
char BookId[20]; 
int Price; 
int sold_cpy; 
Price * Next_Price; 
}; 

我toatally夠了什麼地方wrong..any想法?

+0

你怎麼知道它沒有正確分配? – user93353

+1

使用調試器或添加跟蹤消息。 –

+0

您不會將新節點鏈接到列表中,並且在覆蓋指針時存在內存泄漏。 –

回答

0

您尚未創建一個鏈接列表,許多問題中的代碼:

只要看看這個:

您在這裏檢索下一個環節,這是從來沒有設置指針,包含垃圾:

ptr = ptr->Next_Price; 

在這裏,你丟棄值,下一個節點分配空間,但你永遠不將其存儲在前面的節點的鏈接:

ptr = (Price*) malloc (sizeof(Price)); 

改變順序:

ptr->Next_Price = (Price*) malloc (sizeof(Price)); 
ptr = ptr->Next_Price; 

就在beginng另一個問題:你嘗試存儲頭節點(Price *ptr1 = ptr;),但在這一點上ptr爲NULL。

選擇一個調試器,並逐步執行您的程序。在將來的某個時候,你應該可以在頭腦中做同樣的事情(或者用紙筆&鉛筆),但是看起來你現在正在努力學習一些基本概念...所以最好的方法是將現實與你的程序所做的是什麼認爲是在調試器中運行它。

+0

是的,只是更新..我想還有更多的問題,但讓我們把剩下的作爲練習留給他吧。 –

+0

謝謝,它現在工作..一個問題,你已經在上面提到..其次,爲ptr分配給ptr1我需要在第一個malloc後分配它。這是非常長的任務中的一小部分。工作幾個小時使我的思想變得空白,我忘記了Malloc返回一個新地址的基本概念..無論如何,謝謝你的幫助.. !! – user2407394

相關問題