Usuwanie wiadomości z listy dwukierunkowej

0

Napisany mam podstawowy program do listy dwukierunkowej. Mam zadanie usunąć niepotrzebne podprogramy i dopisać dodatkowy podprogram, który z listy dwykierunkowej usuwa wiadomość o podanym przez użytkownika numerze. Jeżeli nie ma takiej wiadomości, wyprowadza "Nie egzystuje taka wiadomość".
Niestety, tylko rozpoczęąłam programować, nie wiem, jak to zrobić. Czy mógłby ktoś pomóc?
Oto mój program:

#include <stdio.h>
#include "komentarze.h"

struct Element {
    struct Element* nastepny;
    struct Element* poprzedni;
    Wiadomosc* wiadomosc;
};

typedef struct Element Element;

void Menu()
{
    printf("--------------------\n");
    printf("Chcac dodac element do listy wcisnij \t 1\n");
    printf("Chcac wydrukowac liste wcisnij \t\t 2\n");
    printf("Chcac skonczyc wcisnij \t\t\t Esc.\n");
    printf("--------------------\n");
}

Element* Tworzenie()
{
    Element* element = (Element*)malloc(sizeof(Element));
    if (element == NULL) {
        printf("Nie udalo sie przydzielic tyle pamieci!\n");
    }
    element->wiadomosc = PrzypadkowaWiadomosc();
    element->nastepny = NULL;
    element->poprzedni = NULL;
    return element;
}

void Dodawanie(Element** poczatek, Element** koniec)
{
    if (*poczatek == NULL && *koniec == NULL) {
        *poczatek = Tworzenie();
        *koniec = *poczatek;
    }
    else {
        Element* nowy = Tworzenie();
        (*koniec)->nastepny = nowy;
        nowy->poprzedni = *koniec;
        *koniec = nowy;
    }
}

void DrukowanieListy(Element* lista)
{
    printf("---------------------------\n");
    int i = 1;
    while (lista != NULL) {
        printf("Numer wiadomosci w liscie: %d\n", i);
        DrukowanieWiadomosci(lista->wiadomosc);
        lista = lista->nastepny;
        i++;
    }
    printf("---------------------------\n");
}

void UsuwanieListy(Element** poczatek)
{
    Element* tymczasowy;
    while (*poczatek != NULL) {
        tymczasowy = *poczatek;
        *poczatek = (*poczatek)->nastepny;
        free(tymczasowy);
    }
}

int main()
{
    Element *poczatek = NULL, *koniec = NULL;
    char x;
    Menu();
    while ((x = getchar())) {
        switch (x) {
        case '1':
            Dodawanie(&poczatek, &koniec);
            Menu();
            break;
        case '2':
            DrukowanieListy(poczatek);
            Menu();
            break;
        case '\n':
            break;
        case 27:
            UsuwanieListy(&poczatek);
            return 0;
        default:
            Menu();
        }
    }
    return 0;
}
0

Popraw edycję tekstu bo nie da się tego przeczytać.

0

    char x;
    Menu();
    while ((x = getchar())) {


powinno byc int x
to tak przy okazji.

0

Nie podałaś, jak wygląda struktura Wiadomosc, ale podejrzewam, że ma jakiś numer.

Jak takie zadanie wykonać:

  1. Musisz znaleźć odpowiedni element na liście: element->wiadomosc->id = jakieś podane przez użytkownika
  2. Jak znajdziesz taki element, bierzesz element POPRZEDNI i zmieniasz mu wskaźnik nastepny na element NASTĘPNY.
  3. Analogicznie robisz z elementem NASTĘPNYM. Coś takiego:
//zakładam, że znalazłaś już element, który masz usunąć i jest on pod wskaźnikiem pElement:

Element * pPrev = pElement->poprzedni;
Element * pNext = pElement->nastepny;
pPrev->nastepny = pNext;
pNext->poprzedni = pPrev;
free(pElement);
0

Napisałam ten nowy podprogram. Czy nie ma tu żadnych błędów? Jeżeli są chciałabym poprosić o poprawienie ich i wyjaśnienie mi na czym one polegają.

void UsuwanieWiadomosci(  i nie wiem co tu mam właściwie wpisać  ) {
int k;
printf("Wprowadz numer wiadomosci, ktora bedzie usunieta: %d \n", k);
scanf("%d \n", &k);
pElement = poczatek;
i=2;
while(i<k && pElement != NULL) {
pElement = pElement->nastepny;
i++;
}
if(i == k) {
printf("Wiadomosc pod numerem %d jest znaleziona \n", k);
else
printf("Lista zawiera mniej niz %d elementow \n", k);
}
Element *pPoprzedni = pElement->poprzedni;
Element *pNastepny = pElement->nastepny;
pPoprzedni->nastepny = pNastepny;
pNastepny->poprzedni = pPoprzedni;
free(pElement);
}
0

Ja przekazałbym do funkcji całą listę elementów oraz numer konkretnego elementu.
void UsuwanieWiadomosci(Element *lista, const int k);

O numer elementu użytkownika poprosiłbym w mainie i przekazał jako argument ten numer, dalej postępowałbym tak jak napisał kolega wyżej.

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