2012-12-03 69 views
0

我有一個簡單的程序,它初始化一個列表並添加n個元素。問題是它不能添加下一個n-1元素(它只是用第一個元素初始化列表)。我測試了這個條件,看起來問題是last->next=elem from add_elem函數。下面是程序:C:不能添加新元素

#include <stdio.h> 
#include <stdlib.h> 

typedef struct lista { 
    int val; 
    struct lista *next; 
} list; 

void allocate(list *p) { 
    printf("Alocating memory..."); 
    p=(list *)malloc(sizeof(list)); 
    if(p==NULL) { 
    printf("Failed! Exiting program..."); 
    exit(1); 
    } else printf("Done! \n"); 
} 

void init_list(list *first, list *last) { 
    printf("Insert first element value: "); 
    scanf("%d", &(first->val)); 
    printf("Initializing list...\n"); 
    allocate(first); 
    first->next=NULL; 
    last=first; 
    if(first->next==NULL && last==first) { 
    printf("Done initializing! \n"); 
    printf("Last value: %d\n", last->val); 
    } 
} 

void add_elem(list *elem, list *last, int i) { 
    printf("Insert the %dth element value: ",i); 
    scanf("%d", &elem->val); 
    printf("Adding element to list...\n"); 
    allocate(elem); 
    elem->next=NULL; 
    last->next=elem; 
    last=elem; 
    if(elem->next==NULL && last==elem && last->next==elem) { 
    printf("Done adding! \n"); 
    printf("Last value: %d\n", last->val); 
    } 
    //printf("%d\n", first->next->val); 
} 

void print_list(list *first) { 
    printf("\nCurrent list: \n"); 
    list *it; 
    for(it=first;it!=NULL;it=it->next) { 
    printf("%d ",it->val); 
    } 
} 

int main() { 
    list first, last, elem; 
    int n,i; 
    printf("Insert number of elements: "); 
    scanf("%d",&n); 
    init_list(&first,&last); 
    for(i=2;i<=n;i++) { 
    add_elem(&elem,&last,i); 
    } 
    print_list(&first); 
    return 0; 
} 
+2

」它不能添加下一個n-1元素「那麼,會發生什麼?爲什麼你這麼想?說明。 –

回答

2

在你allocate功能,您分配內存並將其分配給當地變量p。這個內存將會丟失,因爲當一個函數返回時,局部變量的變化不會被保存。

您也不需要需要來分配該內存,因爲您已經通過在main函數中聲明列表爲非指針來做到這一點。 「

+0

我應該補充,即使有理由調用'malloc',在大多數情況下,幾乎每個'malloc'調用都應該有一個最終的'free'關聯。像大多數規則一樣,這有例外,但總的來說,如果你正在做的事情是一個很好的檢查。 – Iguananaut

+0

我想你需要解釋爲什麼p是本地的。 – UmNyobe

+0

好吧,所以我放棄了分配函數,因爲它似乎沒有必要,但問題依然存在。它只通過'init_list'函數向列表中添加第一個元素。在'if(elem-> next == NULL && last == elem && last-> next == elem)'子句中,'last-> next == elem'在測試後失敗,所以看起來我無法鏈接最後一個元素添加到我要添加的元素。 – user1872816