Soli - 2007-05-30 08:38:35

heh spytalem kumpla z infy czy mi zrobi program i kilkakrotnie podkreslalem ze ma byc prymitywny i prosty... no sami zobaczcie co mi dal ;p

#include <stdio.h>

typedef struct NODE
{
    struct NODE *prev;
    struct NODE *next;
    int data;
} NODE;

typedef struct LIST
{
    struct NODE *first;
    struct NODE *last;
} LIST;


NODE *create_node(void)
{
    NODE *ret = (NODE *) malloc(sizeof(struct NODE));
    if (!ret) // zabraklo pamieci, zwroc 0
        return 0;
    ret->prev = 0;
    ret->next = 0;
    ret->data = 0;
    return ret;
}

LIST *create_list(void)
{
    LIST *ret = (LIST *) malloc(sizeof(LIST));
    if (!ret)
        return 0;
    ret->first = 0;
    ret->last = 0;
    return ret;
}

int add(struct LIST *list, int data)
{
    NODE *add = create_node();
    NODE *node;
    if (!add)
        return -1;
    add->data = data;
    if (!list->first)
    {
        list->first = add;
        return 0;
    }
    for (node = list->first; node->next != 0; node = node->next)
        ;
    node->next = add;
    add->prev = node;
list->last = add;
    return 0;
}

int remove_by_data(struct LIST *list, int data)
{
    NODE *node = list->first;
    NODE *del;
    while (node)
    {
        if (node->data == data)
        {
            if (node->prev)
                node->prev->next = node->next;
            if (node->next)
                node->next->prev = node->prev;
            del = node;
        }
        else
            del = 0;
        node = node->next;
        if (del)
            free(del);
    }
    return 0;
}

void destroy_list(struct LIST *list)
{
    NODE *node = list->first;
    NODE *del = 0;
    while (node)
    {
        del = node;
        node = node->next;
        free(del);
    }
    free(list);
}

void print_list(struct LIST *list)
{
    NODE *node = list->first;
    while (node)
    {
        printf("%d", node->data);
        if (node->next)
            printf("-");
        node = node->next;
    }
    printf("\n");
}
int main()
{
int i,z;
struct LIST *list = create_list();
    for(i=1;i<10;i++)add(list, i);
    print_list(list);
    printf("ktora skasowac?")
    scanf("&d",z);
    remove_by_data(list,z);
    print_list(list);
    destroy_list(list);
    return 0;
}

http://img124.imageshack.us/img124/3695/lolvf3.jpg

heh postaram sie to moze jeszcze dzisiaj uda mi sie zdobyc wersje prosta :PP ale jesli ktos czai to cos na gorze to moze przykozaczyc jutro ;p

edit: wprowadzilem mala poprawke aby spelnialo dokladnie to co gosciu chcial

PS: dobra a teraz gdzie moje piwo ;D?

Pap - 2007-05-30 10:58:53

a sprawdzales czy wogole dziala :)?wielkie dzieki znow

moo-moo - 2007-05-30 11:11:44

yyym a co to jest? to jest ta lista dwukierunkowa która ma kasować i dodawać elemnty czy co innego?

Soli - 2007-05-30 11:14:37

tak to jest to ;p

moo-moo - 2007-05-30 11:48:12

Soli napisał:

list->first = add;
        return 0;
    }
    for (node = list->first; node->next != 0; node = node->next)
        ;
    node->next = add;
    add->prev = node;
donald_w (29-05-2007 21:08)
list->last = add;
    return 0;
}

int remove_by_data(struct LIST *list, int data)
{
    NODE *node = list->first;
    NODE *del;
    while (node)
    {

rozumiem, że bez daty i godziny, w której to dostałeś program działać nie będzie :P ?

Soli - 2007-05-30 13:03:40

moo-moo napisał:

Soli napisał:

list->first = add;
        return 0;
    }
    for (node = list->first; node->next != 0; node = node->next)
        ;
    node->next = add;
    add->prev = node;
donald_w (29-05-2007 21:08)
list->last = add;
    return 0;
}

int remove_by_data(struct LIST *list, int data)
{
    NODE *node = list->first;
    NODE *del;
    while (node)
    {

rozumiem, że bez daty i godziny, w której to dostałeś program działać nie będzie :P ?

gdzie ty to widzisz ;>?

moo-moo - 2007-05-30 13:10:43

Soli napisał:

moo-moo napisał:

Soli napisał:

list->first = add;
        return 0;
    }
    for (node = list->first; node->next != 0; node = node->next)
        ;
    node->next = add;
    add->prev = node;
donald_w (29-05-2007 21:08)
list->last = add;
    return 0;
}

