Что мне делать, чтобы последний узел в связанном списке участвовал в сортировке пузырьков?
Я написал программу связанных списков, и я должен запрограммировать функцию сортировки пузырьков, но последний узел, похоже, не участвует в сортировке пузырьков. Я предполагаю, что, поскольку указатель перемещается в 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
Внутренний цикл sort_list()
не рассматривает последний узел во время сортировки из-за условия ptr->next!=NULL
in for
loop. Вы должны проверить его ptr
с помощью NULL
:
for(ptr = new->next; ptr != NULL; ptr = ptr->next)
^^^^
Есть несколько вещей, которые необходимо исправить.
- Основная функция должна иметь возвращаемое значение
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
используется, убедитесь, что память освобождена. Вам нужно будет перебирать список и освобождать каждый узел. - Вопросы
- Data-structures
- Что мне делать, чтобы последний узел в связанном списке участвовал в сортировке пузырьков?