У меня проблема с дважды связанным списком, поэтому у меня есть два вопроса.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
в мой список, у моего head
int 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
работает с удостоверением личности, я верю, что это так, чтобы оно было «изменено». Можете ли вы порекомендовать некоторые оптимизации?
Благодаря
Спасибо. Определены как массивы фиксированных размеров, но ID все еще проблема ... – Favolas
@Favolas, я не уверен, что такое 'ID'? – hmjd
его 'int numberOfTeams;' в моем списке 'head' будет содержать количество элементов в моем списке и на каждом узле будет идентификационный номер команды. Первая команда должна быть 1, вторая команда 2 и так далее. Смотрите мой вывод. Идентификационные номера в столбце ID неверны. Они должны быть от 1 до 16 без повторных номеров. Итак, на моем 'addNodeTeamsSorted'' int numberOfTeams; 'он не назначен должным образом – Favolas