Так что я пытаюсь сортировать связанный список целых чисел, но, похоже, не выясняет, как правильно это сделать, моя идея состояла в том, чтобы взять неупорядоченный список, найти наибольшее значение из него , и поместить его в другой список. Поскольку я не верю, что смог удалить узел из исходного списка, не будучи дважды связанным, я планировал дать узлу из списка 1 нулевое значение, тем самым удалив его статус как наибольшее значение. Из-за этого я намеревался запустить его определенное количество раз, каждый раз, когда вы находите следующее наибольшее значение, пока список 1 не будет равен 0, а список 2 - упорядоченная версия того, что было в списке 1. Я создал функцию для этого, но, похоже, она не работает, хотя я не могу найти проблему.сортировка связанного списка с использованием другого списка
Функции
#include <stdio.h>
#include <stdlib.h>
#include "functions.h"
struct num_node *create(struct num_node *list, int x){
struct num_node *current;
if (list == NULL){
list = (struct num_node*)malloc(sizeof(struct num_node));
list->num = x;
list->next = NULL;
return(list);
}
else{
current = (struct num_node *)malloc(sizeof(struct num_node));
current->num = x;
current->next = list;
return(current);
}
}
void print_nums(struct num_node *list) {
struct num_node *current;
for (current = list; current != NULL; current = current->next)
printf("%d\t", current->num);
}
struct num_node *sort_nums(struct num_node *list1, struct num_node *list2){
struct num_node *current;
struct num_node *large = list1;
for (int i = 0; i < 25; i++){
for (current = list1; current != NULL; current = current->next){
if (current->num > large->num){
large = current;
}
}
create(list2, large->num);
large->num = 0;
return(list2);
}
}
int sum(struct num_node *list){
int total = 0;
struct num_node *current;
for (current = list; current != NULL; current = current->next){
total = total + current->num;
}
return total;
}
float average(struct num_node *list){
float total = 0;
float count = 0;
struct num_node *current;
for (current = list; current != NULL; current = current->next){
total = total + current->num;
count++;
}
return total/count;
}
MAIN
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "functions.h"
int main(){
struct num_node *head = NULL;
struct num_node *new_head = NULL;
srand(time(NULL));
for (int i = 1; i <= 25; i++){
int x = rand() % 100;
head = create(head, x);
}
print_nums(head);
sort_nums(head, new_head);
printf("\n");
printf("\n");
print_nums(new_head);
printf("\n");
printf("\n");
printf("The total of all numbers is: ");
printf("\t%d\n", sum(new_head));
printf("The average of the numbers is: ");
printf("\t%.3f\n", average(new_head));
}
«Поскольку я не верю, что смог удалить узел из исходного списка, если он не был дважды связан». Фактически вы также можете удалить узел в отдельно связанном списке, вам просто нужно иметь ссылку на его предшественник. –