Czysty C - lista jednokierunkowa - segregacja

0

Witam,
Mam zadanie, ze na liscie jednokuerunkowej sa boki prostakata tzw. kazdy element listy ma dwie liczby typu float i sa to boki prostakata. Zadanie polega na tym, aby posegregowac pola prostokotow w taki sposob, ze te ktore sa mniejsze od sredniej pól to je segregujemy rosnąca, reszte wrzucamy na poczatek listy. No i mam taki problem, ze obliczylem ilosc elementow listy, policzylem srednia, ale teraz nie wiem w jaki sposob dokonac tej segregacji... Przechodze se przez liste jak napotkam na element ktorego pole jest mniejsze od sredniej to ustawiam go na koniec, a potem jakos przejsc juz po tej czesciowo posegregowanej liscie i poprzemieniac tylko te elementy ktore sa mniejsze od sredniej? Nie wiem za bardzo jak to sortowac, poki co zrobilem taki kod:

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

struct lista {
float a, b;
struct lista *n;
};
typedef struct lista ELEMENT;
typedef ELEMENT *ADRES;
ELEMENT *poczatek = NULL;

void addToList(float x, float y);
void FunkcjaZamiana(ADRES poczatek);

int main()
{
    addToList(10, 15);
    addToList(5.4, 1.5);
    addToList(11, 66.5);
    addToList(99, 1.5);
    addToList(15, 25);
    addToList(10.5, 16);
    addToList(7, 8);
    addToList(15.5, 11.5);
    addToList(10, 20);
    FunkcjaZamiana(poczatek);
    return 0;
}

void addToList(float x, float y)
{
    struct lista *newElement = malloc(sizeof(struct lista));
    newElement->a = x;
    newElement->b = y;
    if(poczatek != NULL){
        struct lista *help = poczatek;
        while(help != NULL){
            if(help->n == NULL){
                help->n = newElement;
                newElement->n = NULL;
            }
            help = help->n;
        }
    }
    else{
        poczatek = newElement;
        poczatek->n = NULL;
    }
}

void FunkcjaZamiana(ADRES poczatek)
{
    float suma=0, srednia=0, licznik_elementow=0;
    ADRES help = poczatek, pom = poczatek, help2, help3;
    if(poczatek == NULL)
    {
        printf("Lista jest pusta.\n");
    }
    else
    {
        if(poczatek->n == NULL)
        {
            printf("Na liscie jest tylko jeden element.\n");
        }
        else
        {
            while(help != NULL)
            {
                suma += (help->a * help->b);
                licznik_elementow++;
                help = help->n;
            }
            srednia = (suma / licznik_elementow);
            printf("Srednie pole wynosi: %.2f\n", srednia);
        }
    }
    /* Zamiana */
    while(pom->n != NULL)
    {
        help2 = pom;
        if((pom->a * pom->b) < srednia)
        {
            help3->a = pom->a;
            help3->b = pom->b;

            pom->a = pom->n->a;
            pom->b = pom->n->b;

            pom->n->a = help3->a;
            pom->n->b = help3->b;

            pom = pom->n;
        }
        else
        {
            pom = help2->n;
        }
    }
    /* Wypisanie naszej nowej listy */
    while(poczatek != NULL)
    {
        printf("%.2f\t%.2f\t%.2f\n", poczatek->a, poczatek->b, poczatek->a * poczatek->b);
        poczatek = poczatek->n;
    }
}
0

Możesz przejść po elementach listy źródłowej i skopiować do drugiej docelowej listy elementy mniejsze od średniej, następnie je posortować, następnie na początek listy docelowej dodać elementy większe lub równe.

0

Musze to wykonac tylko na tej jednej liscie jednokierunkowej, nie moge tworzyc dodatkowych list / tablic

1

Wywal to i napisz używając następujących deklaracji:

typedef struct
  {
   float x,y;
  } rectangle;

typedef struct node
  {
   rectangle rect;
   struct node *next;
  } node;
 
typedef struct
  {
   node *head,*tail;
  } list;

rectangle makeRectangle(float x,float y);
node *makeNode(rectangle rect,node *next)
void addToList(list *lst,float x,float y); 
void showList(list *lst);

Wtedy sortowanie będzie proste i przyjemne, jak sobie pościelisz tak się wyśpisz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1