Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Односвязные списки в волновом алгоритме

25K
06 мая 2007 года
Anaya
6 / / 28.04.2007
Всем привет.
Вот пытаюсь реализовать волновой алгоритм для нахожднения кратчайшего ( с минимальным кол-вом ребер) пути в графе между вершинами s и t.

Чувствую, что где-то с односвязными списками косяк.
Помогите, пожалуйста, у меня уже крыша сползает, а чувствую, что как всегда ошибка типа "запятую не там поставила"...
( хотя , может это только кажется )

P.S.
шаманский бубен не предлагать :)

Код:
// spisok
struct list
{ int val;
struct list *next; };

//prosmotr spiska
void scan (list *ph) // zagolovok spiska
{
    list *p;
for (p = ph; p != NULL; p = p->next)
     printf ("%d ", *p);
        printf ("/n");
}


//-----dobavlyaem v konec spiska ----------------
list *insertlast(list *ph, int v)
{
    list *q,*p= new list; // sozdaem element spiska
        p->val = v; // zapolnaem ego
        p->next = NULL; // new element - posledniy
        if (ph == NULL) ph = p; // spisok pust
        else // poisk poslednego v nepustom spiske
        {
            for (q = ph; q->next !=0; q = q->next);
            q->next = p; // vkluchaem za poslednim
        }
    return ph;
}

//udalaem element po zadannomu nomeru
list *remove (list *ph, int n)
{
    list *q,*pr,*p;
// dvigaemsya po spisky poka on ne zakonchitsya libo poka
// ne obnelitsya schetchik, sohranyaya ukazatel na prediduschiy element- pr
    for (p=ph,pr=NULL; n!=0 || p!=NULL; n--, pr=p, p =p->next);
   
        if (p==NULL) return ph;
        if (pr==NULL)
            { q=ph; ph=ph->next; } // iskluchaem perviy
        else // iskluchaem iz serediny
            { q=p; pr->next=p->next; }
   
    delete q; // unichtojaem element
    return ph;
}


int main(int argc, char* argv[])
{

    int put,i,j, dlina,end;
    int T [9]; // volnovie metki
    list *OldFront, *NewFront; //fronty volny
    int n=9;
    int s=0; // nachalnaya vershina
    int t=4; // konechnaya vershina
    int c[9][9];
   
// matrix smejnosti
    for (i=0;i<n;i++)
        for (j=0;j<n;j++)  c[j]=0;

c[0][2]=1;      c[0][7]=1;      c[1][3]=1;      c[1][4]=1;
c[2][0]=1;      c[2][3]=1;      c[2][6]=1;      c[2][8]=1;
c[3][1]=1;      c[3][2]=1;      c[4][1]=1;      c[4][5]=1;
c[5][4]=1;      c[5][6]=1;      c[6][2]=1;      c[6][5]=1;
c[7][0]=1;      c[7][8]=1;      c[8][2]=1;      c[8][7]=1;
   
// nachalnie dannie
    for ( i=0;i<n;i++ )
        T=-1;
    t=0;
    OldFront=insertlast(OldFront,s);
//-------------------------------

    list *p;
    end=0;

    whlie (end==0)
    {

    for (p=OldFront; p!=NULL; p =p->next) // prosmotr vsego spiska starogo fronts
    {
        i=p->val;
        for ( j=0;j<n;j++) 
        {
            if ( (c[j]!=0) && (T[j]==-1) )  // dlya smejnih vershin s volnovoy metkoy "-1"
            {
                T[j]=put+1;                        
                NewFront=insertlast(NewFront,j);
            }
        }
    }
    if (NewFront==NULL)             // if net resheniya
        {
        printf ("Net resheniya");
        end=1;
        return 0;
        }
   
    for (p=NewFront; p!=NULL; p =p->next)  
    {
        if (p->val==t)                      // esli nashli reshenie
        {
            put=put+1;
            printf ("URA! %d dlina puti", put);
            end=1;
            return 0;
        }
        else                                // esli esche ne nashli
        {
            OldFront=NewFront;
            for (p=NewFront; p!=NULL; p =p->next) // schitaem dlinu spiska
                dlina++;
           
            for (p=NewFront, i=dlina; p!=NULL, i!=NULL; p =p->next,i--) // udalyaem vse elementy iz spiska
              NewFront=remove(NewFront, i);
        }
    }
    }
}
3
06 мая 2007 года
Green
4.8K / / 20.01.2000
Используй С++ и стандартные контейнеры.
25K
06 мая 2007 года
Anaya
6 / / 28.04.2007
а можно чуть подробнее? ( простите, я чайник )
92
06 мая 2007 года
Тень Пса
2.2K / / 19.10.2006
STL пользуй... в этой библиотеке есть стандартный контейнер list, он тебе поможет.

