数据结构课程设计图 指针的指针.docx
- 文档编号:8154502
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:23
- 大小:30.23KB
数据结构课程设计图 指针的指针.docx
《数据结构课程设计图 指针的指针.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计图 指针的指针.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构课程设计图指针的指针
课程设计
课程:
数据结构
题目:
图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<<"顶点"< "; q=p->h; if(q){cout< while(q){cout< cout< p=p->next; } } voidout2(Net*G)//输出 { Netp=*G;lnode*q; while(p){ cout<<"顶点"< "; q=p->h; if(q){cout< while(q){cout< 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计图 指针的指针 数据结构 课程 设计图 指针
![提示](https://static.bdocx.com/images/bang_tan.gif)