2014-10-27 77 views
0

我一直在C中編寫一個雙向鏈表,即使將元素插入列表後面的函數對我來說似乎是正確的,也不會添加該元素。調試表明,這些值分配給相應的Pacijent實例,但是,列表中的正面背面仍然是NULL不向雙向鏈表添加元素的函數

下面的代碼:

struct Pacijent 
{ 
    char ime[10]; 
    [...] 
    Pacijent *prev; 
    Pacijent *next; 
}; 

Pacijent noviPacijent(char i[], char p[], char io[], int jmb[], double v, double t, int s) 
{ 
    Pacijent *novi = (Pacijent*)malloc(sizeof(Pacijent)); 
    memcpy(novi->ime, i, strlen(i)+1); 
    [...] 
    return *novi; 
} 

struct Lista 
{ 
    Pacijent *front; 
    Pacijent *back; 
}; 

void assign(Pacijent p1, Pacijent p2) 
{ 
    memcpy(p1.ime, p2.ime, strlen(p1.ime)+1); 
    [...] 
} 

void insertBack(Pacijent p, Lista l) 
{ 
    Pacijent *novi = (Pacijent*)malloc(sizeof(Pacijent)); 
    assign(*novi, p); 
    if (l.back == NULL) 
    { 
     l.front = l.back = novi; 
     novi->prev = NULL; 
     novi->next = NULL; 
    } 
    else 
    { 
     novi->prev = l.back; 
     l.back->next = novi; 
     novi->next = NULL; 
     l.back = novi; 
    } 
} 

int main() 
{ 
    Lista *lista = (Lista*)malloc(sizeof(Lista)); 
    lista->back = lista->front = NULL; 

    int jmb2[13] = { 1, 2, 0, 1, 9, 9, 3, 0, 0, 0, 0, 0, 0 }; 
    [...] 
    Pacijent p2 = noviPacijent("Mladen", "Markovic", "Milan", jmb2, 1.85, 75, 21); 

    insertBack(p2, *lista); 
} 

回答

3

看:

void insertBack(Pacijent p, Lista l) 

這個函數有一個利斯塔值作爲參數,而不是一個利斯塔指針。這意味着如果您更改了關於l的任何內容,它將不會對該函數產生影響。當您致電insertBack時,您實際上正在複製您的列表,然後將一個元素添加到臨時列表中。

編輯: 同樣與您assign功能發生,您對p1的變化不會因爲你把它作爲一個值,而不是作爲一個指針的功能之外的任何影響。