用鍊錶還原實現Dijkastra演算法

2021-10-05 22:43:42 字數 2845 閱讀 6096

dijkastra演算法:

設g=(v,e)是乙個帶權有向圖,把圖中頂點集合v分成兩組。

第一組為已求出最短路徑的頂點集合(用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 , 就將 加入到集合s中,直到全部頂點都加入到s中,演算法就結束了)。

第二組為其餘未確定最短路徑的頂點集合(用u表示)。

按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度。此外,每個頂點對應乙個距離,s中的頂點的距離就是從v到此頂點的最短路徑長度。u中的頂點的距離,是從v到此頂點只包括s中的頂點為中間頂點的當前最短路徑長度。

**實現:

#include

#include

#define m 1000

char s[7]

=;typedef

struct delete //儲存原始權值鍊錶

del;

typedef

struct increase //儲存優化後鍊錶

inc;

intmin

(int

*buff,

int n)

//尋找最小值函式

void

print_del

(del *ph)

//輸出操作後原始鍊錶 }}

void

print_inc

(inc *ph)

//輸出最短路徑頂點鍊錶 }}

del *

create_del

(int

*buff)

//通過原始資料,建立原始鍊錶

head=p;

p->next=tail;

for(

int i=

0;i<

7;i++

) p->next=

null

;return head;

}del *

delete_point

(del *ph,

int num)

//刪除指定節點

del *

find_del

(del *ph,

int num)

inc *

increase_point

(char d,

int length)

//最短路徑鍊錶增加節點

void

dijkastra

(int buff[

7],del *del_link,

int z)

//dijkastra函式體

int m=

min(length_array,n)

;printf

("*****************\n");

printf

("更新的鍊錶為:\n");

print_del

(phd)

;printf

("當前最小距離為%d\n"

,m);

while

(null

!=del_link->next)

del_link=del_link->next;

l++;}

printf

("當前l值為%d\n"

,l);

del *r=

find_del

(phd,l)

;char ra=r->a;

int rl=r->length;if(

null

!=phd->next)

for(

int k=

1;k<=u_num;k++

)u_num--

;p->next=

increase_point

(ra,rl)

;printf

("最優鍊錶為:\n");

print_inc

(ph)

;p=p->next;

del_link=phd;if(

null

!=del_link->next)

printf

("當前鍊錶第乙個節點為%c\n"

,del_link->next->a);n=

0;}if

(null

!=p->next)

p=p->next;

p->next=

null;}

/*void cs(int *buff,del *ph)

}delete_point(ph,j);

printf("%d\n",ph->next->next->length);}*/

intmain()

,,,,

,,};

printf

("請輸入起始點:");

scanf

("%c"

,&start)

;for

(int sta_num=

0;sta_num<

7;sta_num++)if

(start==s[sta_num]

)break;p=

create_del

(weight[sta_num]);

print_del

(p);

dijkastra

(weight,p,sta_num)

;return0;

}

執行結果為:

用鍊錶實現堆疊

堆疊資料一種後進先出的資料結構,只能在一端 稱為棧頂 top 對資料項進行插入和刪除。基本的堆疊操作是push和pop,push是把乙個新值壓入堆疊的頂部,pop是把堆疊的頂部的值移除並返回這個值。堆疊只提供對它的棧頂值的訪問。堆疊很容易實現,可以用靜態陣列 動態陣列 鍊錶實現堆疊。本文介紹的是鍊錶...

用鍊錶實現棧

基於介面實現 public inte ce stack引用到上次已經實現的鍊錶 linkedlistlist new linkedlist 1 獲取棧的長度 獲取棧的長度 return public int getsize 2 判斷棧是否為空 判斷棧是否為空 return public boolea...

用鍊錶實現集合

用鍊錶來表示集合時,鍊錶的中的每個項表示集合的乙個成員,表示集合的鍊錶所占用的空間正比於所表示的集合的大小,而不是正比於全集合的大小,因此,鍊錶可以表示無窮全集合的子集。鍊錶分為無序鍊錶和有序鍊錶兩種型別。以下為有序鍊錶實現 1 typedef struct node link 2struct no...