目錄
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到江源網(wǎng)站設(shè)計(jì)與江源網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋江源地區(qū)。1.內(nèi)容
2.分析
3.代碼
1)頭文件(Head.H)
2)功能函數(shù)(function.cpp)
3)主函數(shù)(main.cpp)
4.運(yùn)行結(jié)果(DEV)
5.總結(jié)
針對(duì)于有向圖和無(wú)向圖的鄰接表的建立,求頂點(diǎn)的度以及廣度和深度遍歷圖。(由于有向網(wǎng)和無(wú)向網(wǎng)與有向圖和無(wú)向圖大致一致,只是多了權(quán)值,這里不再贅述)
2.分析結(jié)構(gòu):圖的所有頂點(diǎn)存儲(chǔ)在一個(gè)數(shù)組當(dāng)中,然后數(shù)組中的每一個(gè)元素又是一個(gè)鏈表的頭節(jié)點(diǎn)。
求頂點(diǎn)的度:對(duì)于有向圖來(lái)說(shuō),出度就是頂點(diǎn)所在行所鏈接的元素的個(gè)數(shù)(使用鏈表的遍歷即可)
?入度就是指指向這個(gè)頂點(diǎn)的個(gè)數(shù),需要遍歷每一行的鏈表,找到有多少結(jié)點(diǎn)鏈接了這? ?個(gè)頂點(diǎn)。(比如求D點(diǎn)的入度,也就是看有哪些行鏈接了D點(diǎn))
深度遍歷:采用了遞歸的思想(類比二叉樹)
廣度遍歷:類似于二叉樹的層序遍歷。
在廣度和深度遍歷的時(shí)候,都需要考慮到圖不連通的情況,故我在下面的代碼中每個(gè)遍歷都由兩個(gè)函數(shù)構(gòu)成。
3.代碼我在這兒是建立了一個(gè)項(xiàng)目,包括了頭文件、功能函數(shù)以及主函數(shù)
1)頭文件(Head.H)#ifndef _FUNC_H
#define _FUNC_H
#define MVNum 100 //大頂點(diǎn)數(shù)
#define OK 1;
#define ERROR 0;
typedef char VerTexType; //頂點(diǎn)數(shù)據(jù)類型
typedef int Status;
typedef int QElemType;
typedef struct ArcNode{ //邊結(jié)點(diǎn)
int adjvex; //鄰接點(diǎn)的下標(biāo)
struct ArcNode *nextarc; //指向下一個(gè)鄰接點(diǎn)
}ArcNode;
typedef struct VNode{ //頂點(diǎn)信息
VerTexType data; //存放結(jié)點(diǎn)的內(nèi)容
ArcNode *firstarc; //指向第一個(gè)鄰接點(diǎn)
}VNode,AdjList[MVNum]; //建立頭結(jié)點(diǎn)和包含頭結(jié)點(diǎn)的數(shù)組AdjList;
typedef struct{
AdjList vertices; //包含頭節(jié)點(diǎn)的數(shù)組
int vexnum,arcnum; //邊數(shù)和點(diǎn)數(shù)
}ALGraph;
//隊(duì)列的結(jié)構(gòu)體
typedef struct QNode{
QElemType data; //數(shù)據(jù)
struct QNode *next; //指向下一個(gè)節(jié)點(diǎn)
}QNode,*QueuePtr;
//鏈隊(duì)列中又存在著頭尾指針
typedef struct{
QueuePtr front; //隊(duì)頭指針
QueuePtr rear; //隊(duì)尾指針
}LinkQueue;
extern Status CreateUDG(ALGraph &G);
extern Status LocateVex(ALGraph &G,VerTexType v);
extern Status CreateDG(ALGraph &G);
extern Status CalculateUDGD(ALGraph &G,VerTexType v);
extern Status CalculateDGI(ALGraph &G,VerTexType v);
extern Status CalculateSum(ALGraph &G,VerTexType v);
extern void DFSTraverse(ALGraph G);
extern void DFS(ALGraph G,int v);
extern void BFSTraverse(ALGraph G);
extern void BFS(ALGraph G,int v);
extern Status Reverse(ALGraph G);
extern void print();
extern Status InitQueue(LinkQueue &Q);
extern Status EnQueue(LinkQueue &Q,int e);
extern Status DeQueue(LinkQueue &Q,QElemType &e);
extern Status QueueEmpty(LinkQueue Q);
extern Status DestroyQueue(LinkQueue &Q);
#endif
2)功能函數(shù)(function.cpp)#includeusing namespace std;
#include "Head.H"
bool visited[MVNum]; //查看點(diǎn)是否被遍歷過(guò)
//菜單欄
void print(){
cout<<"==========================="<>G.vexnum>>G.arcnum; //輸入頂點(diǎn)數(shù)和邊數(shù)
cout<<"請(qǐng)輸入各個(gè)頂點(diǎn)的內(nèi)容:";
for(i=0;i>G.vertices[i].data; //建立數(shù)組的頭節(jié)點(diǎn)
G.vertices[i].firstarc=NULL; //使頭節(jié)點(diǎn)指針的指向均為空
}
for(k=0;k>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
ArcNode* p1=new ArcNode; //開辟一個(gè)結(jié)點(diǎn)
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc; //頭插法插入
G.vertices[i].firstarc=p1;
ArcNode* p2=new ArcNode; //開辟節(jié)點(diǎn)
p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p2;
}
return OK;
}
//有向圖
Status CreateDG(ALGraph &G){
int i,j,k;
VerTexType v1,v2;
cout<<"請(qǐng)輸入此有向圖的頂點(diǎn)和邊數(shù):";
cin>>G.vexnum>>G.arcnum;
cout<<"請(qǐng)輸入每個(gè)頂點(diǎn)的內(nèi)容:";
for(i=0;i>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
for(k=0;k>v1>>v2; //輸入相鄰兩點(diǎn)
i=LocateVex(G,v1); //定位
j=LocateVex(G,v2);
ArcNode *p=new ArcNode; //開辟一個(gè)空間
p->adjvex=j;
p->nextarc=G.vertices[i].firstarc; //頭插法插入
G.vertices[i].firstarc=p;
}
return OK;
}
Status LocateVex(ALGraph &G,VerTexType v){
int i;
for(i=0;inextarc;
n++;
}
return n;
}
//有向圖的入度
//需要把每個(gè)頂點(diǎn)遍歷一次,找到到點(diǎn)i的情況,增加1
Status CalculateDGI(ALGraph &G,VerTexType v){
if(LocateVex(G,v)==-1) return -1; //輸入的頂點(diǎn)錯(cuò)誤的情況
int i,j=LocateVex(G,v);
int n=0; //計(jì)數(shù)
ArcNode *p; //臨時(shí)指針
for(i=0;iadjvex==j)
n++;
p=p->nextarc;
}
}
return n;
}
//有向圖的總度
Status CalculateSum(ALGraph &G,VerTexType v){
if(LocateVex(G,v)==-1) return -1;
return CalculateUDGD(G,v)+CalculateDGI(G,v);
}
//遍歷輸出(深度優(yōu)先搜索遍歷)
void DFSTraverse(ALGraph G){
int i;
for(i=0;inextarc){
if(visited[p->adjvex]==false) DFS(G,p->adjvex);
}
}
//廣度優(yōu)先算法
void BFSTraverse(ALGraph G){
int i;
for(i=0;inextarc){
if(visited[p->adjvex]==false){
visited[p->adjvex]=true;
EnQueue(Q,p->adjvex);
}
}
}
}
//存儲(chǔ)結(jié)構(gòu)的遍歷
Status Reverse(ALGraph G){
int i,j;
ArcNode *p;
for(i=0;i";
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
cout<adjvex].data<<"->";
cout<<""<next=NULL; //頭指針的指針域置空
return OK;
}
//入隊(duì)列
Status EnQueue(LinkQueue &Q,int e){
QueuePtr p=new QNode; //開辟一個(gè)空間
p->data=e; //內(nèi)容存儲(chǔ)
Q.rear->next=p;
p->next=NULL;
Q.rear=p;
return OK;
}
//出隊(duì)列
//判斷是否為空
//不為空,判斷是否是只有一個(gè)元素
Status DeQueue(LinkQueue &Q,QElemType &e){
if(Q.front==Q.rear) return ERROR;
QueuePtr p=Q.front->next;
e=p->data; //得到元素值
Q.front->next=p->next;
if(p==Q.rear){
Q.rear=Q.front;
}
delete p;
return OK;
}
//判空
Status QueueEmpty(LinkQueue Q){
return (Q.front==Q.rear);
}
//銷毀隊(duì)列
Status DestroyQueue(LinkQueue &Q){
QueuePtr p;
while(Q.front){
p=Q.front;
Q.front=Q.front->next;
delete p;
}
return OK;
}
3)主函數(shù)(main.cpp)#includeusing namespace std;
#include "head.H"
int main(int argc, char** argv) {
VerTexType v;
ALGraph G;
char order1,order2; //選擇用char類型,使得當(dāng)選擇輸入為字母時(shí),不會(huì)出錯(cuò)。
cout<<"============================"<>order1;
}while(order1!='1'&&order1!='2'&&order1!='0');
switch(order1){
case '1':
do{
print();
cout<<"請(qǐng)輸入你的選擇:";
cin>>order2;
switch(order2){
case '1':
CreateUDG(G);
cout<<"此無(wú)向圖的鄰接表建立成功?。。?<>v;
if(CalculateUDGD(G,v)==-1)
cout<>order2;
switch(order2){
case '1':
CreateDG(G);
cout<<"此有向圖的鄰接表建立成功!??!"<>v;
if(CalculateUDGD(G,v)==-1)
cout<
4.運(yùn)行結(jié)果(DEV)無(wú)向圖:
建立
?
求度
遍歷
有向圖:
創(chuàng)建
?
求度
遍歷
5.總結(jié)總的來(lái)說(shuō),這個(gè)實(shí)驗(yàn)綜合性較強(qiáng),需要用到之前說(shuō)學(xué)的鏈表和隊(duì)列的操作,結(jié)構(gòu)也更加復(fù)雜。
謝謝閱讀,希望對(duì)大家有幫助吖!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章名稱:鄰接表的相關(guān)操作(類C語(yǔ)言)-創(chuàng)新互聯(lián)
本文鏈接:http://jinyejixie.com/article4/gpjie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、服務(wù)器托管、定制開發(fā)、云服務(wù)器、網(wǎng)站導(dǎo)航、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)