第蚂伍二栏目才是items.objects[0],
------------------------
~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TForm1.ListView1Compare(
Sender: TObject
Item1,
Item2: TListItem
Data: Integer
var Compare: Integer)
var
intItem1,
intItem2: Integer
begin
intItem1 := StrToInt(Item1.Caption)
intItem2 := StrToInt(Item2.Caption)
if intItem1 <intItem2 then
Compare := -1
else
if intItem1 >intItem2 then
Compare := 1
else // intItem1 = intItem2
Compare := 0
end
里面多了查找路径功能。#define t true
#define f false
#include<iostream.h>
struct node//定义一个结构作为节点类型
{
int data
bool sign//标志位,用来标示是否遍历过
node *next
}
node* creategraph()//建立邻接表,完成无向图的输入
{
int l,m,n
bool g
cout<<"请输入节点数: "
cin>>n
node *adjacencylist=new node[n+1]//动态分配节点数组凯森内存
adjacencylist[0].data=n//0地址存放的为节点数
adjacencylist[0].next=NULL
for(int i=1i<=ni++)//给各顶点域赋初值
{
adjacencylist[i].data=0
adjacencylist[i].next=NULL
adjacencylist[i].sign=f//表示未遍历
}
cout<<"请依次输入各条边的始点和尾点:(以0表示结束)"<<endl
cin>>l
if(l!=0)//判断输入边是否结束
g=t
while(g==t)
{
cin>>m
if((l>0)&&(l<=n)&&(m>0)&&(m<=n))//判断输入顶点是否正确
{
node *p,*q,*top
p=(node *)new(node)//分配边的一个顶点内存
p->data=m
p->next=NULL
if(adjacencylist[l].next==NULL)//为每个节点创建邻接链表
adjacencylist[l].next=p
else
{
top=adjacencylist[l].next
while(top->next!=NULL)
top=top->next
top->next=p
}
adjacencylist[l].data++//统计邻接点的个数
q=(node *)new(node)//分配边的另一个顶点内存
q->data=l
q->next=NULL
if(adjacencylist[m].next==NULL)//构建邻接表
adjacencylist[m].next=q
else
{
top=adjacencylist[m].next
while(top->next!=NULL)
top=top->next
top->next=q
}
adjacencylist[m].data++//统计邻接点的个数
}
else
cout<<"边"<<l<<"--"<<m<<"余丛输入错误!"<<endl//错误输入标识
cin>>l
if(l==0)//边的输入结束
g=f
}
return adjacencylist//返回邻接表
}
void DepthFirstSearch(node *list)//深度优先搜索
{
int m,n=list[0].data,k,*a=new int[n]//设置一个数组用于存放节点
node *p
cout<<"采用深度优先搜索:"<<endl
cout<<"请输入搜索起始竖孙樱节点:"
cin>>k
for(int i=0i<ni++)
{
a[i]=k
list[k].sign=t
if(i==n-1)
break
m=0
while(list[k].sign==t)
{
p=list[k].next
while(p!=NULL)//找出list[k]链表中的未遍历节点
{
k=p->data
p=p->next
if(list[k].sign==f)
break
}
m++
if(list[k].sign!=f)//判断是否是p=NULL跳出while循环的
{
if(i<m)//无节点可回溯
{
cout<<"该图为非连通图!"<<endl
break
}
else
k=a[i-m]//回溯
}
}
}
for(i=1i<=ni++)//恢复原邻接表
list[i].sign=f
cout<<"深度优先搜索遍历顺序为:"
for(i=0i<ni++)//输出遍历结果
cout<<a[i]<<" "
cout<<endl
delete a//释放动态数组内存
}
void BreadthFirstSearth(node *list)//广度优先搜索
{
int m,r,k,n=list[0].data,*a=new int[n+1]//设置数组存放节点
node *p
cout<<"采用广度优先搜索:"<<endl
cout<<"请输入搜索起始节点:"
cin>>k
a[0]=n
a[1]=k
list[k].sign=t//标识遍历的第一个节点
m=0
r=1
while(m!=r)
{
m++
p=list[a[m]].next
while(p!=NULL)
{
k=p->data
if(list[k].sign==f)
{
r++
a[r]=k//遍历到的节点存入数组
list[k].sign=t//标识已经遍历过的节点
}
p=p->next
}
}
for(int i=1i<=ni++)//恢复原邻接表
list[i].sign=f
cout<<"广度优先搜索遍历顺序为: "
for(i=1i<=ni++)//输出遍历
cout<<a[i]<<" "
cout<<endl
delete a//释放动态数组内存
}
void PathSearth(node *list)//路径搜索
{
int *a,c,d,m,k,n=list[0].data
cout<<"请输入起始点:"
cin>>k
cout<<"请输入尾节点:"
cin>>c
cout<<"请输入要找的路径长度:"
cin>>d
d=d+1
if(d>n)
cout<<"不存在这样的简单路径!"<<endl
else
{
a=new int[d]//动态分配数组内存存放路径上的节点
for(int i=0i<di++)
a[i]=0
a[0]=k
node *p
int x
list[a[0]].sign=t
i=1
while(a[d-1]!=c)
{
while(i<d)
{
x=1
p=list[a[i-1]].next
while(p!=NULL)
{
m=p->data
if(i==d-1&&m==a[0]&&a[0]==c)//路径存在且为回路
{
cout<<"该路径为一条回路!"<<endl
a[i]=m
i++
break
}
if(list[m].sign==f)
{
if(a[i]!=0)
{
if(x==0)//是否为已经判断过的错误路径
{
a[i]=m
list[a[i]].sign=t//标识走过节点
i++
break
}
if(a[i]==m)//设置错误路径标识
x=0
}
else
{
a[i]=m
list[a[i]].sign=t//标识走过节点
i++
break
}
}
p=p->next
}
if(p==NULL)
{
a[i]=0
i--//由此节点往下的路径不存在,回溯
list[a[i]].sign=f //还原标识符
}
if(i==0)//无法回溯,路径不存在,跳出循环
{
cout<<"不存在这样的简单路径!"<<endl
break
}
}
if(i==0)//无法回溯,路径不存在,跳出循环
break
if(a[d-1]!=c)//路径不是所要找的
{
i--//回溯
if(i>=0)
list[a[i]].sign=f//还原标识符
}
}
if(a[d-1]==c)//判断路径是否找到并输出
{
cout<<"从节点"<<k<<"到节点"<<c<<"的一条路径为:"
for(i=0i<d-1i++)//输出路径
cout<<a[i]<<"-->"
cout<<a[d-1]<<endl
}
delete a
}
for(int i=1i<=ni++)//恢复原邻接表
list[i].sign=f
}
void AdjacencyListDelete(node *list)//释放邻接表的空间
{
node *p,*q
int n=list[0].data
for(int i=1i<=ni++)
{
p=list[i].next
while(p!=NULL)
{
q=p->next
delete p//释放链表节点空间
p=q
}
}
delete list//释放邻接表空间
}
void main()
{
node *list
list=creategraph()//以邻接表的形式建立一个无向图
char a,b
cout<<"请选择遍历方法:(d:深度优先搜索b:广度优先搜索)"
for(int i=1i<2i++)
{
cin>>a
switch(a)
{
case 'd':
case 'D': DepthFirstSearch(list)
cout<<"是否采用广度优先搜索重新遍历?(y:是n:否)"
cin>>b
if((b=='y')||(b=='Y'))
BreadthFirstSearth(list)
break
case 'b':
case 'B': BreadthFirstSearth(list)
cout<<"是否采用深度优先搜索重新遍历?(y:是n:否)"
cin>>b
if((b=='y')||(b=='Y'))
DepthFirstSearch(list)
break
default: cout<<"输入错误!请重新输入!"<<endl
i--
}
}
while(1)
{
cout<<"是否搜索路径?(y:是n:否)"
cin>>a
if((a=='y')||(a=='Y'))
PathSearth(list)
else if((a=='n')||(a=='N'))
break
else
cout<<"输入错误!"<<endl
}
AdjacencyListDelete(list)//释放邻接表空间
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)