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...