Необходимо отсортировать однонаправленный список. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Необходимо создать однонаправленный список и реализовать в нём все действия...Получилось сделать всё кроме сортировки...необходимо переставлять не значения а указатели...помогите кто может метод сортировки любой... Вот что у меня получилось
#include <stdio.h>
#include <stdlib.h>
 
int Add(int);
void Print(void); 
void Destroy(void);  
int Delete(int);
void Sort(void);
 
typedef struct _ELEMENT{
    int value;
    struct _ELEMENT *next;
} ELEMENT;
ELEMENT *head=NULL;
 
int main(int argc, char *argv[])
{
    int n,e,m;
    printf("Vedite kolichestvo elementov spiska : ");
    scanf("%d",&n);
    for(int i=0;i<n;i++){
    printf("element [%d] = ",i+1);
    scanf("%d",&e);
    Add(e);
    }
    //printf("//vvedite nomer ydalaemogo elementa : ");
    //scanf("%d",&m);
    //Delete(m);
    Sort();
    Print();
    Destroy();
    return 0;
}
 
void Sort(void){
    int a=1;
    ELEMENT *tmp, *pred;
    while(a==1){
        a=0;
        tmp=head;
        pred=NULL;
        while(tmp->next!=NULL){
            if(tmp->value>tmp->next->value){
                a=1;
 
           // Тут я уже потерялся в указателях
            }
        pred=tmp;
        tmp=tmp->next;
        }
    }
}

int Delete(int num){
    ELEMENT *tmp=head;
    if(num==1){
        head=head->next;
        free(tmp);
    }else{
        int ind=1;
        while(ind+1!=num){
            tmp=tmp->next;
            ind++;
        }
        ELEMENT *cur=tmp;
        cur=tmp->next;
        tmp->next=tmp->next->next;
        free(cur);
    }
    return 0;
}
 
int Add(int value){
    ELEMENT *tmp=(ELEMENT*)malloc(sizeof(ELEMENT));
    if(!tmp){
        printf("kosak");
        return 0;
    }
    if(!head){
        tmp->next=NULL;
        head=tmp;
    }else{
        ELEMENT *cur=head;
        while(cur->next)
            cur=cur->next;
        tmp->next=cur->next;
        cur->next=tmp;
    }
    tmp->value=value;
    return 0;
}
 
void Destroy(void){
    while(head){
    ELEMENT *tmp=head;
        head=head->next;
        free(tmp);
    }
}
 
void Print(void){
    ELEMENT *tmp=head;
    int num=1;
    while(tmp){
        head=head->next;
        printf("Element [%d] = %d \n",num, tmp->value);
        num++;
        tmp=tmp->next;
    }   
}

Решение задачи: «Необходимо отсортировать однонаправленный список.»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef struct NODE {
    int * val;
    struct NODE * next;
} node_t;
 
node_t * new_node(int val){
    node_t * n;
 
    if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
        return NULL;
    if ( ( n->val = (int*)malloc(sizeof(int)) ) == NULL ){
        free(n);
        return NULL;
    }
    *(n->val) = val;
    n->next = NULL;
 
    return n;
}
 
node_t * del_node(node_t * n){
    node_t * ret;
 
    if ( ! n )
        return NULL;
    ret = n->next;
    free(n->val);
    free(n);
 
    return ret;
}
 
node_t * min_node_val(const node_t * first){
    const node_t * ret = first;
    
    while ( first = first->next )
        if ( *(first->val) < *(ret->val) )
            ret = first;
 
    return (node_t*)ret;
}
 
node_t * max_node_val(const node_t * first){
    const node_t * ret = first;
 
    while ( first = first->next )
        if ( *(first->val) > *(ret->val) )
            ret = first;
 
    return (node_t*)ret;
}
 
void swap_node_values(node_t * a, node_t * b){
    int tmp = *(a->val);
    *(a->val) = *(b->val);
    *(b->val) = tmp;
}
 
typedef struct LIST {
    node_t * first;
    node_t * last;
} list_t;
 
list_t * new_list(void){
    list_t * ret;
 
    if ( ( ret = (list_t*)malloc(sizeof(list_t)) ) == NULL )
        return NULL;
 
    ret->first = ret->last = NULL;
 
    return ret;
}
 
void del_list(list_t * list){
    while ( list->first = del_node(list->first) )
        ;
    free(list);
}
 
int add_node(list_t * list, int val){
    node_t * n;
    if ( ( n = new_node(val) ) == NULL )
        return -1;
    
    if ( ! list->first )
        list->first = n;
    else 
        list->last->next = n;
    list->last = n;
 
    return 0;
}
 
void sort_ascendant(list_t * list){
    node_t * first;
    node_t * min;
 
    for ( first = list->first; first->next; first = first->next )
        if ( ( min = min_node_val(first) ) != first )
            swap_node_values(first, min);
}
 
void sort_descendant(list_t * list){
    node_t * first;
    node_t * max;
 
    for ( first = list->first; first->next; first = first->next )
        if ( ( max = max_node_val(first) ) != first )
            swap_node_values(first, max);
}
 
void dump(const list_t * list){
    const node_t * n;
 
    for ( n = list->first; n; n = n->next )
        printf("%d ", *(n->val));
    printf("\n");
}
 
int main(void){
    list_t * list;
    int i;
 
    if ( ( list = new_list() ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        exit(1);
    }
 
    printf("Enter some numbers (any letter - finish):\n");
    while ( printf("> ") && scanf("%d", &i) == 1 ){
        if ( add_node(list, i) ){
            fprintf(stderr, "Memory error!\n");
            exit(1);
        }
    }
 
    if ( ! list->first ){
        fprintf(stderr, "No data!\n");
        exit(1);
    }
 
    printf("Unsorted:   ");
    dump(list);
 
    printf("Ascendant:  ");
    sort_ascendant(list);
    dump(list);
 
    printf("Descendant: ");
    sort_descendant(list);
    dump(list);
 
    del_list(list);
    system("pause");
 
    exit(0);
}

Объяснение кода листинга программы

  1. Структура данных, используемая в коде - однонаправленный список, представленный с помощью связного списка.
  2. В начале кода определены функции для работы со связным списком:
    • new_node() - создает новый узел списка.
    • del_node() - удаляет узел списка.
    • min_node_val() - возвращает минимальное значение среди узлов списка.
    • max_node_val() - возвращает максимальное значение среди узлов списка.
    • swap_node_values() - меняет значения в двух узлах списка.
    • new_list() - создает новый список.
    • del_list() - удаляет список.
    • add_node() - добавляет новый узел в список.
    • sort_ascendant() - сортирует список в порядке возрастания.
    • sort_descendant() - сортирует список в порядке убывания.
    • dump() - выводит содержимое списка.
  3. В функции main() создается новый список и заполняется данными, введенными пользователем.
  4. Затем список сортируется в порядке возрастания и выводится на экран.
  5. После этого список сортируется в порядке убывания и также выводится на экран.
  6. В конце программы список освобождается с помощью функции del_list().

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.6 из 5
Похожие ответы