Wątek przeniesiony 2018-03-23 23:06 z C/C++ przez kq.

Problem ze wskaźnikami – jak zrobić, aby wskaźniki nie wymieniały się między sobą wartościami?

0

Napisałem taki oko program ale w zaznaczonym miejscu zamienia wartości.
Wiecie może gdzie popełniłem błąd? Prawdopodobnie znajduje się on w funkcji give

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct open_list
{
    double f;
    open_list *next;
};

void add_front(open_list *&start,double f)
{
    open_list *p=new open_list;
    p->f=f;
    p->next=start;
    start=p;
}

open_list give(open_list *&start)
{
    open_list *x=new open_list;
    open_list *s=new open_list;
    s=start;
    x->f=10000;
    while(s!=NULL)
    {
        if(x->f>s->f)
        {
            x=s;
        }
        s=s->next;
    }
    open_list *st=new open_list;
    st=start;
    while(st!=NULL)
    {
        if(x==st)
        {
            st->f=1066;
            //w tym miejscu zmienia wartosc x->f z wczesniej otrzymanej na 1066 ktora jest podana linijke wyżej
        }
        st=st->next;
    }
    return *x;
}

void show(open_list *&start)
{
    if(start!=NULL)
    {
        cout<<start->f<<endl;
        show(start->next);
    }
}

int main()
{
    srand(time(NULL));
    open_list *start=new open_list;
    start=NULL;
    for(int i=0; i<10; i++)
    {
        add_front(start, rand()%50);
    }
    show(start);
    open_list *g=new open_list;
    *g=give(start);cout<<"xXx "<<g->f<<endl;
    show(start);
    return 0;
}
2

Nie rozumiem o co chodzi w funkcji give, ale czy wiesz co robisz? Pamięć cieknie.

open_list *start=new open_list;
start=NULL;
////
open_list *s=new open_list;
s=start;
////
open_list *st=new open_list;
st=start;//<-
////
open_list *g=new open_list;
*g=give(start);

Po wykonaniu się zaznaczonej linii st wskazuje na to samo co start.
Wskaźników może być wiele, ale mogą pokazywać na jeden adres.

1

do tego co napisał @Potat0x dodam, że gubisz pamięć

  1. nie zwalniasz
  2. nawet jakby była zwalniana, to i tak jest gdzieś w chmurach, przez zmianę adresu wskaźnika...

najwyraźniej nie rozumiesz idei wskaźników w C++

0

Dobra już ogarnąłem.
Dzięki za pomoc ;)

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