2012-05-24 1 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; 

Итак, мой список будет иметь head и tail. Когда я добавлю Team в мой список, у моего headint numberOfTeams; будет количество команд из моего списка. tail будет содержать последний элемент моего списка и int numberOfTeams; после head будет содержать идентификатор Team.

Мой список будет создан следующим образом:

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 | 
-------------------------------------------------------- 

С помощью этого вывода я вижу, что мои команды добавляются отсортированными по имени в мой список. Деббуг, который я напечатал по адресам памяти, показывает, что все в порядке. Проблема заключается в идентификаторе команды. Подмигнули int numberOfTeams;

Итак, наконец, после того, как весь этот текст, это мои вопросы:

Вопрос 1 Что я могу сделать, чтобы решить мои команды ID, то есть, после вставки нового Team в мой список , идентификатор обновляется до нужного идентификатора.

Вопрос 2 Наверху мой addNodeTeamsSorted работает с удостоверением личности, я верю, что это так, чтобы оно было «изменено». Можете ли вы порекомендовать некоторые оптимизации?

Благодаря

ответ

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 

teamPlace и name являются unitialised char*, поэтому strcpy() будет писать куда-то, что он не должен.Вы должны выделить для них память или определить их как массивы фиксированного размера (если это возможно).

+0

Спасибо. Определены как массивы фиксированных размеров, но ID все еще проблема ... – Favolas

+0

@Favolas, я не уверен, что такое 'ID'? – hmjd

+0

его 'int numberOfTeams;' в моем списке 'head' будет содержать количество элементов в моем списке и на каждом узле будет идентификационный номер команды. Первая команда должна быть 1, вторая команда 2 и так далее. Смотрите мой вывод. Идентификационные номера в столбце ID неверны. Они должны быть от 1 до 16 без повторных номеров. Итак, на моем 'addNodeTeamsSorted'' int numberOfTeams; 'он не назначен должным образом – Favolas

Смежные вопросы