problem z lista part 2 ..

zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

problem z lista part 2 ..

Post autor: zxc18 »

mam takie zadanie, i za chiny nie moge znalezc tu bledu: zadanie z serii znalezc blad .. mozecie pomoc ??

Kod: Zaznacz cały

// list.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <cstdio>

using namespace std;

struct list_node
{
   int number;
   list_node *next;
};

void add_element(list_node *list, list_node *current)
{
   list_node *node = list->next;

   list->next = current;
   current->next = node;
}

void remove_element(list_node *list, int number)
{
   while(list->next)
   {
      if(list->next->number == number)
      {
         list_node *node = list->next;
         list->next = list->next->next;
         delete node;
      }
      else
      {
         list = list->next;
      }
   }
}


int _tmain(int argc, _TCHAR* argv[])
{
   list_node *list = new list_node;
   list->number = -1;
   list->next = 0;

   // dodawanie element�w do listy (sprawdzi�, czy elementy dodawane s� na jej pocz�tek, czy na koniec)
   for(int i = 0; i < 10; ++i)
   {
      list_node *current = new list_node;
      current->number = i;

      add_element(list, current);
   }
   // usuwanie element�w z listy o zadanym numerze
   int to_delete[] = {7, 0, 1, 9, 5, 5, 3, 145};
   for(int i = 0; i < sizeof(to_delete)/sizeof(int); ++i)
   {
      remove_element(list, to_delete[i]);
   }

   // wyswietlenie pozostalych elementow listy
   while(list)
   {
      printf("Element nr %i
", list->number);
      list = list->next;
   }
   return 0;
} 
dziex
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

problem z lista part 2 ..

Post autor: smiechowiec »

ale o jaki błąd chodzi czy to zagadka ?

sprawdziłem ten program i moim zdaniem wszystko działa.
musiałem jedynie usunąć plik nagłówkowy #include "stdafx.h" bo go nie posiadam
oraz zmieniłem deklaracje
int _tmain(int argc, _TCHAR* argv[])
na tradycyjną
int main(int argc, char* argv[])

funkcja add_element dodaje nowy element na początku listy, dlatego rozbiłem ją na dwie
add_first to obecna add_element
oraz
add_last dodająca element na końcu listy
kod po tych zmianach działa poprawnie i identycznie jak przed

Kod: Zaznacz cały

#include <cstdio>

struct list_node {
   int number;
   list_node *next;
};

void add_first(list_node *list, list_node *current) {
   list_node *node = list->next;
   list->next = current;
   current->next = node;
}

void add_last(list_node *list, list_node *current) {
   while(list->next) {
      list = list->next;
   }
   list->next = current;
   current->next = NULL;
}

void remove_element(list_node *list, int number) {
   while(list->next)    {
      if(list->next->number == number) {
         list_node *node = list->next;
         list->next = list->next->next;
         delete node;
      }
      else
         list = list->next;
   }
}

int wypisz(list_node *list) {
   while(list) {
      printf("Element nr %i
", list->number);
      list = list->next;
   }
  return 0;
}

int main(int argc, char* argv[]) {
   list_node *list = new list_node;
   list->number = -1;
   list->next = 0;

   // dodawanie elementów do listy (sprawdzió, czy elementy dodawane są na jej poczótek, czy na koniec)
   for(int i = 0; i < 10; ++i) {
      list_node *current = new list_node;
      current->number = i;
      add_last(list, current);
   }
   puts("Dodalismy 10 elementow");
   wypisz(list);
   // usuwanie elementów z listy o zadanym numerze
   int to_delete[] = {7, 0, 1, 9, 5, 5, 3, 145};
   for(int i = 0; (unsigned) i < sizeof(to_delete)/sizeof(int); ++i)
      remove_element(list, to_delete[i]);

   // wyswietlenie pozostalych elementow listy
   puts("Po usunieciu elementow o numerach 7, 0, 1, 9, 5, 5, 3, 145");
   wypisz(list);
   return 0;
}
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

problem z lista part 2 ..

Post autor: zxc18 »

Tresc zadania od wykladowcy w mailu : w ponizszym programie wskazac bład:
program ... o tyle wiem .. czyli cos musze wskazac a ja nie mam zielonego pojecia co to ma robic i po co bardzo prosze o pomoc

[ Dodano: 5 Stycznia 2008, 22:44 ]
moglibyscie wyjasnic jeszcze o co chodzi z tym usuwaniem elementow nr 145 ?
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

problem z lista part 2 ..

Post autor: smiechowiec »

Usuwanie elementów o zadanym numerze powoduje usunięcie takiego elementu jeżeli istnieje.
W tym programie nie ma elementu 145 jak również dwa razy elementu 5.
Jeżeli byłoby kilka elementów 5 to wszystkie byłyby usunięte w pierwszym kroku usuwania, nie ma potrzeby kilkukrotnego usuwania.

Ewentualnym błędem funkcji usuwającej jest brak możliwości usunięcia pierwszego elementu czyli -1.
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

problem z lista part 2 ..

Post autor: zxc18 »

hmm ale jak bys odpisal wykladowacy na takie zadanie ?^^
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

problem z lista part 2 ..

Post autor: smiechowiec »

Pierwszy element -1 jest zawsze pierwszy nie można go usunąć ani dodać elementu na początku listy, bo kolejne zawsze są dodawane za pierwszym z -1. Nie wiem czy to błąd czy -1 to korzeń drzewa, który nie powinien być z jakiś względów usunięty.
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

problem z lista part 2 ..

Post autor: zxc18 »

mozna to jakos naprawic ? :) dzieki za pomoc kolego ^^

[ Dodano: 6 Stycznia 2008, 12:02 ]
wykladowca odpisal mi:
" Jak Pan zapewne pamięta, element ten został do listy wstawiony
specjalnie, tak aby ułatwić inne operacje (w szczególności usuwania
elementów).To raczej nie jest błąd programu - raczej sposobu użycia. Generalnie -
należy pisać koda tak, żeby w funkcji 'main' nie można było go zepsuć ;) Wycieki będą albo i nie - ale o tym następnym razem ;) "

help :D to juz nie wiem jaki jest blad ... zaradzcie cos ... prosze
ODPOWIEDZ