亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bo7-3.cpp

?? 數據結構(清華大學版本的)附屬源代碼
?? CPP
字號:
 // bo7-3.cpp 有向圖的十字鏈表存儲(存儲結構由c7-3.h定義)的基本函數(15個)
 int LocateVex(OLGraph G,VertexType u)
 { // 返回頂點u在有向圖G中的位置(序號),如不存在則返回-1
   int i;
   for(i=0;i<G.vexnum;++i) // 用循環查找該結點
     if(!strcmp(G.xlist[i].data,u))
       return i;
   return -1;
 }

 Status CreateDG(OLGraph &G)
 { // 采用十字鏈表存儲表示,構造有向圖G。算法7.3
   int i,j,k;
   int IncInfo;
   char str[MAX_Info];
   ArcBox *p;
   VertexType v1,v2;
   printf("請輸入有向圖的頂點數,弧數,弧是否含其它信息(是:1,否:0): ");
   scanf("%d,%d,%d",&G.vexnum,&G.arcnum,&IncInfo);
   printf("請輸入%d個頂點的值(<%d個字符):\n",G.vexnum,MAX_VERTEX_NAME);
   for(i=0;i<G.vexnum;++i)
   { // 構造表頭向量
     scanf("%s",&G.xlist[i].data); // 輸入頂點值
     G.xlist[i].firstin=NULL; // 初始化指針
     G.xlist[i].firstout=NULL;
   }
   printf("請輸入%d條弧的弧尾和弧頭(空格為間隔):\n",G.arcnum);
   for(k=0;k<G.arcnum;++k)
   { // 輸入各弧并構造十字鏈表
     scanf("%s%s",&v1,&v2);
     i=LocateVex(G,v1); // 確定v1和v2在G中的位置
     j=LocateVex(G,v2);
     p=(ArcBox *)malloc(sizeof(ArcBox)); // 產生弧結點(假定有足夠空間)
     p->tailvex=i; // 對弧結點賦值
     p->headvex=j;
     p->hlink=G.xlist[j].firstin; // 完成在入弧和出弧鏈表表頭的插入
     p->tlink=G.xlist[i].firstout;
     G.xlist[j].firstin=G.xlist[i].firstout=p;
     if(IncInfo)
     { // 若弧含有相關信息,則輸入
       printf("請輸入該弧的相關信息(<%d個字符): ",MAX_Info);
       scanf("%s",str);
       p->info=(InfoType *)malloc((strlen(str)+1)*sizeof(InfoType));
       strcpy(p->info,str);
     }
     else // 弧不含有相關信息
       p->info=NULL;
   }
   return OK;
 }

 void DestroyGraph(OLGraph &G)
 { // 初始條件: 有向圖G存在
   // 操作結果: 銷毀有向圖G
   int j;
   ArcBox *p,*q;
   for(j=0;j<G.vexnum;j++) // 對所有頂點
   {
     p=G.xlist[j].firstout; // 僅處理出弧
     while(p)
     {
       q=p;
       p=p->tlink;
       if(q->info)
         free(q->info);
       free(q);
     }
   }
   G.arcnum=0;
   G.vexnum=0;
 }

 VertexType& GetVex(OLGraph G,int v)
 { // 初始條件:有向圖G存在,v是G中某個頂點的序號。操作結果:返回v的值
   if(v>=G.vexnum||v<0)
     exit(ERROR);
   return G.xlist[v].data;
 }

 Status PutVex(OLGraph &G,VertexType v,VertexType value)
 { // 初始條件: 有向圖G存在,v是G中某個頂點
   // 操作結果: 對v賦新值value
   int i;
   i=LocateVex(G,v);
   if(i<0) // v不是G的頂點
     return ERROR;
   strcpy(G.xlist[i].data,value);
   return OK;
 }

 int FirstAdjVex(OLGraph G,VertexType v)
 { // 初始條件: 有向圖G存在,v是G中某個頂點
   // 操作結果: 返回v的第一個鄰接頂點的序號。若頂點在G中沒有鄰接頂點,則返回-1
   int i;
   ArcBox *p;
   i=LocateVex(G,v);
   p=G.xlist[i].firstout; // p指向頂點v的第1個出弧
   if(p)
     return p->headvex;
   else
     return -1;
 }

 int NextAdjVex(OLGraph G,VertexType v,VertexType w)
 { // 初始條件: 有向圖G存在,v是G中某個頂點,w是v的鄰接頂點
   // 操作結果: 返回v的(相對于w的)下一個鄰接頂點的序號,
   //           若w是v的最后一個鄰接頂點,則返回-1
   int i,j;
   ArcBox *p;
   i=LocateVex(G,v); // i是頂點v的序號
   j=LocateVex(G,w); // j是頂點w的序號
   p=G.xlist[i].firstout; // p指向頂點v的第1個出弧
   while(p&&p->headvex!=j)
     p=p->tlink;
   if(p) // w不是v的最后一個鄰接頂點
     p=p->tlink; // p指向相對于w的下一個鄰接頂點
   if(p) // 有下一個鄰接頂點
     return p->headvex;
   else
     return -1;
 }

 void InsertVex(OLGraph &G,VertexType v)
 { // 初始條件: 有向圖G存在,v和有向圖G中頂點有相同特征
   // 操作結果: 在有向圖G中增添新頂點v(不增添與頂點相關的弧,留待InsertArc()去做)
   strcpy(G.xlist[G.vexnum].data,v);
   G.xlist[G.vexnum].firstin=G.xlist[G.vexnum].firstout=NULL;
   G.vexnum++;
 }

 Status DeleteVex(OLGraph &G,VertexType v)
 { // 初始條件: 有向圖G存在,v是G中某個頂點
   // 操作結果: 刪除G中頂點v及其相關的弧
   int j,k;
   ArcBox *p,*q;
   k=LocateVex(G,v); // k是頂點v的序號
   if(k<0) // v不是圖G的頂點
     return ERROR;
   // 以下刪除頂點v的出弧
   for(j=0;j<G.vexnum;j++) // 頂點v的出弧是其它頂點的入弧
   {
     if(j==k)
       continue;
     p=G.xlist[j].firstin; // 在其它頂點的入弧鏈表中刪除頂點v的出弧
     while(p)
       if(p->tailvex==k&&p==G.xlist[j].firstin) // 待刪結點為首結點
       {
         G.xlist[j].firstin=p->hlink;
         break;
       }
       else if(p->tailvex!=k) // 沒找到待刪結點
       {
         q=p;
         p=p->hlink;
       }
       else // 找到待刪結點且不是首結點
       {
         q->hlink=p->hlink;
         break;
       }
   }
   p=G.xlist[k].firstout; // 刪除與頂點v有關的出弧
   while(p)
   {
     q=p->tlink; // q指向p的下一個出弧
     if(p->info) // 釋放p
       free(p->info);
     free(p);
     G.arcnum--;
     p=q;
   }
   // 以下刪除頂點v的入弧
   for(j=0;j<G.vexnum;j++) // 頂點v的入弧是其它頂點的出弧
   {
     if(j==k)
       continue;
     p=G.xlist[j].firstout; // 在其它頂點的出弧鏈表中刪除頂點v的入弧
     while(p)
       if(p->headvex==k&&p==G.xlist[j].firstout) // 待刪結點為首結點
       {
         G.xlist[j].firstout=p->tlink;
         break;
       }
       else if(p->headvex!=k) // 沒找到待刪結點
       {
         q=p;
         p=p->tlink;
       }
       else // 找到待刪結點且不是首結點
       {
	 q->tlink=p->tlink;
         break;
       }
   }
   p=G.xlist[k].firstin; // 刪除與頂點v有關的入弧
   while(p)
   {
     q=p->hlink; // q指向p的下一個入弧
     if(p->info) // 釋放p
       free(p->info);
     free(p);
     G.arcnum--;
     p=q;
   }
   for(j=k+1;j<G.vexnum;j++) // 序號>k的頂點依次向前移
     G.xlist[j-1]=G.xlist[j];
   G.vexnum--; // 頂點數減1
   for(j=0;j<G.vexnum;j++) // 結點序號>k的要減1
   {
     p=G.xlist[j].firstout; // 處理出弧
     while(p)
     {
       if(p->tailvex>k)
         p->tailvex--; // 序號-1
       if(p->headvex>k)
         p->headvex--; // 序號-1
       p=p->tlink;
     }
   }
   return OK;
 }

 Status InsertArc(OLGraph &G,VertexType v,VertexType w)
 { // 初始條件: 有向圖G存在,v和w是G中兩個頂點
   // 操作結果: 在G中增添弧<v,w>
   int i,j;
   int IncInfo;
   char str[MAX_Info];
   ArcBox *p;
   i=LocateVex(G,v); // 弧尾的序號
   j=LocateVex(G,w); // 弧頭的序號
   if(i<0||j<0)
     return ERROR;
   p=(ArcBox *)malloc(sizeof(ArcBox)); // 生成新結點
   p->tailvex=i; // 給新結點賦值
   p->headvex=j;
   p->hlink=G.xlist[j].firstin; // 插在入弧和出弧的鏈頭
   p->tlink=G.xlist[i].firstout;
   G.xlist[j].firstin=G.xlist[i].firstout=p;
   G.arcnum++; // 弧數加1
   printf("要插入的弧是否含有其它信息(是: 1,否: 0): ");
   scanf("%d",&IncInfo);
   if(IncInfo)
   {
     printf("請輸入該弧的相關信息(<%d個字符): ",MAX_Info);
     scanf("%s",str);
     p->info=(InfoType *)malloc((strlen(str)+1)*sizeof(InfoType));
     strcpy(p->info,str);
   }
   else
     p->info=NULL;
   return OK;
 }

 Status DeleteArc(OLGraph &G,VertexType v,VertexType w)
 { // 初始條件: 有向圖G存在,v和w是G中兩個頂點
   // 操作結果: 在G中刪除弧<v,w>
   int i,j;
   ArcBox *p1,*p2;
   i=LocateVex(G,v); // 弧尾的序號
   j=LocateVex(G,w); // 弧頭的序號
   if(i<0||j<0||i==j)
     return ERROR;
   p2=G.xlist[i].firstout; // 將弧結點從出弧鏈表中刪去
   if(p2&&p2->headvex==j) // 第1個結點為待刪除結點
     G.xlist[i].firstout=p2->tlink;
   else
   {
     while(p2&&p2->headvex!=j) // 向后找
     {
       p1=p2;
       p2=p2->tlink;
     }
     if(p2) // 沒到表尾
       p1->tlink=p2->tlink;
   }
   p2=G.xlist[j].firstin; // 將弧結點從入弧鏈表中刪去
   if(p2&&p2->tailvex==i)
     G.xlist[j].firstin=p2->hlink;
   else
   {
     while(p2&&p2->tailvex!=i)
     {
       p1=p2;
       p2=p2->hlink;
     }
     if(p2) // 沒到表尾
       p1->hlink=p2->hlink;
   }
   if(p2->info) // 釋放弧結點
     free(p2->info);
   free(p2);
   G.arcnum--; // 弧數減1
   return OK;
 }

 Boolean visited[MAX_VERTEX_NUM]; // 訪問標志數組
 Status(*VisitFunc)(VertexType); // 函數變量
 void DFS(OLGraph G,int i) // DFSTraverse()調用
 {
   ArcBox *p;
   visited[i]=TRUE; // 訪問標志數組置1(已被訪問)
   VisitFunc(G.xlist[i].data); // 遍歷第i個頂點
   p=G.xlist[i].firstout; // p指向第i個頂點的出度
   while(p&&visited[p->headvex]) // p沒到表尾且該弧的頭頂點已被訪問
     p=p->tlink; // 查找下一個結點
   if(p&&!visited[p->headvex]) // 該弧的頭頂點未被訪問
     DFS(G,p->headvex); // 遞歸調用DFS()
 }

 void DFSTraverse(OLGraph G,Status(*Visit)(VertexType))
 { // 初始條件: 有向圖G存在,v是G中某個頂點,Visit是頂點的應用函數
   // 操作結果: 從第1個頂點起,按深度優先遞歸遍歷有向圖G,并對每個頂點調用
   //           函數Visit一次且僅一次。一旦Visit()失敗,則操作失敗
   int i;
   for(i=0;i<G.vexnum;i++)
     visited[i]=FALSE; // 訪問標志數組置初值(未被訪問)
   VisitFunc=Visit;
   for(i=0;i<G.vexnum;i++) // 由序號0開始,繼續查找未被訪問過的頂點
     if(!visited[i])
       DFS(G,i);
   printf("\n");
 }

 typedef int QElemType;
 #include"c3-3.h"
 #include"bo3-3.cpp"
 void BFSTraverse(OLGraph G,Status(*Visit)(VertexType))
 { // 初始條件: 有向圖G存在,Visit是頂點的應用函數。算法7.6
   // 操作結果: 從第1個頂點起,按廣度優先非遞歸遍歷有向圖G,并對每個頂點調用
   //           函數Visit一次且僅一次。一旦Visit()失敗,則操作失敗。
   //           使用輔助隊列Q和訪問標志數組visited
   int v,u,w;
   VertexType u1,w1;
   SqQueue Q;
   for(v=0;v<G.vexnum;v++)
     visited[v]=FALSE;
   InitQueue(Q);
   for(v=0;v<G.vexnum;v++)
     if(!visited[v])
     {
       visited[v]=TRUE;
       Visit(G.xlist[v].data);
       EnQueue(Q,v);
       while(!QueueEmpty(Q))
       {
         DeQueue(Q,u);
         strcpy(u1,GetVex(G,u));
         for(w=FirstAdjVex(G,u1);w>=0;w=NextAdjVex(G,u1,strcpy(w1,GetVex(G,w))))
           if(!visited[w]) // w為u的尚未訪問的鄰接頂點的序號
           {
             visited[w]=TRUE;
             Visit(G.xlist[w].data);
             EnQueue(Q,w);
           }
       }
     }
   printf("\n");
 }

 void Display(OLGraph G)
 { // 輸出有向圖G
   int i;
   ArcBox *p;
   printf("共%d個頂點,%d條弧:\n",G.vexnum,G.arcnum);
   for(i=0;i<G.vexnum;i++)
   {
     printf("頂點%s: 入度: ",G.xlist[i].data);
     p=G.xlist[i].firstin;
     while(p)
     {
       printf("%s ",G.xlist[p->tailvex].data);
       p=p->hlink;
     }
     printf("出度: ");
     p=G.xlist[i].firstout;
     while(p)
     {
       printf("%s ",G.xlist[p->headvex].data);
       if(p->info) // 該弧有相關信息
         printf("弧信息: %s ",p->info);
       p=p->tlink;
     }
     printf("\n");
   }
 }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜日本在线观看| 国产经典欧美精品| 久久99精品国产91久久来源| 99精品国产99久久久久久白柏| 欧美精品一卡二卡| 日韩一区在线看| 国产乱子伦视频一区二区三区 | 国产综合色精品一区二区三区| 91在线视频网址| 久久综合色之久久综合| 亚洲一区成人在线| 99久久99久久精品国产片果冻 | 亚洲欧洲日韩在线| 美女www一区二区| 欧美日韩电影一区| 1区2区3区欧美| 国产乱人伦偷精品视频免下载| 91精品婷婷国产综合久久竹菊| 亚洲视频你懂的| 成人一区在线观看| 国产亚洲综合色| 国内精品写真在线观看| 欧美高清hd18日本| 亚洲444eee在线观看| 日本道精品一区二区三区| 国产精品天天看| 国产69精品久久777的优势| 久久久99精品免费观看不卡| 国产毛片精品视频| 国产片一区二区| 国产99久久久精品| 欧美国产激情一区二区三区蜜月| 激情五月婷婷综合网| 26uuu国产日韩综合| 久久成人羞羞网站| 精品日本一线二线三线不卡| 美国三级日本三级久久99| 日韩三级电影网址| 久久爱另类一区二区小说| 日韩美一区二区三区| 久久爱www久久做| 久久精品人人做人人爽人人| 国产成人在线视频免费播放| 中文字幕不卡一区| 91免费看视频| 亚洲第一在线综合网站| 欧美日韩国产电影| 毛片不卡一区二区| 2017欧美狠狠色| 懂色av一区二区在线播放| 亚洲男人天堂一区| 欧美日韩午夜影院| 日本最新不卡在线| 久久久三级国产网站| 成人免费观看视频| 亚洲不卡av一区二区三区| 欧美一区二区三区婷婷月色| 国产在线一区观看| 国产精品久久久久久久裸模| 欧美午夜精品久久久| 免费高清视频精品| 日本一区二区高清| 欧美最新大片在线看| 麻豆视频一区二区| 国产精品久线在线观看| 日韩三级精品电影久久久| 国产精品资源在线观看| 国产精品久久久久久久第一福利| 色久优优欧美色久优优| 久久精品国产精品亚洲综合| 亚洲欧洲av色图| 欧美猛男男办公室激情| 懂色中文一区二区在线播放| 亚洲国产一区视频| 久久蜜臀精品av| 欧美日韩国产在线观看| 大陆成人av片| 蜜桃精品视频在线观看| 中文字幕日本乱码精品影院| 欧美一级欧美一级在线播放| 国产精品一区三区| 日韩专区欧美专区| 亚洲图片欧美激情| 精品国产91久久久久久久妲己| 色综合网色综合| 国产乱子伦视频一区二区三区| 亚洲不卡一区二区三区| 国产精品国产三级国产| 欧美精品一区二区三区蜜臀| 欧美亚洲综合色| 成人免费看视频| 国产精品99久久久久久久vr| 午夜av区久久| 国产精品美日韩| 欧美mv和日韩mv的网站| 欧美日韩国产首页在线观看| 91蝌蚪porny| 成人国产亚洲欧美成人综合网| 极品少妇一区二区| 午夜免费久久看| 亚洲美女屁股眼交| 中文在线一区二区| 久久免费看少妇高潮| 欧美日韩国产一二三| 在线亚洲人成电影网站色www| 粉嫩蜜臀av国产精品网站| 国产一区在线精品| 精品影视av免费| 奇米影视一区二区三区| 亚洲chinese男男1069| 亚洲国产精品一区二区久久恐怖片| 自拍偷拍亚洲欧美日韩| 欧美韩国日本不卡| 国产三级一区二区| 国产精品欧美一区喷水| 国产无遮挡一区二区三区毛片日本| 欧美不卡在线视频| 久久综合视频网| 久久精品一区蜜桃臀影院| 久久午夜电影网| 亚洲精品一区二区三区香蕉| 26uuu精品一区二区| 久久久精品国产99久久精品芒果| 久久久99免费| 中文字幕中文字幕一区| 国产精品卡一卡二| 亚洲激情六月丁香| 亚洲成人福利片| 秋霞午夜av一区二区三区| 激情亚洲综合在线| 国产在线一区观看| eeuss鲁片一区二区三区在线看| 成人激情黄色小说| 色国产精品一区在线观看| 欧美日韩三级视频| 日韩精品一区在线| 国产精品麻豆久久久| 中文字幕+乱码+中文字幕一区| 中文字幕一区二区在线观看| 亚洲综合成人在线视频| 狠狠v欧美v日韩v亚洲ⅴ| 成人ar影院免费观看视频| 99精品久久只有精品| 欧美日韩高清不卡| 日韩免费福利电影在线观看| 欧美国产精品v| 日韩在线播放一区二区| 国产精华液一区二区三区| 日本韩国欧美在线| 日韩视频国产视频| 1024成人网| 麻豆91在线播放| 成人网页在线观看| 91精品国产手机| 中文字幕欧美日韩一区| 天天av天天翘天天综合网 | 亚洲a一区二区| 国产美女久久久久| 欧美主播一区二区三区| 日韩精品专区在线影院观看| 国产精品每日更新在线播放网址| 亚洲在线观看免费视频| 黑人精品欧美一区二区蜜桃| 成人高清在线视频| 日韩一区二区三区在线视频| 亚洲美女淫视频| 国产精品亚洲视频| 欧美日韩电影一区| 亚洲免费看黄网站| 国产精品99久久久久久宅男| 欧美精三区欧美精三区| 国产精品女主播在线观看| 久久成人久久鬼色| 欧美午夜片在线看| 亚洲欧美一区二区久久| 国产成人a级片| 欧美成人伊人久久综合网| 亚洲一区二区av在线| 91日韩在线专区| 国产精品久久久久久久久免费丝袜 | 国产片一区二区| 看国产成人h片视频| 欧美无乱码久久久免费午夜一区| 欧美激情在线观看视频免费| 久久成人久久鬼色| 日韩三级电影网址| 日精品一区二区三区| 欧美在线免费观看亚洲| 亚洲丝袜制服诱惑| 成人综合在线网站| 欧美一区二区成人6969| 亚洲主播在线播放| 在线欧美日韩精品| 一区二区三区.www| 91激情在线视频| 一区二区三区鲁丝不卡| 色欧美乱欧美15图片| 中文字幕一区二区日韩精品绯色| 国产成人综合亚洲91猫咪| 国产日韩欧美一区二区三区乱码 |