Lista Cykliczna zabawa usun

0

Problem jest następujący:
/12. Napisz funkcję, która dla dwóch list jednokierunkowych cyklicznych usunie wszystkie wartości
pierwszej listy w drugiej liście.
/

#include <stdio.h>
#include <stdlib.h>
typedef struct el
{
    int x;
    struct el* nast;
    struct el* pop;
} elem;
typedef elem* wsk;

void druk(wsk l)
{
    wsk p = l;
    if (l != NULL)
    {
        do
        {
            printf("%d\n", p->x);
            p = p->nast;
        } while (p != l);
    }
    else
    {
        printf("Lista pusta\n");
    }
}

void dod(wsk* l, int y)
{
    wsk p = (wsk)malloc(sizeof(wsk));
    wsk q;
    wsk ll = *l;
    if (!(*l))
    {
        p->x = y;
        *l = p;
        p->nast = *l;
    }
    else
    {
        do
        {
            ll = ll->nast;
        } while (ll->nast != *l);
        p->nast = ll->nast;
        ll->nast = p;
    }
}

void usun(wsk* l1, wsk* l2)
{
    wsk p = (*l1), q = (*l2), r = NULL;
    do
    {
        do
        {
            if ((*l2)->x == (*l1)->x)
            {
                if ((*l2)->nast == (*l2))
                {
                    r = (*l2)->nast;
                    (*l2)->x = r->x;
                    (*l2)->nast = r->nast;
                    free(r);
                    (*l2) = (*l2);
                }
                else
                {
                    r = (*l2)->nast;
                    (*l2)->x = r->x;
                    (*l2)->nast = r->nast;
                    free(r);
                }
            }
            q = q->nast;
        } while (q->nast != (*l2));
        p = p->nast;
    } while ((p->nast != (*l1)) && ((*l2) != q));
    if ((*l2) == q)
    {
        // jak lista l2 ma już jeden element
        while ((p != *l1) && (*l1 != NULL))
        {
            if (q->x == p->x)
            {
                free(q);
                *l1 = NULL;
            }
            else
            {
                p = p->nast;
            }
        }
    }
    else
    {
        printf("Lista usun jest pusta\n");
    }
}
main()
{
    wsk l1 = NULL;
    wsk l2 = NULL;
    int a;
    printf("Zapełnianie listy cyklicznej 2\n");
    printf("Dodaj:");
    scanf("%d", &a);
    while (a != 0)
    {
        dod(&l2, a);
        printf("Dodaj:");
        scanf("%d", &a);
    }
    printf("--------------Twoja Lista 2------------------\n");
    druk(l2);

    printf("Zapełnianie listy cyklicznej (Co usunac?) 1\n");
    printf("Dodaj:");
    scanf("%d", &a);
    while (a != 0)
    {
        dod(&l1, a);
        printf("Dodaj:");
        scanf("%d", &a);
    }
    printf("--------------Twoja Lista 1------------------\n");
    druk(l1);

    printf("---------------Usuwanie-----------------------\n");
    usun(&l1, &l2);
    printf("--------------Twoja Lista 2------------------\n");
    druk(l2);

    system("pause");
}

I nie idzie coś z tym usuwaniem co rusz coś zostawia :(

0

po modyfikacji wyświetla adresy zamiast wartości zostało pomieszane ze wsk na wsk

0

A nie lepiej napisać funkcję, która szuka wartości w liście, i dzięki której znacznie zredukujesz to spaghetti w funkcji usun?

0

<żart>Powiedz, dlaczego "jesteś sadystą"?</żart>
Nazywasz element elem (zamiast element), wartość x (zamiast np. watosc lub value) , typ wsk (zamiast np. wsk_element_t), nast (zamiast np. nastepny lub next), pop (zamiast poprzedni lub prev... pop w programowaniu związane jest ze zdejmowaniem ze stosu) . Stosujesz nazwę zmiennej l (el) która do złudzenia przypomina 1 (jeden). To zamiłowanie do "skrótowości w nazwach zmiennych" eh...
Masz jakiś szczególny powód by pisać takie "niespodziankowe spagetti"?
Podziel usun na sensownie (nie skrótowo!) nazwane funkcje bo teraz w połączeniu z nazewnictwem... to koszmarek...

1 użytkowników online, w tym zalogowanych: 0, gości: 1