Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Lista dwukierunkowa inicjacja i korzystanie

Ostatnio zmodyfikowano 2014-11-03 12:34
Autor Wiadomość
b0r0
Temat założony przez niniejszego użytkownika
[C++] Lista dwukierunkowa inicjacja i korzystanie
» 2014-11-03 08:18:14
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ć.


C/C++
#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 *glowa=new ElemList;
    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;
                }
            }
        }
    }
}

// *******  deleteBegin  *******
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;
    }
   
}

// *******  deleteEnd  *******
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;
        };
    }
}


// *******  deleteMiddle  *******
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;
        }
    }
   
}


Z góry dzięki za pomoc
P-119899
Jacob99
» 2014-11-03 09:19:00
P-119900
b0r0
Temat założony przez niniejszego użytkownika
» 2014-11-03 12:34:44
Było by prościej. Niestety muszę jednak zrobić to manualnie.
P-119904
« 1 »
  Strona 1 z 1