не забудьте увеличить два указателя.

ужно сделать, это прочитать входной файл в связанный список. Часть файла:

Имя А, 25
NameB, 33
NameC, 23
NameD, 39

А после мне нужно отсортировать по номеру (пузырьковая сортировка) и записать его в другой файл.

Вот что у меня есть:

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

struct node{
    char name[20];
    int number;
    struct node *next;
    struct node *prev;
}*head;

int main(void) {

    struct node *temp;
    temp = malloc(sizeof(struct node));
    temp->next = NULL;
    head = temp;

    FILE *ifp;
    char fnamer[100] = "";
    char line[128];
//    printf("\n\nPlease Enter the Full Path of the file: \n");
//    scanf("%s",&fnamer);

    ifp = fopen("mintaadatok.txt", "r");
    if (ifp == NULL) {
        printf("\n%s\" File NOT FOUND!", fnamer);
        exit(1);
    }

    int c = 0;

    char buffer[1024];
    memset(buffer, 0, 1024);
    while (c < 15) {
        fgets(buffer, 1024, ifp);
        sscanf(buffer, "%19[^,], %d", temp->name, &temp->number);
        printf("%d %s %d\n", c, temp->name, temp->number);
        temp->next = malloc(sizeof(struct node));
        temp = temp->next;
        temp->next = NULL;
        c++;
    }

    int i,step;
    for (temp = head; temp; temp = temp->next) {
        printf("%s", temp->name);
        printf("%d\n", temp->number);
        for(step=0;step<10-1;++step)
            for(i=0;i<10-step-1;++i)
            {
                temp->next = malloc(sizeof(struct node));
                if(temp->number>temp->next)
                {
                    temp=temp->number;
                    temp->number=temp->next;
                    temp->next=temp;
                }
            }
    }
    printf("In ascending order: ");
}

Можете ли вы помочь мне отсортировать эти данные?

 Aditi Rawat04 дек. 2017 г., 19:26
Во-первых, вы не написали никакого кода для метода сортировки; Вы просто заполняете список. Во-вторых, для выполнения практически любых операций со связанными списками требуетсяhead указатель, который вы не сохранили здесь. И, наконец, если у вас естьhead Указатель, простой поиск в Google (заголовок вашего вопроса) даст полезные результаты.
 Aditi Rawat04 дек. 2017 г., 19:40
Тогда вы, вероятно, должны показать нам код сортировки, который вы написали, и тогда мы сможем помочь. :)
 khlan04 дек. 2017 г., 19:18
@AditiRawat Я не могу отсортировать связанный список
 khlan04 дек. 2017 г., 19:19
@coderredoc да, это очень поможет
 Aditi Rawat04 дек. 2017 г., 19:17
С какой именно проблемой вы сталкиваетесь?

Ответы на вопрос(3)

Я не просмотрел весь твой код. Однако это, очевидно, неверно, например, из-за неправильного порядка размещения узлов в этом цикле.

while (c < 15) {
    fgets(buffer, 1024, ifp);
    sscanf(buffer, "%19[^,], %d", temp->name, &temp->number);
    printf("%d %s %d\n", c, temp->name, temp->number);
    temp->next = malloc(sizeof(struct node));
    temp = temp->next;
    temp->next = NULL;
    c++;
}

Таким образом, последний узел будет иметь элементы данных с неопределенными значениями, кроме элемента данныхnext.

Я пытаюсь ответить на ваш вопроскак написать функцию сортировки пузырьков для односвязного списка.

Написать функцию пузырьковой сортировки для односвязного списка - непростая задача для таких начинающих, как вы и я. Например, вам нужно правильно написать функцию подкачки для узлов списка.

Вот ты где.

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

struct node
{
    char name[20];
    int id;
    struct node *next;
};

int push_back( struct node **head, const char *name, int id )
{
    struct node *tmp = malloc( sizeof( struct node ) );
    int success = tmp != NULL;

    if ( success )
    {
        while ( *head != NULL ) head = &( *head )->next;

        strcpy( tmp->name, name );
        tmp->id = id;
        tmp->next = NULL;

        *head = tmp;
    }

    return success;
}

void display( struct node **head )
{
    for ( struct node *current = *head; current != NULL; current = current->next )
    {
        printf( "{ %s, %d } ", current->name, current->id );
    }
}

void swap( struct node **current )
{
    struct node *tmp = ( *current )->next->next;
    ( *current )->next->next = *current;
    *current = ( *current )->next;
    ( *current )->next->next = tmp;
}


void bubble_sort( struct node **head, int cmp( const void *, const void * ) )
{
    if ( *head != NULL )
    {
        for ( struct node *last = NULL, *swapped = NULL; ( *head )->next != last; last = swapped )
        {
            swapped = ( *head )->next;

            for ( struct node **first = head; ( *first )->next != last; first = &( *first )->next )
            {
                if ( cmp( ( *first )->next, *first ) < 0 )
                {
                    swap( first );
                    swapped = ( *first )->next;
                }
            }
        }
    }
}

int cmp_id( const void *a, const void *b )
{
    const struct node *left  = a;
    const struct node *right = b;

    return ( right->id < left->id ) - ( left->id < right->id );
}

