Что мне делать, чтобы последний узел в связанном списке участвовал в сортировке пузырьков?

88
8

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

Мой код:

#include<stdio.h>
#include<stdlib.h>
typedef struct node_type{
int data;
struct node_type *next;
}node;

typedef node *list;
list head;

void traverse()
{
list temp;
temp=head;
printf("\nThe Data is: \n");
while(temp!=NULL)
{
printf("%d\n",temp->data);
temp=temp->next;
}
printf("\n\n");
}

void sort_list()
{
list new,ptr;
int temp;
for(new=head;new->next!=NULL;new=new->next)
{
for(ptr=new->next;ptr->next!=NULL;ptr=ptr->next)
{
if(new->data > ptr->data)
{
temp=new->data;
new->data=ptr->data;
ptr->data=temp;
}
}
}
traverse();
}

void main()
{
list temp,new;
head=NULL;
int n;
char ch;
temp=(list) malloc(sizeof(node));
printf("\nGive data: ");
scanf("%d",&temp->data);
head=temp;
printf("\n");
printf("Enter more data(y/n): ");
scanf("\n%c",&ch);
while(ch=='y')
{
new=(list) malloc(sizeof(node));
printf("Give data: ");
scanf("%d",&new->data);
temp->next=new;
temp=new;
printf("\nEnter more data(y/n): ");
scanf("\n%c",&ch);
}
temp->next=NULL;
traverse(head);
printf("\n\nDo you want to sort the Link-List(y/n): ");
scanf("\n%c",&ch);
if(ch=='y')
{
sort_list();
}
}

Вход: 2 3 1 5 4

Выход: 1 2 3 5 4

спросил(а) 2018-07-22T07:18:00+03:00 1 год, 4 месяца назад
2
Решение
43

Внутренний цикл sort_list() не рассматривает последний узел во время сортировки из-за условия ptr->next!=NULL in for loop. Вы должны проверить его ptr с помощью NULL:

for(ptr = new->next; ptr != NULL; ptr = ptr->next)
^^^^

ответил(а) 2018-07-22T07:39:00+03:00 1 год, 4 месяца назад
Еще 1 ответ
46

Есть несколько вещей, которые необходимо исправить.

    Основная функция должна иметь возвращаемое значение int not void. Есть вызовы traverse, которые проходят head в качестве аргумента, который даст ошибку. Либо обновите функцию traverse за исключением аргумента list, либо исправьте эти вызовы.

    Функция sort_list inner для условия цикла должна заканчиваться, когда ptr == NULL т.е.

    for(ptr=new->next; ptr != NULL; ptr=ptr->next)

Функция может быть более защитной, если head имеет NULL, первый цикл цикла вызовет ошибку сегментации, когда new->next != NULL будет оцениваться. У вас может быть инструкция if в начале функции для защиты от этого.

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

ответил(а) 2018-07-22T07:41:00+03:00 1 год, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема