Skocz do zawartości

[C] wstawianie / usuwanie elementów listy


zagubiony

Polecane posty

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

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 :D

 

 

 

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

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...