// 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);
}
}
}
}
Односвязные списки в волновом алгоритме
Вот пытаюсь реализовать волновой алгоритм для нахожднения кратчайшего ( с минимальным кол-вом ребер) пути в графе между вершинами s и t.
Чувствую, что где-то с односвязными списками косяк.
Помогите, пожалуйста, у меня уже крыша сползает, а чувствую, что как всегда ошибка типа "запятую не там поставила"...
( хотя , может это только кажется )
P.S.
шаманский бубен не предлагать :)
Код:
Используй С++ и стандартные контейнеры.
а можно чуть подробнее? ( простите, я чайник )
STL пользуй... в этой библиотеке есть стандартный контейнер list, он тебе поможет.
Переменная 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;
}
}
{
if(ph!=NULL)
{
for(list *p=ph->next; p!=NULL; ph=p, p=p->next)
{
delete ph;
}
delete ph;
}
}
и по всей видимости удаление всех элементов списка, находится не на своем месте. Или как минимум, нужен break из цикла for (p=NewFront; p!=NULL; p =p->next), после удаления элементов списка. Так как после этого указатель p->next недействительный.
ОНО ,с..ка, работает!
( Вам конечно смешно :), наверное, но я радуюсь как ребенок :)
Итак:
Реализация волнового алгоритма для нахждения кратчайшег пути в графе между вершинами 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
}
}
#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
}
}