2014-10-27 55 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的变化不会因为你把它作为一个值,而不是作为一个指针的功能之外的任何影响。