Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Ahoj,
mám obousměrně zřetězený seznam, do kterého mám přidat funkce výpis, výpis pozpátku, hledání a mazání. S výpisem jsem si poradil, v hledání mám asi nějakou chybu, ale nevím si rady s mazáním. Mohl by mi někdo poradit?
děkuji
// cviceni4.cpp : Defines the entry point for the console application. // #include <malloc.h> #include <stdlib.h> #include <string.h> #include "stdafx.h" struct uzel { char *jmeno; struct uzel *prev,*next; }*head,*tail; void add (char *j) { struct uzel *n = (struct uzel*)malloc(sizeof(struct uzel)); if(n==NULL) { printf("Neni pamet"); exit (1); } n->jmeno = (char*)malloc(strlen(j)+1); if(n->jmeno==NULL) { printf("Neni pamet"); exit (2); } strcpy (n->jmeno, j); n->prev=NULL; n->next=head; head=n; if(n->next!=NULL) { n->next->prev=n; }; if(tail==NULL) { tail=n; }; } void vypis(void) { struct uzel *uk=head; while (uk!=NULL) { printf("uzel %s\n", uk->jmeno); uk = uk->next; } } void vypispozpatku(void) { struct uzel *uk=tail; while (uk!=NULL) { printf("uzel %s\n", uk->jmeno); uk = uk->prev; } } struct uzel* najdi(char*j) { struct uzel *uk=head; while (uk!=NULL) { if(!strcmp(j,uk->jmeno)) { return(uk); } uk = uk->prev; } return(NULL); } /* void smaz(void) */ int _tmain(int argc, _TCHAR* argv[]) { add("jarda"); add("karel"); add("ana"); vypis(); vypispozpatku(); najdi (); return 0; }
Offline
↑ ragu:
V najdi máš uk = uk->prev; -- tedy procházíš uzel směrem k začátku -- ale začínáš ho prohledávat od začátku -- takže když nenajdeš v prvním uzlu, tak hned skončíš. Buď procházej ke konci nebo začínej od konce.
A odstraňování -- prostě najdeš uzel se správnou hodnotou (pomocí najdi třeba) a pak přepojíš ukazatele. Nejlíp se to vysvětluje asi obrázek:
Offline
Můžu:
void odstran(char const* co) { struct uzel* u = najdi(co); if (u) { if (u != head && u != tail) { /* Odstranovani ze zacatku a z konce sou zvlastni pripady -- tady osetrim odstraneni zprostredka */ /* Ted udelam to, co je na obrazku pod cislem 2. * Rozmysli si, ze u->next i u->prev nejsou nullove */ u->next->prev = u->prev; u->prev->next = u->next; /* A ted ten uzel odstranim -- na obrazku ciso 3. */ free(u); } else if (u == head) { /* Odstranuju zacatek, takze spojak bude ted zacinat druhym uzlem -- druhy uzel tak bude * mit ukazatel "prev" nullovy, protoze pred nim nic nebude */ if (u->next) { /* Ovsem pozor na jednoprvkovy spojak */ u->next->prev = NULL; } head = u->next; free(u); } else { /* u == tail */ /* Symetricke s predchozim pripadem */ if (u->prev) { u->prev->next = NULL; } tail = u->prev; free(u); } } }
Offline
Stránky: 1