2012-05-24 63 views
1

我遇到了雙鏈表的問題,所以我有兩個問題。C雙向鏈表變量沒有正確更新

一,說明。

我做了一個struct這樣:

typedef struct team{ 
    char *name; 
    char *teamPlace; 
}Team; 

而且創造了我的名單是這樣的:

typedef struct nodeTeam{ 
    int numberOfTeams; 
    Team team; 
    struct nodeTeam *next; 
    struct nodeTeam *prev; 
}NodeTeam; 

所以,我的名單將有headtail。當我將一些Team添加到我的列表中時,我的headint numberOfTeams;將擁有我的列表中的球隊數量。 tail將包含我的清單中的最後一個元素,而head將包含Team ID後的int numberOfTeams;

我的目錄將創建這樣:

int createsListOfTeams(NodeTeam **head, NodeTeam **tail); 
int addNodeTeamsSorted(NodeTeam *head, NodeTeam **tail, Team team); 
void printListOfTeams(NodeTeam *listofTeams); 

int main() 
{ 
    NodeTeam *headTeams,*tailTeams; 
    Team eq; 
    /*Creates the doubly linked list*/ 
    if(createsListOfTeams(&headTeams,&tailTeams)){ /*See below this part of the code*/ 
     printf("\nError\n"); 
     return 0; 
    } 

    /*Teams are on a .txt file. The code for reading from a file is missing. It´s working ok so I believe it's not needed. 
    After reading one line after another it will do this 

    addNodeEquipasSorted(headTeams,tailTeams,eq); 

    where eq is a `struct` with the team data. 
    */ 

    /*Will print all the teams*/ 
    printListOfTeams(headTeams); 

    return 0; 
} 

這是創建列表的代碼:

/*Add the teams to the doubly linked list. At the end, all teams will be sorted by name*/ 
int createsListOfTeams(NodeTeam **head, NodeTeam **tail){ 
    (*head) = (NodeTeam *)malloc(sizeof(NodeTeam)); 

    if ((*head) == NULL){ 
     return -1; 
    } 
    (*head)->numberOfTeams = 0; 
    strcpy((*head)->team.teamPlace,""); 
    strcpy((*head)->team.name,""); 
    (*head)->next = NULL; 
    (*head)->prev = NULL; 

    *tail = *head; 
    return 0; 
} 

添加(按團隊名稱的順序),Team到我的清單中的代碼是這樣的:

/*Creates the doubly linked list*/ 
int addNodeTeamsSorted(NodeTeam *head, NodeTeam **tail, Team team){ 
    NodeTeam *no, *aux; 

    /*Memory alloc for a new node*/ 
    no = (NodeTeam*) malloc(sizeof(NodeTeam)); 
    if (no == NULL){ 
     return -1; 
    } 

    /*Updates the number of element of the list*/ 
    head->numberOfTeams++; 

    /*Creates a copy of tail*/ 
    aux = (*tail); 

    /*Puts team data on node*/ 
    no->team = team; 

    /*to see if the list it's empty(no it's the first element of my list) or the last node as a name "smaler" then node*/ 
    if(head == *tail || strcmp((*tail)->team.name,no->team.name) <= 0) 
    { 
     if (head == *tail){ 
      no->numberOfTeams = 1; 
     } 
     else{ 
      no->numberOfTeams = head->numberOfTeams; 
      (*tail)->numberOfTeams = no->numberOfTeams - 1; 
     } 
     no->next = (*tail)->next; 
     no->prev = *tail; 
     (no->prev)->next = no; 
     (*tail) = no; 
     aux = (*tail); 
    } 
    else{ /*If not the first element*/ 
     head = head->next; /*To advance to the first item after my head*/ 
     while(strcmp(head->team.name,no->team.name) < 0 && strcmp((*tail)->team.name,no->team.name) > 0 && head != *(tail)){ 
      head = head->next; 
      (*tail) = (*tail)->prev; 
     } 
     if(strcmp(head->team.name,no->team.name) >= 0){ 
      no->next = head; 
      no->prev = head->prev; 
      head->prev = no; 
      (no->prev)->next = no; 
      no->numberOfTeams = (no->next)->numberOfTeams; 
      (no->next)->numberOfTeams = no->numberOfTeams + 1; 
      if((no->prev)->prev != NULL){ 
       (no->prev)->numberOfTeams = no->numberOfTeams - 1; 
      } 
     } 
     else{ 
      no->next = (*tail)->next; 
      no->prev = (*tail); 
      no->numberOfTeams = (no->prev)->numberOfTeams + 1; 
      (no->prev)->next = no; 
      (no->next)->prev = no; 
     } 
    } 

    /*Puts `tail` pointing to the right position*/ 
    if (aux != (*tail)){ 
     (*tail) = aux; 
    } 

    return 0; 
} 

