dodawanie na poczatek listy jednokierunkowej

0

B

0

Z google'a też korzystać nie potrafisz?

Algorytm na wyświetlanie elementów jest prosty:
aktualny = pierwszy element listy
dopóki aktualny jest różny od null, wykonuj:

  • wyświetl zawartość aktualnego elementu
  • aktualny = aktualny->nastepny
0

hmm...w ten sposob moge wyswietlic elementy dodawane na koncu listy...potrafie korzystac z googla, nie potrafie napisac ten funkcji w zwiazku z czym stwierdzilem, ze to bedzie najodpowiedniejsze miejsce...moze ktos inny pomoze?

0

A co za problem wyświetlić listę od końca? Kwestia zmiany jednej/dwóch rzeczy.

0

ok teraz mam cos takiego

void dodaj(struct element *first)
{
     element *nowy = (element*)malloc(sizeof(element));
     std::cout << "Podaj nowa wartosc: ";
     std::cin >> nowy->val;
     nowy->next=first;
     first=nowy;   
      
}
 
void wypisz(struct element *first)
{       
        first->next=NULL;
        element *a;
        while(a!=first->next)
        {
        std::cout << a->val;
        a=a->next;
        }
}
 

dodaje mi liczbe na poczatek, ale tylko jedna...np jak za pierwszym razem wpisze 1, to bede mial jedynke przed jakas inna liczba, za drugim razem jak wpisze 2, to bede mial 2, ale nie przed jedynka i jakas inna liczba, tylko przed ta sama, przed ktora byla jedynka...:/ pomozesz?

0
void wypisz()
{       
        element* current = first;
        while(current != null){
            cout<<current->val;
            current = current->next;
        }
}
0

ziomus, dalej nie dziala...spojrze raz chociaz na to co napisalem w poscie, zobacz jak wyglada ta moja funkcja, i powiedz jak powinna wygladac prawidlowa wyswietlajaca...chyba, ze moja funkcja dodajaca element na poczatek listy jest zla?....powiedz cos sensownego raz :/

0

Powinieneś zrobić sobie osobną strukturę węzła, w której będziesz przechowywał wartość danego węzła i wskaźnik na następny. Należałoby też dodać "głowę" do listy.
Kod taki mógłby wyglądać np. tak:

void dodaj(int info) //zalezy jakie dane posiadasz
{
     element *nowy = (element*)malloc(sizeof(element));     
     nowy->info = info;
     nowy->next = head;
     head = nowy;    
}
0

wiesz, jednak chcialbym zrobic te dodawanie w jak najprostszy sposob, nie bawiac sie w stwarzanie miliarda struktur. Ponizej przesle caly kod, jesli potrafisz, stworz w nim taka funkcje ktora wyswietli dodane elementy na poczatku listy, ale bez stwarzania nowej struktury, bo to bedzie juz zbyt zagmatwane:

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

void dodaj(struct element *);
void wypisz(struct element *);
 
struct element
{
        int val;
        struct element *next;
};

struct element *first = NULL;
 
int main()
{
        first =(element*) malloc(sizeof(struct element));
        first->val = 3;
        first->next = NULL;
        while(1)
        {
        dodaj(first);
        wypisz(first);
        }
        free(first);
        getch();
}
 
void dodaj(struct element *first)
{
     element *nowy = (element*)malloc(sizeof(element));
     std::cout << "Podaj nowa wartosc: ";
     std::cin >> nowy->val;
     nowy->next=first;
     first=nowy;
      
}
 
void wypisz(struct element *first)
{       
        
        element *a=first;
        while(a!=NULL)
        {
        std::cout << a->val;
        
        }
} 
0

Huh? Masz przecież zwykłą listę jednokierunkową. Jeśli chcesz dodać element na jej początku, musisz stworzyć nową strukturę - element listy i przepisać wartość wskaźnika kierującego na kolejny (dotychczas pierwszy) element.
Wydrukowanie od początku do końca tego to również banał. Zaczynasz od pierwszego elementu, bo do niego masz zapisany wskaźnik (nie wiedzieć czemu w zmiennej globalnej). Wypisujesz wartość tego elementu, przeskakujesz do elementu wskazywanego jako następny i abarot to samo. Robisz tak do czasu, aż wskaźnik na następny element będzie miał wartość NULL (co oznacza, że dotarłeś do ostatniego elementu listy).
Jeśli chcesz to drukować od końca do początku, to tego nie da się zrobić na liście jednokierunkowej. Musisz stworzyć listę dwukierunkową, gdyż w jednokierunkowej ostatni element nie zawiera "ścieżki w górę listy" (nie przechowuje wskaźnika do elementu poprzedzającego). Jeśli chcesz, możesz zaalokować tablicę wskaźników o długości odpowiadającej liczbie elementów na liście (musisz sobie to gdzieś przechowywać i inkrementować przy dodawaniu nowego elementu), następnie pojechać od początku listy, kopiując wskaźniki na elementy do tej tablicy, a później wypisać je lecąc od końca tablicy, ale sensowniej będzie stworzyć listę dwukierunkową.
Co do kodu... Strasznie to dziwne... Dlaczego tak to robisz, nie mam pojęcia. W każdym razie nie masz jak stwierdzić gdzie ta lista się kończy, bo dodajesz elementy od końca... w dodatku wskaźniki do poprzedników zapisujesz w zmiennej o nazwie next. Wskaźnik do pierwszego elementu Ci "wędruje"... Trochę to bez sensu. Dlaczego nie możesz tego zrobić po ludzku? Stwórz pierwszy element i do next wpisz NULL. Wskaźnik do tego elementu zapisz sobie w zmiennej last. Jak będziesz dodawał nowy element, w tym, na co Ci wskazuje last zapisz wskaźnik do niego, next na NULL, do last wrzuć wskaźnik na nowy element. Po robocie.
BTW, dobrze jest tę listę sobie opakować w inną strukturę, w której przechowujesz wskaźnik do pierwszego i ostatniego elementu oraz długość listy:

struct list {
    struct element             *first;
    struct element             *last;
    unsigned long long         length;
};

W ten sposób będziesz wszystko trzymał w kupie. I wywal te zmienne globalne. W tym programie nie masz potrzeby ich stosowania. Użyj zmiennej lokalnej, przecież i tak przekazujesz wskaźnik na element do funkcji operujących na liście.

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