Witam,
mam za zadanie posortowanie listy przez wybieranie najmniejszego elementu :) Siedzę nad tą funkcją dzień ale nie daje rady... coś ciągle jest nie tak, w pierwszym obiegu pętli jest okej ale dalej jest jakiś szczegół i program się sypie, ktoś pomoże - zobaczy, gdzie jest błąd?
Lista jest jednokierunkowa, wszystkie funkcje oprócz sortowania wydają się działać poprawnie.
main
#include "stdafx.h"
#include "lista.h"
#include <cstdlib>
#include <iostream>
#include <stdio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
printf("Program nr 4 - LISTA JEDNOKIERUNKOWA \n");
ListItem* lista = NULL;
TworzListe(&lista);
DodajElement(lista,15);
DodajElement(lista, 3);
DodajElement(lista, -15);
DodajElement(lista, 5);
DodajElement(lista, 2);
DodajElement(lista, 8);
DodajElement(lista, -2);
DodajElement(lista, 5);
DodajElement(lista, 2);
WyswietlListe(lista);
// printf("\n po usunieciu elementu 5 \n");
sortuj_wybierajac(lista);
//WyswietlListe(lista); - nie działa - czemu?
// Usun_z_Listy(lista, 1);
system("pause");
return EXIT_SUCCESS;
}
lista.h
#ifndef _LIST_INC_
#define _LIST_INC_
typedef struct tagListItem{
int wartosc;
tagListItem * next;
}ListItem, *LP_ListItem;
void TworzListe(ListItem** glowaL);
void DodajElement(ListItem* glowaL, int war);
void WyswietlListe(ListItem* glowaL);
void Dodaj_do_Listy(ListItem* glowaL, int rozmiar);
void Uwolnij_liste(ListItem** glowaL);
void Usun_z_Listy(ListItem* glowaL, int element);
void sortuj_wybierajac(ListItem* glowaL);
#endif
lista.cpp - !
#include "stdafx.h"
#include <stdlib.h>
#include "lista.h"
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
void TworzListe(ListItem** glowaL)
{
if (*glowaL == NULL)
{
ListItem *p = (ListItem*)malloc(sizeof(ListItem));
memset(p, 0, sizeof(ListItem));
*glowaL = p;
}
else
printf("Lista już istnieje ! ");
}
void DodajElement(ListItem* glowaL, int war)
{
ListItem *p = (ListItem*)malloc(sizeof(ListItem));
p->wartosc = war;
p->next = glowaL->next;
glowaL->next = p;
// glowaL = p; --> niepotrzebne?
}
void WyswietlListe(ListItem* glowaL)
{
int i = 0;
ListItem* lista = glowaL;
while (1)
{
printf("Wartosc elementu %d i wskaznik %p \n", lista->wartosc, lista->next);
if (lista->next == NULL) break;
lista = lista->next;
};
}
void Dodaj_do_Listy(ListItem* glowaL, int rozmiar)
{
srand((unsigned int)time(NULL));
for (int i = 0; i < rozmiar; i++)
{
DodajElement(glowaL, rand() % 50);
}
}
void Usun_z_Listy(ListItem* glowaL, int element)
{
//przesuniecieGlowy o element jeden mniejszy
for (int i = 0; i < (element-2); i++)
{
if (glowaL->next == NULL) break;
glowaL = glowaL->next;
}
//USUWANIE ELEMENTU
ListItem* temp = glowaL->next->next; //wskaznik pokazujacy na element ktory PRZYPINAMY
ListItem* temp2 = glowaL->next;
glowaL->next = temp;
free(temp2);
}
ListItem* przesun_liste(ListItem* glowaL,int element)
{
for (int i = 0; i < element ; i++)
{
if (glowaL->next == NULL) break;
glowaL = glowaL->next;
}
return glowaL;
}
int ktory_element(ListItem* glowaL, ListItem* element)
{
int i = 0;
printf("\n dwie wartosci %d %d \n", glowaL->wartosc, element->wartosc);
while (1)
{
glowaL = glowaL->next;
if (glowaL == element) break;
i++;
}
printf("\n wartosc i %d \n", i);
return i;
}
ListItem* min_element(ListItem* glowaL)
{
ListItem* MinL = glowaL;
while (1)
{
if (glowaL->wartosc < MinL->wartosc)
{
MinL = glowaL;
}
if (glowaL->next == NULL) break;
glowaL = glowaL->next; //przesuwamy glowe
}
return MinL;
}
void sortuj_wybierajac(ListItem* glowaL)
{
ListItem* MinL = glowaL;
ListItem* PoczL = glowaL;
ListItem* przesuwany = glowaL;
ListItem* nast = glowaL;
int i = 0;
int j = 1;
//szukamy minimum
while (1)
{
MinL = min_element(PoczL);
i = ktory_element(glowaL, MinL);
przesuwany = przesun_liste(glowaL, i);
// MAMY DO DYSPOZYCJI 3 WSKAZNIKI : MINL, POCZTL, CZWARTA
printf("wartosc minl: %d pokazujacy na wskaznik %p \n", MinL->wartosc, MinL->next);
printf("wartosc pocztl: %d pokazujacy na wskaznik %p \n", PoczL->wartosc, PoczL->next);
printf("wartosc czwarta: %d pokazujacy na wskaznik %p \n", przesuwany->wartosc, przesuwany->next);
printf("\n \n \n");
ListItem* temp2 = MinL->next;
ListItem* temp = glowaL;
// glowaL = MinL;
glowaL->next = PoczL->next;
temp->next = temp2;
przesuwany->next = temp;
//MinL->next = temp;
printf("po zmianach \n");
printf("wartosc glowy: %d pokazujacy na wskaznik %p \n", glowaL->wartosc, glowaL->next);
printf("wartosc czwarta: %d pokazujacy na wskaznik %p \n \n \n", przesuwany->wartosc, przesuwany->next);
//printf("war czwarta: %d pokazujacy na wskaznik %p \n", czwarta->wartosc, czwarta->next);
if (j< 3) WyswietlListe(glowaL);
// PoczL->next = temp2;
//glowaL->next = bezu;
// glowa ta sama, poczatek listy inny
// ustawienie nowe min
MinL->wartosc = glowaL->wartosc;
PoczL = przesun_liste(glowaL, j);
printf("wartosc glowy po PRZESUNIECIU: %d pokazujacy na wskaznik %p \n", glowaL->wartosc, glowaL->next);
printf("wartosc poczL po PRZESUNIECIU: %d pokazujacy na wskaznik %p \n", PoczL->wartosc, PoczL->next);
if (PoczL->next == NULL) break;
przesuwany = PoczL;
//PoczL = glowaL->next;
if (j == 3) break;
j++;
}
}