zagubiony Napisano Styczeń 15, 2010 Zgłoś Share Napisano Styczeń 15, 2010 Jestem tak zdesperowany, że muszę prosić o pomoc Mam problem z dwoma zagadnieniami dot. list jednokierunkowych: 1. wstawianie elementu pomiędzy dwa wskazane elementy listy 2. usuwanie elementów listy Problem nr. 1: KODstruct lista_lin { char d; struct lista_lin *nast; }; typedef struct lista_lin Element; typedef Element *Lista; int main(int argc, char *argv[]) { Lista pocz,start,e1,e2,q; pocz = (Lista)malloc(sizeof(Element)); pocz->d = 'a'; pocz->nast = NULL; pocz->nast = (Lista)malloc(sizeof(Element)); pocz->nast->d = 'b'; pocz->nast->nast = NULL; pocz->nast->nast = (Lista)malloc(sizeof(Element)); pocz->nast->nast->d = 'c'; pocz->nast->nast->nast = NULL; start = pocz; e1 = pocz; e2 = pocz->nast; q = pocz->nast->nast; q->nast = e2; e1->nast = q; return 0; } Kawałek kodu składa się z listy (dane: a,b,c). Program ma na celu zmianę 3ciego elemetu z drugim. Wszystko jest dla mnie jasne do momentu następujących linijek kodu: KOD q->nast = e2; e1->nast = q; [Przemyślenia, dosyć chaotyczne...] Moje wątpliwości... q->nast wychodzi poza kolejkę (4ty element listy ? no way...) lub można to traktować jako wskaźnik, ale jeżeli dla elementu reprezentowanego przez "q" nadpiszemy zawartość elementu "e2" to sensowne byłoby gdyby zawartość tego pola w strukturze została nadpisana, ale tak się nie dzieje... nie dzieje się nic dopóki nie zostanie wywołana druga linia ww. kodu. Druga linia moim zdaniem tez jest bezcelowa bo znowu nie wiem jak mam traktować e1->nast ? Czy traktować to jako jakiś wskaźnik na drugi element (ale wtedy przeczy to pierwszemu przypisaniu w pierwszej linijce kodu) czy jako pierwszy element listy, ale to też nie ma sensu, bo wychodziłoby na to, iż pierwszym elementem stanie się b lub c - napisałem lub, ponieważ w moim rozumowaniu to powinno zostać wstawione po wcześniejszych przypisaniach elementów, ale tak nie jest.... wstawianie przebiega pomyślnie czyli otrzymuje liste z zamienionymi elementami (dane :a,c,B). Próbowałem też zrobić tak, aby wskaźnik pierwszego elementu wskazywał na wskaźnik 3ciego elementu lub sam element ale też bez skutku. KODpocz->nast = pocz->nast->nast; Problem nr. 2: Zakładajmy, iż korzystam z powyższej listy i chcę usunąc drugi element (pocz wskazuje na pierwszy element). KOD pocz=pocz->nast; free(pocz); W tym momencie mam usunięty (?) drugi element i wszystko co znajduje się PO nim. Dlaczego tak się dzieje ? Jak temu zapobiec ? Proszę o pomoc w naprostowaniu moich braków Link do komentarza Udostępnij na innych stronach More sharing options...
KaYou Napisano Styczeń 16, 2010 Zgłoś Share Napisano Styczeń 16, 2010 Usuwasz element ktory wskazuje na cos. zrob kopie tego na co wskazuje usuwany element. Nastepnie wskaz poprzednikiem usuwanego na ten skpoiowany "(2b || !(2b)) == question" W. Shakespeare http://jakubniwa.pl - świat sztucznej inteligencji Link do komentarza Udostępnij na innych stronach More sharing options...
zagubiony Napisano Styczeń 16, 2010 Autor Zgłoś Share Napisano Styczeń 16, 2010 Usuwasz element ktory wskazuje na cos. zrob kopie tego na co wskazuje usuwany element. Nastepnie wskaz poprzednikiem usuwanego na ten skpoiowany Ok, usuwanie już opanowane Pojawił się jeszcze 1 problem przy wywoływaniu funkcji z parametrem elementu listy, kod: KOD#include <stdio.h> #include <stdlib.h> struct lista { int liczba; struct lista *nast; }; typedef struct lista ELEMENT; typedef ELEMENT *LISTA; int min(ELEMENT *pierwszy) { int min; ELEMENT *temp; if(pierwszy=NULL) return 0; min = pierwszy->liczba; temp = pierwszy; while (temp!=NULL) { if(min>temp->liczba) min = temp->liczba; } temp=temp->nast; return 0; } int main(int argc, char *argv[]) { LISTA nowy,pocz,*wsk; pocz = nowy; nowy = (LISTA)malloc(sizeof(ELEMENT)); //1 nowy->nast = NULL; nowy->nast = (LISTA)malloc(sizeof(ELEMENT)); //2 nowy->nast->nast = NULL; nowy->nast->nast = (LISTA)malloc(sizeof(ELEMENT)); //3 nowy->nast->nast->nast = NULL; nowy->nast->nast->nast = (LISTA)malloc(sizeof(ELEMENT)); //4 nowy->nast->nast->nast->nast = NULL; nowy->nast->nast->nast->nast = (LISTA)malloc(sizeof(ELEMENT)); //5 nowy->nast->nast->nast->nast->nast = NULL; nowy->nast->nast->nast->nast->nast = (LISTA)malloc(sizeof(ELEMENT)); //6 nowy->nast->nast->nast->nast->nast->nast = NULL; nowy->liczba = 1; nowy->nast->liczba = 2; nowy->nast->nast->liczba = 3; nowy->nast->nast->nast->liczba = 4; nowy->nast->nast->nast->nast->liczba = 5; nowy->nast->nast->nast->nast->nast->liczba = 6; for (; nowy; nowy=nowy->nast) printf("%d\n",nowy->liczba); min(&pocz); system("PAUSE"); return 0; } Czy błąd tkwi w wywołaniu funkcji tzn. w min(&pocz); ? Program uruchamia się z ostrzeżeniem, ale zaraz się wywala... Ostrzeżenie kompilatora: 53 C:\Dev-Cpp\Projects\main.c [Warning] passing arg 1 of `min' from incompatible pointer type Link do komentarza Udostępnij na innych stronach More sharing options...
KaYou Napisano Styczeń 16, 2010 Zgłoś Share Napisano Styczeń 16, 2010 min() pobiera wskaznik a nie adres "(2b || !(2b)) == question" W. Shakespeare http://jakubniwa.pl - świat sztucznej inteligencji Link do komentarza Udostępnij na innych stronach More sharing options...
zagubiony Napisano Styczeń 16, 2010 Autor Zgłoś Share Napisano Styczeń 16, 2010 min() pobiera wskaznik a nie adres LISTA *wsk; *wsk = &pocz; min(wsk); O tak ? Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.