数据结构课程设计图 指针的指针.docx

上传人:b****6 文档编号:8154502 上传时间:2023-01-29 格式:DOCX 页数:23 大小:30.23KB
下载 相关 举报
数据结构课程设计图 指针的指针.docx_第1页
第1页 / 共23页
数据结构课程设计图 指针的指针.docx_第2页
第2页 / 共23页
数据结构课程设计图 指针的指针.docx_第3页
第3页 / 共23页
数据结构课程设计图 指针的指针.docx_第4页
第4页 / 共23页
数据结构课程设计图 指针的指针.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数据结构课程设计图 指针的指针.docx

《数据结构课程设计图 指针的指针.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计图 指针的指针.docx(23页珍藏版)》请在冰豆网上搜索。

数据结构课程设计图 指针的指针.docx

数据结构课程设计图指针的指针

课程设计

课程:

数据结构

题目:

图11(邻接表)

班级:

信管08级

姓名:

XXXXXX

学号:

XXXXXXXX

设计时间:

2010年01月10日——2010年05月10日

成绩:

指导教师:

XXXXXXXX

一、题目

题目

图11

结构

邻接表

表示

顶点链的头指针

回传方式

指针的指针

操作

图的基本操作

二、概要设计

1.存储结构

typedefstructvnode//顶点结构

{

chard;//顶点信息

structlnode*h;//邻接表表头

structvnode*next;//指向下一个顶点

charch;//遍历过程中访问标记

}*Net;

structlnode//邻接表结点结构

{

structvnode*a;//出端

structlnode*next;//指向下一个邻接点

};

图的邻接表存储(顶点链):

h-

→…→

顶点

→…

入端地址

→…

入端地址

→…

2..设计要点

(1)Netins_V(Net*G,charv)//插入顶点

(2)Netins_E(Net*G,charu,charv,floatc)//插入边

(3)NetDeleteEdge(Net*G,charVertex1,charVertex2)//删除边

(4)NetDeleteVertex(Net*G,charVertex)//删除顶点

(5)voidout1(Net*G)//输出

(6)voidout2(Net*G)//输出

(7)Netcreat1(Net*G)//创建图

(8)Netcreat2(Net*G)//创建图

(9)NetDFS(Net*G,charVertex)//广度优先遍历

(10)NetBFSM(Net*G,vnode&_ver)//深度优先遍历

(11)NetDFSL(Net*G)//深度优先遍历以邻接表存储的图G

3.存储要点

(1)创建图Netcreat1(Net*G)//创建

Netp=newvnode;

(2)插入顶点:

Netins_V(NetG,charv):

通过扫描图的顶点链表,找到链表的尾部,在尾部添加一个顶点。

(3)插入边:

Netins_E(NetG,charu,charv):

找到边顶点的地址,在相应的顶点下,将地址添加到链表中,一般追加到链表的尾部。

 

四源程序

#include

usingnamespacestd;

typedefstructvnode//顶点结构

{

chard;//顶点信息

structlnode*h;//邻接表表头

structvnode*next;//指向下一个顶点

charch;//遍历过程中访问标记

}*Net;

structlnode//邻接表结点结构

{

structvnode*a;//出端地址

structlnode*next;//指向下一个邻接点

};

structQNode//图的广度优先遍历,用到队列,再次定义队列

{

vnode*Ver;

QNode*Next;

};

structLQNode

{

QNode*front;

QNode*rear;

};

classQueue

{

public:

Queue();

~Queue();

boolEmptyQueue();

voidAddQueueNodeVertex(QNode**NV);

vnode*DeleteQueueNodeVertex();

private:

LQNode*LQ;

};

Queue:

:

Queue(){this->LQ=NULL;}

Queue:

:

~Queue(){}

boolQueue:

:

EmptyQueue()

{

if(this->LQ==NULL)

return1;

else

return0;

}

voidQueue:

:

AddQueueNodeVertex(QNode**NV)

{

QNode*P;

P=newQNode;

P->Ver=(*NV)->Ver;

P->Next=NULL;

if(this->LQ==NULL)

{

this->LQ=newLQNode;

this->LQ->front=P;

this->LQ->rear=P;

}

else

{

this->LQ->rear->Next=P;

this->LQ->rear=P;

}

}

vnode*Queue:

:

DeleteQueueNodeVertex()

{

if(this->EmptyQueue())

cout<<"对空!

"<

else

{

if(this->LQ->front==this->LQ->rear)

{

vnode*Q;

Q=this->LQ->front->Ver;

deletethis->LQ->front;

deletethis->LQ;

this->LQ=NULL;

returnQ;

}

else

{

vnode*Q;

QNode*P=this->LQ->front;

this->LQ->front=this->LQ->front->Next;

Q=P->Ver;

deleteP;

returnQ;

}

}

}

Netins_V(Net*G,charv)//插入顶点

{

Net_G=*G;

if(*G==NULL)

{

Netp=newvnode;

p->next=*G;

*G=p;

(*G)->h=0;

(*G)->d=v;

(*G)->ch='0';

}

else

{

while(_G->d!

=v&&_G->next!

=NULL)

{

_G=_G->next;

}

if(_G->next==NULL)

{

Netp=newvnode;

p->next=*G;

*G=p;

(*G)->h=0;

(*G)->d=v;

(*G)->ch='0';

}

else

{

cout<<"节点重复,请按任意键推出:

";

getchar();

exit

(1);

}

}

return*G;

}

Netins_E(Net*G,charu,charv,floatc)//插入边

{

Netp=*G,q=*G;

lnode*r;

while(p&&p->d!

=u)p=p->next;

while(q&&q->d!

=v)q=q->next;

r=newlnode;

r->next=p->h;

r->a=q;

p->h=r;

return*G;

}

voidout1(Net*G)//输出

{

Netp=*G;lnode*q;

while(p){

cout<<"顶点"<d<<"出端:

";

q=p->h;

if(q){cout<a->d<<'';q=q->next;}

while(q){cout<a->d<<'';q=q->next;}

cout<

p=p->next;

}

}

voidout2(Net*G)//输出

{

Netp=*G;lnode*q;

while(p){

cout<<"顶点"<d<<"出端:

";

q=p->h;

if(q){cout<a->d<<'';q=q->next;}

while(q){cout<a->d<<'';q=q->next;}

cout<

p=p->next;

}

}

Netcreat1(Net*G)//创建图

{

*G=ins_V(G,'d');*G=ins_V(G,'c');

*G=ins_V(G,'b');*G=ins_V(G,'a');

*G=ins_E(G,'a','b',8);

*G=ins_E(G,'a','c',7);

*G=ins_E(G,'b','c',6);

*G=ins_E(G,'c','d',5);

*G=ins_E(G,'d','a',6);

return*G;

}

Netcreat2(Net*G)//创建图

{

*G=ins_V(G,'p');*G=ins_V(G,'l');

*G=ins_V(G,'q');*G=ins_V(G,'n');

*G=ins_V(G,'m');

*G=ins_E(G,'m','n',6);

*G=ins_E(G,'m','q',8);

*G=ins_E(G,'n','q',9);

*G=ins_E(G,'q','l',6);

*G=ins_E(G,'l','p',5);

*G=ins_E(G,'p','m',4);

return*G;

}

voidVisit(charVertex)

{

cout<

}

boolJudgementInDegree(vnode&ver1,vnode&ver2)//判断ver1是否是ver2的入度接点

{

if(&ver1==&ver2)

{

return0;

}

else

{

if(ver1.h==NULL)

return0;

else

{

lnode*NE=NULL;

NE=ver1.h;

while(NE->next!

=NULL&&NE->a!

=&ver2)

{

NE=NE->next;

}

if(NE->a==&ver2)

return1;

else

return0;

}

}

}

NetDFS(Net*G,charVertex)

{

//ver1指向当前接点所在

vnode*ver1=NULL;

vnode*ver=*G;

while(ver->d!

=Vertex&&ver->next!

=NULL)

{

ver=ver->next;

}

if(ver->next==NULL&&ver->d!

=Vertex)

cout<<"输入顶点数据错误,程序退出!

"<

else

ver1=ver;

structnode

{

vnode*Ver;

node*next;

};

node*M=NULL;

node*N=NULL;

lnode*NE=NULL;

if(ver1->h==NULL)

M=NULL;

else

{

NE=ver1->h;

//M指向邻接点链表的头结点

M=newnode;

M->Ver=NE->a;

M->next=NULL;

N=M;

while(NE->next!

=NULL)

{

node*L=newnode;

L->Ver=NE->next->a;

L->next=NULL;

N->next=L;

N=L;

NE=NE->next;

}

}

ver=*G;

while(ver!

=NULL)

{

if(ver!

=ver1)

{

if(JudgementInDegree(*ver,*ver1))

{

node*LL=newnode;

LL->Ver=ver;

LL->next=NULL;

if(N==NULL)

{

N=LL;

M=N;

}

else

{

N->next=LL;

}

}

}

ver=ver->next;

}

node*k;

k=M;

ver1->ch='1';

Visit(ver1->d);

for(k=M;k!

=NULL;k=k->next)

{

if(k->Ver->ch=='0')

DFS(G,k->Ver->d);

}

return*G;

}

NetBFSM(Net*G,vnode&_ver)

