Dijkstra算法完整實現(xiàn)源代碼_第1頁
Dijkstra算法完整實現(xiàn)源代碼_第2頁
Dijkstra算法完整實現(xiàn)源代碼_第3頁
Dijkstra算法完整實現(xiàn)源代碼_第4頁
Dijkstra算法完整實現(xiàn)源代碼_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Dijkstra算法的完整實現(xiàn)版本,算法的源代碼/*Dijkstra.cCopyright(c)2002,2006byctu_85AllRightsReserved.*/#include"stdio.h"#include"malloc.h"#definemaxium32767#definemaxver9/*definesthemaxnumberofvertexswhichtheprogrammcanhandle*/#defineOK1structPoint{charvertex[3];structLink*work;structPoint*next;};structLink{charvertex[3];intvalue;structLink*next;};structTable/*theworkbannchofthealgorithm*/{intcost;intKnown;charvertex[3];charpath[3];structTable*next;};intDijkstra(structPoint*,structTable*);intPrintTable(int,structTable*);intPrintPath(int,structTable*,structTable*);structTable*CreateTable(int,int);structPoint*FindSmallest(structTable*,structPoint*);/*Findthevertexwhichhasthesmallestvalueresideinthetable*/intmain(){inti,j,num,temp,val;charc;structPoint*poinpre,*poinhead,*poin;structLink*linpre,*linhead,*lin;structTable*tabhead;poinpre=poinhead=poin=(structPoint*)malloc(sizeof(structPoint));poin->next=NULL;poin->work=NULL;restart:printf("Notice:ifyouwannatoinputavertex,youmustusetheformatofnumber!\n");printf("Pleaseinputthenumberofpoints:\n");scanf("%d",&num);if(num>maxver||num<1||num%1!=0){printf("\nNumberofpointsexception!");gotorestart;}for(i=0;i<num;i++){printf("Pleaseinputthepointsnexttopoint%d,endwith0:\n",i+1);poin=(structPoint*)malloc(sizeof(structPoint));poinpre->next=poin;poin->vertex[0]='v';poin->vertex[1]='0'+i+1;poin->vertex[2]='\0';linpre=lin=poin->work;linpre->next=NULL;for(j=0;j<num-1;j++){printf("Thenumberofthe%dthvertexlinkedtovertex%d:",j+1,i+1);scanf("%d",&temp);if(temp==0){lin->next=NULL;break;}else{lin=(structLink*)malloc(sizeof(structLink));linpre->next=lin;lin->vertex[0]='v';lin->vertex[1]='0'+temp;lin->vertex[2]='\0';printf("Pleaseinputthevaluebetwixt%dthpointtowards%dthpoint:",i+1,temp);scanf("%d",&val);lin->value=val;linpre=linpre->next;lin->next=NULL;}poinpre=poinpre->next;poin->next=NULL;}printf("PleaseenterthevertexwhereDijkstraalgorithmstarts:\n");scanf("%d",&temp);tabhead=CreateTable(temp,num);Dijkstra(poinhead,tabhead);PrintTable(temp,tabhead);returnOK;structTable*CreateTable(intvertex,inttotal){structTable*head,*pre,*p;inti;head=pre=p=(structTable*)malloc(sizeof(structTable));p->next=NULL;for(i=0;i<total;i++){p=(structTable*)malloc(sizeof(structTable));pre->next=p;if(i+1==vertex){p->vertex[0]='v';p->vertex[1]='0'+i+1;p->vertex[2]='\0';p->cost=0;p->Known=0;}else{p->vertex[0]='v';p->vertex[1]='0'+i+1;p->vertex[2]='\0';p->cost=maxium;p->Known=0;}p->next=NULL;pre=pre->next;}returnhead;}intDijkstra(structPoint*p1,structTable*p2)/*Coreoftheprogramm*/

intcosts;chartemp;structPoint*poinhead=p1,*now;structLink*linna;structTable*tabhead=p2,*searc,*result;while(1){now=FindSmallest(tabhead,poinhead);if(now==NULL)break;result=p2;result=result->next;while(result!=NULL){if(result->vertex[1]==now->vertex[1])break;elseresult=result->next;}linna=now->work->next;while(linna!=NULL)/*updateallthevertexslinkedtothesignedvertex*/{temp=linna->vertex[1];searc=tabhead->next;while(searc!=NULL)thenew{if(searc->vertex[1]==temp)/*findthevertexlinkedtosignedvertexinthetableandupdate*/thenew{if((result->cost+linna->value)<searc->cost){searc->cost=result->cost+linna->value;/*setthevalue*/searc->path[0]='v';searc->path[1]=now->vertex[1];searc->path[2]='\0';}break;}elsesearc=searc->next;}linna=linna->next;}return1;}structPoint*FindSmallest(structTable*head,structPoint*poinhead){structPoint*result;structTable*temp;intmin=maxium,status=0;head=head->next;poinhead=poinhead->next;while(head!=NULL){if(!head->Known&&head->cost<min){min=head->cost;result=poinhead;temp=head;status=1;}head=head->next;poinhead=poinhead->next;}if(status){temp->Known=1;returnresult;}elsereturnNULL;}intPrintTable(intstart,structTable*head){structTable*begin=head;head=head->next;while(head!=NULL){if((head->vertex[1]-'0')!=start)PrintPath(start,head,begin);head=head->next;}returnOK;}intPrintPath(intstart,structTable*head,structTable*begin)structTable*temp=begin->next,*p,*t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論