2014-03-25 46 views
0

我只是想寫一個簡單的函數來添加一個朋友到UserAccount列表。所有的信息都是通過參數提供的。如果用戶已經在列表中,我不需要再次添加他,但顯示記錄表明他已經在列表中。我寫了這段代碼。不知道這是否正確,有沒有改善代碼的建議?這是否工作?添加一個新用戶在c程序中列出

int add_friend(UserAccount* user, char Circle, UserAccount* friend) 
{ 
    struct UserAccountNode *p; 

    p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode)); 

    while (p != NULL) 
     if(stricmp(user, p->friend) == 0){ 

      p->next = head; // inserting at the beginning 
      head = p; 
     } 
     else { 

      printf("%d already exists", friend) 
     }; 
} 
+1

在其他部分中添加'break;'。 – Rohan

+0

'if' * may * be missing'{}' –

+0

你試過了嗎?實際上,一半所需的代碼缺失。 –

回答

2

您的代碼至少有兩個問題:

  1. while (p != NULL)

    如果pNULL,這將是一個無限循環,因爲你沒有在循環體中改變p或使用break等語句跳出。

  2. stricmp(user, p->friend)

    您使用的是未初始化的變量,這

    p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode)); 
    

    只分配的結構,但您在while循環使用它之前,你永遠不會初始化。

其他錯誤是可能的,比如你從來不使用friend參數,參數stricmp()可能是錯誤的,等等。

3

「不知道這是正確的」 - 它做你想要它做什麼?如果是這樣,它可能是正確的;如果不。嗯...

不,它無處附近正確。錯誤列表使得報廢全部都是。這樣的事情包括(但不限於):

  • 你聲稱要有條件地添加新的朋友,但只有當他們是不是已經在列表中。然而,第一個你做的事情是分配空間的東西,你甚至不知道你需要嗎?

  • 您的環路沒有可能滿足的退出條件(除非malloc()實際上失敗)。在任何時候爲p,唯一的退出條件的說法,曾經分配給的功能,這給它分配一個動態分配的,你甚至可以不需要第一行之後增加任何。即你有一個無限循環。

  • 您正在傳遞UserAccount*stricmp作爲第一個參數,該參數預計爲const char*

  • 您在比較p->frienduser。但你剛剛分配了什麼p分。它的friend成員是不確定的,即沒有定義的內容,但是您將該未定義的內容發送到stricmp()以與輸入參數user進行比較。這會調用未定義的行爲

  • 的比較邏輯是向後。 stricmp()返回0,如果字符串是不區分大小寫的等於;沒有不同。你的邏輯(即使你並未因上述的現有項目調用不確定的行爲)至少試圖將項目添加到,只有當他們是已經存在的列表。

  • 在列表中兩次迭代後,如果出現奇蹟了,如果表達式評估爲真兩次,你已經創建了一個圓形自引用節點和孤兒,你原本的深淵任何列表。

  • 您正在發送friendUserAccount*printf"%d"格式說明符。雖然這可能不會崩潰你的程序,這是沒有的,在少更不確定的行爲。如果您想打印一個指針值與printf()使用"%p"

  • 未使用的函數的參數是誠實您的後顧之憂至少。他們可能沒有被使用,但從好的一面來看,他們同樣沒有被錯誤地使用;對於userfriend不能說的東西。

我不打算髮光你關於「好功夫」或「不錯的嘗試」。有沒有機會,這甚至代碼編譯,絕對正確的機會,它可能永遠運行。您需要查看您正在嘗試實施的實際算法,並重復使用查看C中指針和動態內存的使用情況。

相關問題