прям на коденет есть дока... :)
http://www.codenet.ru/progr/cpp/stl/Using-STL.php
2.1K
06 мая 2007 года
elan
56 / / 10.04.2003
Переменные put и dlina не инициализированы.

Переменная t имеет фиксированное 0-е значение. Если так должно быть,
то лучше объявить ее, как
const int t = 0;

Потом, метод remove, очень подозрительный. Он никогда
NULL не возвращает, даже если удалить последний элемент.

Если нужно удалить все значения списка, тогда лучше бы использовать метод
Код:
void removeall(list *ph)
{
  if(ph!=NULL)
  {
    for(list *p=ph->next; p!=NULL; ph=p, p=p->next)
    {
      delete ph;
    }
    delete ph;
  }
}
и после вызова этого метода: NewFront=NULL;
и по всей видимости удаление всех элементов списка, находится не на своем месте. Или как минимум, нужен break из цикла for (p=NewFront; p!=NULL; p =p->next), после удаления элементов списка. Так как после этого указатель p->next недействительный.
25K
09 мая 2007 года
Anaya
6 / / 28.04.2007
Люди!!! СПАСИБО! Я вас всех люблю!!! ( в частности "пескину тень" :)
ОНО ,с..ка, работает!
( Вам конечно смешно :), наверное, но я радуюсь как ребенок :)

Итак:
Реализация волнового алгоритма для нахждения кратчайшег пути в графе между вершинами s и t ( кратчайшие = минимальное кол-во ребер между ними ).

Код:
#include <vector>
#include <stdio.h>
using namespace std;


int main(int argc, char* argv[])
{

    int put,i,j,p,end;
    int T [9]; // volnovie metki
    vector <int> OldFront; //fronty volny
        vector <int> NewFront;
    int n=9;
    int s=0; // nachalnaya vershina
    int t=4; // konechnaya vershina
    int c[9][9];
    end=0;
    put=0;
        vector<int>::iterator element;


// matrix smejnosti
    for (i=0;i<n;i++)
        for (j=0;j<n;j++)  c[j]=0;

c[0][2]=1;      c[0][7]=1;      c[1][3]=1;      c[1][4]=1;
c[2][0]=1;      c[2][3]=1;      c[2][6]=1;      c[2][8]=1;
c[3][1]=1;      c[3][2]=1;      c[4][1]=1;      c[4][5]=1;
c[5][4]=1;      c[5][6]=1;      c[6][2]=1;      c[6][5]=1;
c[7][0]=1;      c[7][8]=1;      c[8][2]=1;      c[8][7]=1;

// matrix smejnosti - vivod na screen
for (i=0;i<n;i++)
{
for ( j=0;j<n;j++)
printf ("%d ", c[j]);
printf ("\n");
}

// nachalnie dannie
    for ( i=0;i<n;i++ )     T=-1;
        T=0;
        put=0;
        OldFront.push_back(s);
//-------------------------------

    while (end==0)
    {
    // prosmotr vsego spiska starogo fronts
    for (element = OldFront.begin(); element < OldFront.end(); element++)
    {
                i=(*element);
        for ( j=0;j<n;j++)
        {
                       if ( (c[j]!=0) && (T[j]==-1) )   // dlya smejnih vershin s volnovoy metkoy "-1"
            {
                T[j]=put+1;                        
                NewFront.push_back(j);

            }
        }

    }

    if ( NewFront.empty()==1)               // if net resheniya
        {
        printf ("Net resheniya");
                getchar();
        end=1;
        return 0;
        }
   
    for (element = NewFront.begin (); element < NewFront.end (); element++)
    {
        i=(*element);
                printf ("%d ",i);
        if (i==t)                       // esli nashli reshenie
        {
            put=put+1;
            printf ("URA! %d dlina puti", put);
                        getchar();
            end=1;
            return 0;
        }
        }
                            // esli esche ne nashli
        put=put+1;
    OldFront.swap(NewFront);
    NewFront.clear();          // udalyaem vse elementy iz spiska

    }

}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог