2012-03-10 122 views
0

這就是我定義我的節點:單鏈表插入。

struct node 
{ 
    char familyName[1023]; 
    char firstName[1023]; 
    char position; 
    int value; 
    struct node *next; // points to the next node in list 
} Node; 

我需要插入功能,將檢查重複的姓氏和公正基礎上添加姓氏的球員(無論是名字)。另外,我必須根據他們的位置對球員進行排序,所以所有的守門員將是首先,然後是守軍。

這就是我已經開始的,但我似乎被卡住,不確定該怎麼做。請幫忙。

struct Node* insert (struct Node *head) 
{ 
    struct Node *temp; 

    if (head == NULL) 
    { 
     head=(struct Node *)malloc(sizeof(struct Node)); 
     if(head==NULL) 
     { 
      printf("Error! memory is not available\n"); 
      exit(0); 
     } 
    } 
     printf(" family name: "); 
     safegets(head->familyName, MAX_LENGTH+1); 

     printf(" first name: "); 
     safegets(head->firstName, MAX_LENGTH+1); 

     printf(" position: "); 
     scanf("%c", &(head->position)); 
     getchar(); 

     printf(" value: "); 
     scanf("%d", &(head->value)); 
     getchar(); 
} 

不過,我覺得我沒有做正確,應該有其他節點,將存儲的姓在前名的地位和價值,然後比較,然後把它添加到頭部。請幫忙。

+0

作業?如果是這樣,請使用標籤。 – Matthias 2012-03-10 06:39:25

+1

您提到的功能只有代碼才能從用戶那裏獲得輸入。你似乎沒有在這裏檢查重複用戶的代碼。請顯示該代碼,這將有助於回答您的問題。 – Gangadhar 2012-03-10 06:39:44

回答

0

有很多事情你必須考慮。 首先是一個單一的鏈表,一個體面的數據結構事先知道的事情? 你知道每支球隊中可以有這麼多球員。而且您沒有標準C中的預製搜索或排序功能。實際上,您至少在「查找」至少兩個字段,名稱字段和位置字段。

如果你可以使用外部庫,看看glib http://developer.gnome.org/glib/2.30/glib-Doubly-Linked-Lists.html例如。具有插入到有序列表中的功能。這在這裏會很方便。

下一個小提示:Don使用scanf獲取用戶輸入,最好使用fgets和sscanf之外的組合。

現在給你的代碼。它沒有顯示任何嘗試在列表中保留訂單。因此,您必須在每次插入時都運行列表。而且因爲它是一個單鏈表,所以至少需要檢查當前元素名稱和以下元素名稱。

假設你有亞當 - >奔在您服務,您要添加安東 ,那麼你必須要檢查的第一個名字亞當<安東和 第二個名字,有你發現安東<本。所以你必須在亞當和本之間插入。

對於您需要打破鏈表(僞代碼(未經測試)) insert_after =亞當 insert_before =奔 爲newElement - >未來= insert_before insert_after - >未來=爲newElement ....

所以你必須小心。