{

vnode*_g=*G;

do

{

_g->ch='0';

_g=_g->next;

}while(_g!

=NULL);

QueueQue;

vnode*H;

Visit(_ver.d);

_ver.ch='1';

QNode*P=newQNode;

P->Ver=&_ver;

Que.AddQueueNodeVertex(&P);

while(Que.EmptyQueue()!

=1)

{

H=Que.DeleteQueueNodeVertex();

QNode*M=NULL;

QNode*N=NULL;

vnode*ver;

lnode*NE=NULL;

if(H->h==NULL)

M=NULL;

else

{

NE=H->h;

//M指向邻接点链表的头结点

M=newQNode;

M->Ver=NE->a;

M->Next=NULL;

N=M;

while(NE->next!

=NULL)

{

/*N->Vnext=NE->Enext->Edge;

N=NE->Enext->Edge;

NE=NE->Enext;*/

QNode*L=newQNode;

L->Ver=NE->next->a;

L->Next=NULL;

N->Next=L;

N=L;

NE=NE->next;

}

}

ver=*G;

while(ver!

=NULL)

{

if(ver!

=H)

{

if(JudgementInDegree(*ver,*H))

{

QNode*LL=newQNode;

LL->Ver=ver;

LL->Next=NULL;

if(N==NULL)

{

N=LL;

M=N;

}

else

{

N->Next=LL;

}

}

}

ver=ver->next;

}

QNode*A;

//QNode*B;

A=M;

while(A!

=NULL)

{

if(A->Ver->ch=='0')

{

Visit(A->Ver->d);

A->Ver->ch='1';

Que.AddQueueNodeVertex(&A);

}

A=A->Next;

}

}

return*G;

}

NetDeleteEdge(Net*G,charVertex1,charVertex2)

{

vnode*NA=NULL;

vnode*NB=NULL;

lnode*EA=NULL;

lnode*EB=NULL;

//NA指向当前Vertex1接点

NA=*G;

while(NA->d!

=Vertex1)

{

NA=NA->next;

}

//起始接点的边集

EA=NA->h;

//第一个接点是目标接点

if(EA->a->d==Vertex2)

{

//第一种情况为边集next为空

if(EA->next==NULL)

{

deleteEA;

NA->h=NULL;

}

//第二种情况为边集next不为空

else

{

NA->h=EA->next;

deleteEA;

}

}

//第一个接点不是目标接点

else

{

//EA是目标接点

//EB是前驱接点

EB=EA;

while(EA->a->d!

=Vertex2)

{

EB=EA;

EA=EA->next;

}

if(EA->a->d==Vertex2)

{

if(EA->next==NULL)

{

EB->next=NULL;

deleteEA;

}

else

{

if(EA->next!

=NULL)

{

EB->next=EA->next;

deleteEA;

}

}

}

}

return*G;

}

NetDeleteVertex(Net*G,charVertex)

{

//ver1指向当前接点所在

vnode*ver1=NULL;

vnode*ver=*G;

vnode*Q=ver;

while(ver->d!

=Vertex&&ver->d!

=NULL)

{

Q=ver;

ver=ver->next;

}

if(ver->next==NULL&&ver->d!

=Vertex)

cout<<"输入顶点数据错误,程序退出!

"<

else

ver1=ver;

structnode

{

vnode*Ver;

node*next;

};

node*M=NULL;

node*N=NULL;

node*K=NULL;

node*C=NULL;

lnode*NE=NULL;

if(ver1->h==NULL)

M=NULL;

else

{

NE=ver1->h;

//M指向邻接点链表的头结点

M=newnode;

M->Ver=NE->a;

M->next=NULL;

N=M;

while(NE->next!

=NULL)

{

/*N->Vnext=NE->Enext->Edge;

N=NE->Enext->Edge;

NE=NE->Enext;*/

node*L=newnode;

L->Ver=NE->next->a;

L->next=NULL;

N->next=L;

N=L;

NE=NE->next;

}

}

K=N;

ver=*G;

while(ver!

=NULL)

{

if(ver!

=ver1)

{

if(JudgementInDegree(*ver,*ver1))

{

node*LL=newnode;

LL->Ver=ver;

LL->next=NULL;

if(N==NULL)

{

N=LL;

C=N;

}

else

{

N->next=LL;

C=LL;

N=LL;

}

}

}

ver=ver->next;

}

node*A=NULL;

node*B=NULL;

A=M;

while(A!

=K)

{

DeleteEdge(G,Vertex,A->Ver->d);

A=A->next;

}

while(C!

=NULL)

{

DeleteEdge(G,C->Ver->d,Vertex);

C=C->next;

}

Q->next=ver1->next;

if(ver1==*G)

{

*G=ver1->next;

}

deletever1;

return*G;

}

voidmain()

{

charv1;

charv2;

charv3;

NetG1=0;//structvnode*G

cout<<"图1的输出如下:

"<

G1=creat1(&G1);

out1(&G1);

NetG2=0;

cout<

"<

G2=creat2(&G2);

out2(&G2);

cout<<"\n\n图1的深度优先遍历结果:

"<

DFS(&G1,'a');

cout<<"\n\n图1的广度优先遍历结果:

"<

BFSM(&G1,*G1);

cout<<"\n\n请输入删除的点:

";cin>>v3;

DeleteVertex(&G1,v3);

out1(&G1);

cout<<"\n\n请输入删除的边:

";cin>>v1;cin>>v2;

DeleteEdge(&G1,v1,v2);

out1(&G1);

getchar();

}

/*

d

bc

*/

图1的输出如下:

顶点a出端:

c

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1