Listy jednokierunkowe

0

Mam problem z kolejnym zadaniem i proszę o pomoc, nie jestem pewna co źle robię.
Przytaczam treść zadania:

Napisz funkcję która w liście jednokierunkowej zawierającej liczby i zaczynającej się pod jakimś adresem dodaje po każdym elemencie zawierającym liczbę ujemną element zawierający tę liczbę pomnożoną przez jakąś wartość, a na koniec zwraca liczbę dodanych elementów. 

Do tej pory zrobiłam coś takiego:

bool ujemna(element_listy* adres)
{
    bool ujemna=true;
    while(adres)
    {
     if ((adres->liczba)>0)
        ujemna=false;
    adres=adres->wsk_nastepnika;

    }
    return ujemna;

}
int mnoz(element_listy* adres, int wartosc)
{
    int liczba;
    if(ujemna(adres))
    {
        liczba=adres->liczba*wartosc;
    }
    return liczba;
}
int dodaj(element_listy* adres)
{
    element_listy* pomnozona=new element_listy;
    pomnozona->liczba=mnoz(adres,5);
    while(adres)
    {
        if(ujemna(adres))
        {
            pomnozona->wsk_nastepnika=adres->wsk_nastepnika;

            adres->wsk_nastepnika =pomnozona;
        }
    }
}

Proszę o pomoc bo nie wiem jak to rozwiązać.

0

To jakby lecieć samolotem do sklepu za rogiem :) z poprzedniego zadania powinna być funkcja wstawiająca za danym elementem listy i wtedy wystarczy:

int listOp(Node * head, int val) {
	Node * tmp = head;
	int cnt = 0;
	while (tmp) {
		if (head->data < 0) {
			insert(tmp, (tmp->data) * val); // dodaje element za bieżacym
			++cnt;
		}
	}
	return cnt;
}
0

Dziękuję!!

0

A więc tak. Nie działa mi ta funkcja.
Proszę o komentarz i podpowiedź. Z góry dziękuję.

#include <iostream>
#include <cstdlib>
#include <list>
#include <cstddef>

using namespace std;

struct element_listy
{
    int liczba;
    element_listy *wsk_nastepnika;
};

//iteracyjna funkcja drukujaca zawartosc listy
void drukuj(element_listy *adres)
{
    while(adres!=NULL)
    {
        cout<<adres->liczba<<endl;
        adres=adres->wsk_nastepnika;
    }
}

// Zwróæ: wskaŸnik na ostatni element listy
element_listy* ostatni( element_listy* adres )
{
    // Przechodzenie po liœcie *iteracyjnie*
    if( adres )
    while( adres->wsk_nastepnika )
         adres = adres->wsk_nastepnika;

    return adres;
}


// Dodaj element na koniec listy
void dodajKoniec( element_listy *& adres, int liczba )
{
    // Tworzymy nowy element listy
    element_listy * nowy = new element_listy;
    nowy->liczba = liczba;
    nowy->wsk_nastepnika = NULL;

    // Dopisujemy na koniec
    if( adres )
         ostatni( adres )->wsk_nastepnika = nowy;
    else
         adres = nowy;

}

// Usuwa listê
void zniszcz( element_listy *& adres )
{
    while( adres )
    {
        element_listy * tmp = adres;
        adres = adres->wsk_nastepnika;
        delete tmp;
    }

    adres = NULL;
}

void wstaw(element_listy* adres, int liczba)
 {
     element_listy* co = new element_listy;
     co->liczba=liczba;
     co->wsk_nastepnika=adres->wsk_nastepnika;
     adres->wsk_nastepnika=co;

 }
int zad10(element_listy * head, int val) {
    element_listy * tmp = head;
    int cnt = 0;
    while (tmp) {
        if (head->liczba < 0) {
            wstaw(tmp, (tmp->liczba) * val); // dodaje element za bieżacym
            ++cnt;
        }
    }
    return cnt;
}

int main()
{
    int liczba, val;
    element_listy* adres = NULL;

    cout << "Podaj liczbe 0 lub blad konczy:\n";

    while( liczba!=0)
    {
        cin >> liczba;
        dodajKoniec( adres, liczba );
    }

    drukuj( adres );

    cout<<"Podaj mnoznik"<<endl;
    cin>>val;


    zad10(adres, val);
    drukuj(adres);

    // drukuj(adres);
    zniszcz( adres );
  return 0;
}

screenshot-20200120211821.png

0

Próbuje debugować i otrzymałam taki wynik.
screenshot-20200120220408.png

0

Poprawiłam i teraz wychodzi takie o to cudo.

 void wstaw_po ( element_listy * adres, int v )
{
  element_listy * p = new element_listy;

  p->wsk_nastepnika = adres->wsk_nastepnika;
  p->liczba = v;
  adres->wsk_nastepnika = p;
}
int zad10(element_listy *& adres, int val) {
    element_listy* tmp = adres;
    int cnt = 0;
    while (tmp) {
        if ((tmp->liczba) < 0) {
            wstaw_po(tmp, (tmp->liczba) * val); // dodaje element za bieżacym
            ++cnt;
        }
        tmp=tmp->wsk_nastepnika;

    }
    return cnt;
}

screenshot-20200121002703.png

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