Двойной связанный список не работает - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь отсортировать двусвязный список в порядке возрастания.Я перебираю код снова и снова и не могу найти в нем никаких логических недостатков, поэтому я предполагаю, что проблема в другом месте.Когда я пытаюсь напечатать отсортированный список, консоль возвращает 0, ничего не печатая (функция печати не виновата, поскольку она уже была протестирована)

Вот код, который я сейчас выполняю:

typedef struct dados_temp{
    float temp;
    float incerteza;
    char pais[100];
    char cidade[100];
    float angle;
    int hemisferio;
    int dia;
    int mes;
    int ano;
}   dados_temp;

typedef struct Node{
    dados_temp payload;
    struct Node *next;
    struct Node *prev;
}   Node;



//receives the original head pointer
//returns sorted list's head pointer    
Node** SortDate(struct Node** head)
{
    struct Node *i, *j;

    for( i = head; i != NULL; i = i->next )//iterates over the entire list
    {
        //if the data value of the next node is bigger
        if ( i->payload.ano > i->next->payload.ano )
        {
            //swaps the data value between i and i->next
            //SwapNodes was tested and  it is working
            SwapNodes(i, i->next);

            //the current value of i->next (former value of i)
            //is compared to all the previous values
            //and keeps swapping until a smaller value is found
            for (j = i->next; j->payload.ano < j->prev->payload.ano;)
            {
                SwapNodes(j, j->prev);
            }
        }

    }
return head;

}//sort

Я знаю, что, вероятно, существуют более простые способы сортировки двусвязных списков, но я пытаюсь выяснить, почему этот список не работает.

Заранее спасибо!

РЕДАКТИРОВАТЬ: показывает все задействованные функции:

#include <stdio.h>
#include <stdlib.h>


typedef struct dados_temp{
    float temp;
    float incerteza;
    char pais[100];
    char cidade[100];
    float angle;
    int hemisferio;
    int dia;
    int mes;
    int ano;
}   dados_temp;

typedef struct Node{
    dados_temp payload;
    struct Node *next;
    struct Node *prev;
}   Node;


Node * CreateCitiesList();
Node * CreateCountriesList();
Node * Intervalos(struct Node*, int[]);
void PrintBack(struct Node*);

struct Node* CreateNode (dados_temp x)
{
    struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));

    NewNode->payload = x;
    NewNode->next = NULL;
    NewNode->prev = NULL;

    return NewNode;
}

}


void Print (struct Node* head)
{
    struct Node* temp = head;

    while ( temp != NULL)
    {
        printf("%d-%d-%d \n", temp->payload.ano, temp->payload.mes, 
               temp>payload.dia);
        fflush(stdout);
        temp = temp->next;
    }
    printf("\n");
}

Node* SortDate (struct Node*);

void SwapNodes (struct Node*, struct Node*);

int main(int argc, char* argv[])
{
    CreateCountriesList();
}


Node* CreateCountriesList()
{
    char linha[150] = {NULL};
    char cabecalho[100] = {NULL};
    int i = 0;
    dados_temp New_Entry;
    dados_temp tail;
    int *ptr_head_co;

    struct Node* head_countries = NULL;
    struct Node* Node = NULL;

    FILE *inputf;
    inputf = fopen("tempcountries_all.csv", "r");

    if (inputf == NULL)
    {
        printf("Nao da pa abrir o fitchas boi");
        exit(EXIT_FAILURE);
    }
    //gets rid of the first line
    fgets(cabecalho, 100, inputf);

    for (i = 0; i <  577462 ; i++)
    {
        fgets(linha, 150, inputf);

        //scans the date(amongst other things) from file (yyyy-mm-dd)    
        sscanf(linha, "%d-%d-%d,%f,%f,%[^,]s", &New_Entry.ano, 
            &New_Entry.mes,&New_Entry.dia, &New_Entry.temp, &New_Entry.incerteza,  
            &New_Entry.pais);

        if (head_countries == NULL)
        {
            head_countries = CreateNode(New_Entry);
            Node = CreateNode(New_Entry);
        }
        else
        {
            head_countries = InsertHead(head_countries, New_Entry);
        }
    }

    fclose(inputf);
    head_countries = RemoveNodes(Node);

    SortDate(head_countries);

    Print(head_countries);

    return head_countries;
}

Node* SortDate(struct Node* head)
{
    struct Node *i, *j;

    for( i = head; i != NULL; i = i->next )
    {
        if ( i->payload.ano > i->next->payload.ano )
        {
            SwapNodes(i, i->next);

            for (j = i->next; j->payload.ano < j->prev->payload.ano;)
            {
                SwapNodes(j, j->prev);
            }
        }
    }
}//sort


void SwapNodes(struct Node* node1, struct Node* node2)
{
    dados_temp temp = node1->payload;
    node1->payload = node2->payload;
    node2->payload = temp;
}
...