int cmp_name( const void *a, const void *b )
{
    const struct node *left  = a;
    const struct node *right = b;

    return strcmp( left->name, right->name );
}

int main(void) 
{
    struct node *head = NULL;

    push_back( &head, "NameA", 25 );
    push_back( &head, "NameB", 33 );
    push_back( &head, "NameC", 23 );
    push_back( &head, "NameD", 39 );    

    display( &head );
    putchar( '\n' );

    bubble_sort( &head, cmp_id );

    display( &head );
    putchar( '\n' );

    bubble_sort( &head, cmp_name );

    display( &head );
    putchar( '\n' );

    return 0;
}

Выход программы

{ NameA, 25 } { NameB, 33 } { NameC, 23 } { NameD, 39 } 
{ NameC, 23 } { NameA, 25 } { NameB, 33 } { NameD, 39 } 
{ NameA, 25 } { NameB, 33 } { NameC, 23 } { NameD, 39 } 

В демонстрационной программе сначала список сортируется по идентификаторам, а затем по именам.

Таким образом, все, что вам сейчас нужно, это правильно построить список из данных в используемом файле.

 Michi20 дек. 2017 г., 11:50
@VladfromMoscow Я согласен, но информируя ОП оfree было бы неплохо :).
 khlan11 дек. 2017 г., 22:50
Спасибо за ваш ответ, выглядит хорошо :)
 Vlad from Moscow20 дек. 2017 г., 11:57
@Michi Его задача состоит в том, чтобы правильно написать все функции для односвязного списка / Моя задача состояла в том, чтобы показать, как такой список можно отсортировать с помощью пузырьковой сортировки.
 Michi20 дек. 2017 г., 11:39
@ Влад из Москвы. Ты забылfree() == >>>total heap usage: 5 allocs, 1 frees, 1,152 bytes allocated
 Vlad from Moscow20 дек. 2017 г., 11:43
@Мити, я не забыл. Это демонстрационная программа, которая включает в себя только те функции, которые необходимы для обеспечения сортировки.

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

    pptr=head;  //for the previou element
    ptr=head->next;//for the next element

   if(pptr->value > ptr->value)  //comparing the value in linked list

не забудьте увеличить два указателя.

Решение Вопроса
while(c<10)
{
    fgets(buffer, 1024, ifp);
    sscanf(buffer, "%19[^,], %d", temp->name, &temp->id);
    ...
}

while(fgets(buffer, 1024, ifp)){...} Это остановится, когда больше не будет строк для чтения. Это не имеет значения, потому что память освобождается, как только вы выходитеmain но в практическом приложении вы запускаете код в разных функциях и вам нужно освободить память.

Связанный список не совсем корректен, потому что вы вызываете дополнительныйmallocэта память не может быть освобождена.

Сортировка связанного списка с использованием пузырьковой сортировки не тривиальна. Лучший способ - прочитать файл в массивnode, с помощьюrealloc, Затем используйте пузырьковую сортировку в массиве. Кроме того, вы можете преобразовать связанный список в массив (бессмысленно!)

В противном случае, чтобы использовать пузырьковую сортировку в связанном списке, вы можете сделать два цикла, чтобы просмотреть список, затем сравнить и изменить значения каждого узла.

В приведенном ниже примере вставляются записи в начало списка (это не имеет значения, поскольку список сортируется) и запускается пузырьковая сортировка:

struct node 
{
    char name[20];
    int id;
    struct node *next;
}*head;

int main(void) 
{
    FILE *ifp = fopen("mintaadatok.txt", "r");
    if (!ifp)
    {
        printf("file error\n");
        return 0;
    }

    char buffer[1024];
    memset(buffer, 0, 1024);
    while(fgets(buffer, 1024, ifp))
    {
        struct node *temp = malloc(sizeof(struct node));
        temp->next = NULL;

        if(sscanf(buffer, "%19[^,], %d", temp->name, &temp->id) != 2)
        {
            free(temp);
            break;
        }

        if(!head)
        {
            head = temp;
        }
        else
        {
            temp->next = head;
            head = temp;
        }
    }

    //bubble sort here:
    struct node *loop1 = head;
    while(loop1)
    {
        int swapped = 0;
        struct node *loop2 = loop1->next;
        while(loop2)
        {
            if(loop1->id > loop2->id)
            {
                //swap the values for `name` and `id`
                //but don't change the `next` pointers
                char name[20];
                strcpy(name, loop1->name);
                strcpy(loop1->name, loop2->name);
                strcpy(loop2->name, name);

                int id = loop1->id;
                loop1->id = loop2->id;
                loop2->id = id;
                swapped = 1;
            }

            loop2 = loop2->next;
        }

        //if there were no swaps then list is already sorted
        if (!swapped)
            break;

        loop1 = loop1->next;
    }

    //print the list:
    loop1 = head;
    while(loop1)
    {
        printf("%s %d\n", loop1->name, loop1->id);
        loop1 = loop1->next;
    }

    return 0;
}
 Barmak Shemirani05 дек. 2017 г., 01:48
Редактировать: Добавленоswapped значение для пузырьковой сортировки. Это распространено в пузырьковой сортировке.

Ваш ответ на вопрос