2014-09-20 66 views
1

我有一個方法,添加一個條目到表中。這些條目是人的姓名和地址。防止重複項被添加(C程序)

int rtable_add(RESIZABLE_TABLE * table, char * name, void * value) { 

    table->array[table->currentElements].name = strdup(name); 
    table->array[table->currentElements].value = value; 
    table->currentElements++; 
    int i = 0; 
    for(i = 0; i < table->currentElements;i++) { 
     if(strcmp(table->array[i].name, name) == 0) { 
      table->array[i].value = value; 
     } 
    } 
    return 0; 
} 

但是,如果我再次通過相同名稱的方法,但通過不同的地址,它應更新舊條目用新的地址(即價值),但它不應該把它作爲一個全新的入口。例如,

如果我給一組條目 -

1)喬治 「126葡萄街」

2)阿什利 「889葡萄街」

3)喬治「556葡萄街「

該程序應該只更新喬治的地址(即值),但不應該在表中添加另一個重複的條目。

我的代碼的問題是,我做的方式,這是它給了我 -

---什麼,我抵達---

1)喬治「556葡萄街「

2)阿什利 」889葡萄街「

3)喬治 」556葡萄街「

--EXPECTED--

1)喬治 「556葡萄街」

2)阿什利 「889葡萄街」

+0

參見[從表中刪除元素](HTTP://計算器。com/questions/25954964 /)。 – 2014-09-21 03:29:57

回答

1

移動for循環分配之前:

int i = 0; 
for(i = 0; i < table->currentElements;i++) { 
    if(strcmp(table->array[i].name, name) == 0) { 
     table->array[i].value = value; //change the value 
     return 0; //dont add a new one 
    } 
} 
table->array[table->currentElements].name = strdup(name); 
table->array[table->currentElements].value = value; 
table->currentElements++; 

瓦爾特

1

的問題是開頭。首先創建一個新條目,將其添加到表中,然後修改循環中的現有條目。我會建議先搜索匹配的條目,並且只有在找不到任何東西時才添加一個新條目。

運行代碼時發生了什麼,是否創建了條目#3並將其添加到表中,然後在for循環中修改條目#1。

0

你的代碼做的第一件事是插入傳遞的名稱和值在數組的最後一個新的條目:

table->array[table->currentElements].name = strdup(name); 
table->array[table->currentElements].value = value; 

它做的下一件事就是去通過表尋找任何具有相同的名字,他們的值設置爲一個傳遞,這在你的榜樣將同時更新原來的條目和一個剛剛上漲到年底的功能項:

int i = 0; 
for(i = 0; i < table->currentElements;i++) { 
    if(strcmp(table->array[i].name, name) == 0) { 
     table->array[i].value = value; 
    } 
} 

順便說一句,你的strdup ()的名字,但沒有價值。我不知道這是否是有意的。