在我的.txt文件中我有這樣的數據:

E team;E team place 
J team;J team place 
G team;G team place 
F team;F team place 
L team;L team place 
A team;A team place 
H team;H team place 
O team;O team place 
K team;K team place 
P team;P team place 
N team;N team place 
B team;B team place 
C team;C team place 
M team;M team place 
D team;D team place 
I team;I team place 

而這是輸出。

--------------------------------------------------------- 
|      List of Teams      | 
--------------------------------------------------------- 
|  Number of Teams  |      16 | no 00740ff0 | prev 00000000 | next 00741240 | 
-------------------------------------------------------- 
| ID |  Team Name  |  Team Place  | 
-------------------------------------------------------- 
| 1 | A team    | A team place   | no 00741240 | prev 00740ff0 | next 00741450 | 
| 2 | B team    | B team place   | no 00741450 | prev 00741240 | next 007436b0 | 
| 3 | C team    | C team place   | no 007436b0 | prev 00741450 | next 00743760 | 
| 4 | D team    | D team place   | no 00743760 | prev 007436b0 | next 00741088 | 
| 5 | E team    | E team place   | no 00741088 | prev 00743760 | next 00741190 | 
| 2 | F team    | F team place   | no 00741190 | prev 00741088 | next 00741138 | 
| 3 | G team    | G team place   | no 00741138 | prev 00741190 | next 00741298 | 
| 4 | H team    | H team place   | no 00741298 | prev 00741138 | next 007437b8 | 
| 5 | I team    | I team place   | no 007437b8 | prev 00741298 | next 007410e0 | 
| 4 | J team    | J team place   | no 007410e0 | prev 007437b8 | next 00741348 | 
| 5 | K team    | K team place   | no 00741348 | prev 007410e0 | next 007411e8 | 
| 7 | L team    | L team place   | no 007411e8 | prev 00741348 | next 00743708 | 
| 8 | M team    | M team place   | no 00743708 | prev 007411e8 | next 007413f8 | 
| 8 | N team    | N team place   | no 007413f8 | prev 00743708 | next 007412f0 | 
| 9 | O team    | O team place   | no 007412f0 | prev 007413f8 | next 007413a0 | 
| 10 | P team    | P team place   | no 007413a0 | prev 007412f0 | next 00000000 | 
-------------------------------------------------------- 

有了這個輸出,我可以看到我的團隊正按照名稱添加到我的列表中。我打印內存地址的debbug顯示一切正常。問題出在團隊ID上。 It's int numberOfTeams;

所以,最後畢竟這段文字,這是我的問題:

問題1我能做些什麼來解決我的團隊的ID,即插入一個新的Team到我的清單後, ,該ID被更新爲正確的ID。

問題2雖然我的addNodeTeamsSorted正在使用身份證豁免,但我相信這是對「chopy」的algaoryth。你能推薦一些優化嗎?

感謝

回答

2

我能做些什麼來解決我的團隊ID名稱,即插入一個新的團隊,以我的名單後,該ID被更新到正確的ID。

這是一個非法的內存寫入:

(*head) = (NodeTeam *)malloc(sizeof(NodeTeam)); 

if ((*head) == NULL){ 
    return -1; 
} 
(*head)->numberOfTeams = 0; 
strcpy((*head)->team.teamPlace,""); <<------- here, and 
strcpy((*head)->team.name,"");  <<------- here 

teamPlacename被unitialised char*,所以strcpy()會寫的地方,它不應該。您需要爲這些分配內存或將它們定義爲固定大小的數組(如果可能)。

+0

謝謝。將它們定義爲固定大小的數組,但ID仍然是一個問題... – Favolas

+0

@Favolas,我不確定'ID'是什麼? – hmjd

+0

它的'int numberOfTeams;'在我的列表中'head'將包含我列表中元素的數量,每個節點上將會是團隊的ID號碼。第一隊應該是1,第二隊2等等。看我的輸出。我的ID列上的ID號碼不正確。他們應該是1至16沒有重複的數字。所以在我的'addNodeTeamsSorted'' int numberOfTeams'裏,它沒有被正確分配 – Favolas