Witam. Zadano mi zrobienie programu z wykorzystaniem listy dwukierunkowej. Problem w tym ze nie do końca wiem jak z tego korzystać.
Zaimplementowałem na razie jakiś gotowy skrypt ale nie do końca wiem jak tą liste zainicjalizować i z niej korzystać.
na początku chciałem ją tylko zainicjalizować i spróbować usunąć wartość jakiegoś klucza żeby wywołać błąd (gdyż jest pusta)
potem dopiero ją uzupełnić.
#include <iostream>
#include <cstdio>
using namespace std;
struct ElemList
{
struct ElemList * nast, * poprz;
int wartosc;
};
void dodPocz( struct ElemList ** head, struct ElemList ** tail, int wart );
void dodKon( struct ElemList ** head, struct ElemList ** tail, int wart );
void dodSrod( struct ElemList ** head, struct ElemList ** tail, int wart, int pos );
int UstalPoz( struct ElemList * head, struct ElemList * tail, struct ElemList ** p1, int pos );
void usunPocz( struct ElemList ** head, struct ElemList ** tail );
void usunKon( struct ElemList ** head, struct ElemList ** tail );
void usunSrod( struct ElemList ** head, struct ElemList ** tail, int pos );
int main()
{
int l = 5;
ElemList ** head;
ElemList ** tail = NULL;
cout << "inicjacja listy" << endl;
dodSrod( head, tail, NULL, 0 );
for( int i = 1; i < 5; i++ )
{
dodSrod( head, tail, NULL, i );
}
cout << "usuwanie k1" << endl;
usunPocz( head, tail );
}
void dodPocz( struct ElemList ** head, struct ElemList ** tail, int wart )
{
struct ElemList * a;
a = new struct ElemList;
a->wartosc = wart;
if(( * head ) == NULL &&( * tail ) == NULL )
{
* head = a;
* tail = a;
a->nast = NULL;
a->poprz = NULL;
}
else
{
a->nast =* head;
a->poprz = NULL;
( * head )->poprz = a;
( * head ) = a;
}
}
void dodKon( struct ElemList ** head, struct ElemList ** tail, int wart )
{
struct ElemList * a;
a = new struct ElemList;;
a->wartosc = wart;
if(( * head ) == NULL &&( * tail ) == NULL )
{
* head = a;
* tail = a;
a->nast = NULL;
a->poprz = NULL;
}
else
{
a->poprz = * tail;
a->nast = NULL;
( * tail )->nast = a;
( * tail ) = a;
}
}
void dodSrod( struct ElemList ** head, struct ElemList ** tail, int wart, int pos )
{
int m;
struct ElemList * a, * b;
a = new struct ElemList;
if( pos == 0 )
{
dodPocz( head, tail, wart );
}
else
{
if( UstalPoz( * head, * tail, & b, pos ) )
{
if(( b->nast ) = NULL )
{
dodKon( head, tail, wart );
}
else
{
a->poprz = b->poprz;
a->nast = b;
( b->poprz )->nast = a;
b->poprz = a;
a->wartosc = wart;
}
}
}
}
int UstalPoz( struct ElemList * head, struct ElemList * tail, struct ElemList ** p1, int pos )
{
int i, k;
struct ElemList * a;
if( pos < 0 )
{
return 0;
}
else
{
a = head;
i = 0;
k = 500;
while( k )
{
if( pos == i )
{
* p1 = a;
return 1;
}
else
{
if(( a->nast ) != NULL )
{
a = a->nast;
i++;
}
else
{
return 0;
}
}
}
}
}
void usunPocz( struct ElemList ** head, struct ElemList ** tail )
{
struct ElemList * a;
if(( * head ) != NULL )
{
if(( * tail ) ==( * head ) )
{
* tail = NULL;
delete * head;
* head = NULL;
}
else
{
a =( * head )->nast;
( * head )->nast->poprz = NULL;
delete * head;
* head = a;
}
}
else
if(( * head ) == NULL )
{
cout << "Błąd" << endl;
}
}
void usunKon( struct ElemList ** head, struct ElemList ** tail )
{
struct ElemList * a;
if(( * tail ) != NULL )
{
if(( * tail ) ==( * head ) )
{
* tail = NULL;
delete * tail;
* head = NULL;
}
else
{
a =( * tail )->poprz;
a->nast = NULL;
delete * tail;
* tail = a;
};
}
}
void usunSrod( struct ElemList ** head, struct ElemList ** tail, int pos )
{
struct ElemList * a;
if( pos == 0 )
{
usunPocz( head, tail );
}
else
if( UstalPoz( * head, * tail, & a, pos ) )
{
if( a->nast == NULL )
{
usunKon( head, tail );
}
else
{
a->poprz->nast = a->nast;
a->nast->poprz = a->poprz;
delete a;
}
}
}