int remove_by_data(struct LIST *list, int data)
{
    NODE *node = list->first;
    NODE *del;
    while (node)
    {

rozumiem, że bez daty i godziny, w której to dostałeś program działać nie będzie :P ?

gdzie ty to widzisz ;>?

baaaardzo zabawne :P atak fajnie było i wszyscy by się dziwili czemu nie działa :D albo mieliby problem jakby się gościu od laboratoriów zapytał do czego służy donald :P

Soli - 2007-05-30 13:14:25

hehe ;p niema to jak power of edit ^^

ale ciekawe czy ktos by wszyscy tak przepisali ;p pewnie tak bo i tak wszyscy ctrl+c ctrl+v robia ;p

PS: osobiscie to czaje ten program ale jak ten maly czarny terrorysta zacznie pytac o te jego jebane szczegoliki to ja odpadam ;p

Kinia - 2007-05-30 17:28:43

ahahahhahaha ale moc :D:D:D:D:D:D  jeeahhhh ;D

ps thx Soli ponownie :P

Kasia - 2007-05-30 19:21:58

#include <stdio.h>
#include <stdlib.h>

struct node
{
int a;
int b;
struct node *next;
struct node *previous;
};


void main()
{
struct node *tmp, *root, *tmp1;
int i, w;

tmp = (struct node*)malloc(sizeof(struct node));
tmp->previous = NULL;
root = tmp;

for(i=1;i<=10;i++)
{
tmp->next = (struct node*)malloc(sizeof(struct node));
tmp1 = tmp;
tmp = tmp->next;
tmp->previous = tmp1;
tmp->a = i;
printf("%d\n", tmp->a);
}

tmp->next = NULL;

printf("Podaj element do skasowania:\n");
scanf("%d", &w);

tmp = root->next;

while(tmp)
{
if(tmp->a == w)
{
break;
}
else
{
tmp = tmp->next;
if(tmp == 0)
{
printf("Podano nieprawidlowo\n");
getch();
exit(0);
}
}
}
free((void*)tmp);
getch();
}



A ja mam taka wersje! Ale nie wiem czy to jest dobrze... Bo on wyswietla mi elementy od 1 do 10, pyta co usunąć i niby to robi ale potem juz nie wyswietla tych cyfr bez tej usunietej.

W kazdym razie wyglada krocej i bez bledow.

wersja na samo usuwanie

Mlody - 2007-05-30 20:53:56

Jako że jestem współałtorem wyżej wymienionego programu dodam tylko, że przerobiłem program źle napisany/przepisany na/z tablicy tak, żeby działał. Gdzieś intuicyjnie dodałem coś od siebie bo czułem że taki był zamysł tego Waszego kolaboranta. Nie wiem czy to jest dobrze, bo nawet nie znam treści zadania. Zrobiłem tylko żeby się kompilował i robił to co wydawało mi się że ma robić.

Pap - 2007-05-31 00:10:27

EDIT:

dla chetnych informacja:
oba programy i od soliego i od kaski sa takie same pod wzgledem fnkcjonalnosci, tzn kompiluja sie po drobnych korektach kosetycznych, uruchamiaja, wyswietalaja liste i pytaj o element do usuniecia.
tu drogi sie rozjezdzaja, program kasi pyta o element i odrazu sie zamyka po wybraniu elementu :)
program soliego po wybraniu elementu do usuniecia wyswietla jeszcze raz pierwotna liste i zamyka sie :)

to takie info jakby ktos tylko wyslal sobie te programy liczac ze ktorys dziala na bank, zeby sie na zajeciach nie zdziwil.

moo-moo - 2007-05-31 07:07:29

to co dała tutaj Kasia jest niemalże identyczne do tego co gościu pisał na tablicy, różni się naprawdę niewiele i myślę, że on coś takiego właśnie chce. Bo to co dał tutali Soli ma troszkę inaczej sformułowane funkcje niż były podawane na zajęciach

Soli - 2007-05-31 09:19:55

to wstawic na koncu jeszcze

while(tmp1)
    {
    printf("%d\n",tmp1->a);
    tmp1=tmp1->next;
    }

(chyba tak to szlo)

i nam chyba wydrukuje juz bez usunietego wyrazu (jeszcze nie testowalem ale tak mi sie wydaje)

Kasia - 2007-05-31 21:29:25

Lepiej było miec dzisiaj taki program niż żaden :P nie narzekać

wczasy w Kopalinie Kredyt pozabankowy www.gabinety-stomatologiczne.info.pl