DELPHI如何遍历内存

DELPHI如何遍历内存,第1张

我不太理解你的问题, 你要遍历是比较重排某一栏吗. 如果嫌中视Tlistview为一个二维阵列, 它的最左边一栏目 并不闷者或是 items.objects[0], 而是caption,

第蚂伍二栏目才是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)//释放邻接表空间

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12427729.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存