第一篇:代碼注釋格式
////////////////////////////////////////////////////////////////////////// //函數(shù)名稱: WriteFile //函數(shù)功能: 向加密鎖創(chuàng)建文件,并且向文件中寫入數(shù)據(jù),注意寫入的數(shù)據(jù)不宜過大,最好少于2k為最佳 //參數(shù)說明: fileSize: 文件的大小,以字節(jié)為單位 // fileID: 文件在加密鎖中的ID, // fileName: 文件在加密鎖中的名字 // fileContent: 文件內(nèi)容
//返 回 值: 如果寫入文件成功,則返回true,如果寫入文件失敗,則返回false.//作 者: luyao ///////////////////////////////////////////////////////////////
第二篇:JAVA代碼注釋規(guī)范
JAVA代碼注釋規(guī)范
一、規(guī)范存在的意義
1.好的注釋規(guī)范可以讓人一眼看明白這是干什么的,特別是對(duì)于我們這種行業(yè);共同合作完成一個(gè)項(xiàng)目需要分工明確,所以也需要有明了的注釋規(guī)范。
2.正確的應(yīng)用注釋規(guī)范可以增加代碼的可讀性、理解性。3.好的代碼規(guī)范可以提高團(tuán)隊(duì)的開發(fā)效率,從而節(jié)省時(shí)間。4.長期的堅(jiān)持代碼規(guī)范可以讓程序員養(yǎng)成一個(gè)良好的習(xí)慣,甚至鍛煉出思維。
二、命名規(guī)范
1.一般概念
1)盡量使用完整的英文描述。2)采用相對(duì)好理解的術(shù)語。
3)采用駱駝命名的規(guī)范使名字增加可讀性。4)盡量少用縮寫提高可讀性。5)避免名字過長。
6)避免使用類似的名字。7)避免使用特殊符號(hào)。2.主要的運(yùn)用
1)類(class)的命名
2)接口(interface)的命名 +方法(method)的命名 3)參數(shù)(param)的命名
三、注釋規(guī)范
1.一般概念
1)注釋應(yīng)該增加代碼的清晰度 2)保持代碼的整潔
3)在寫代碼之前或同時(shí)注意寫上注釋
4)注釋出為什么做這件事,做這件事的結(jié)果 2.注釋那些部分
1)java文件:版權(quán)信息、創(chuàng)建時(shí)間、創(chuàng)建人 2)類:目的、所完成功能、版權(quán)信息、創(chuàng)建人 3)方法:參數(shù)含義、返回值 4)屬性:字段描述
5)接口:目的、創(chuàng)建人、版本號(hào)、創(chuàng)建時(shí)間
四、代碼格式規(guī)范
1.單行注釋://注釋內(nèi)容,一般與代碼后空4-8格,注釋必須對(duì)齊 2.塊狀注釋:/*注釋內(nèi)容*/,一般是注釋從以/*開始,以*/結(jié)束中的所有內(nèi)容。3.文檔注釋:/**......*/所以注釋文 檔必須書寫在類、域、構(gòu)造函數(shù)、方法,以及字段(field)定義之前.注釋文檔由兩部分組成——描述、塊標(biāo)記。4.javadoc注釋標(biāo)簽
@author 對(duì)類的說明 標(biāo)明開發(fā)該類模塊的作者
@version 對(duì)類的說明 標(biāo)明該類模塊的版本
@see 對(duì)類、屬性、方法的說明 參考轉(zhuǎn)向,也就是相關(guān)主題
@param 對(duì)方法的說明 對(duì)方法中某參數(shù)的說明
@return 對(duì)方法的說明 對(duì)方法返回值的說明
@exception 對(duì)方法的說明 對(duì)方法可能拋出的異常進(jìn)行說明
五、java注釋具體實(shí)現(xiàn)
1.源文件注釋
/** *文件名 *創(chuàng)建人 *創(chuàng)建時(shí)間 *修改人 *描述 *版本號(hào) */ 2.類注釋
/** *對(duì)此類的描述信息 *創(chuàng)建人 *版本號(hào) *創(chuàng)建時(shí)間 */ 3.方法的注釋
/** *方法的用處 *該方法的參數(shù)列 *該方法返回的值 */ 4.屬性的注釋
/** *字段的描述 */ 5.接口注釋
/** *對(duì)此接口的描述 *創(chuàng)建人 *創(chuàng)建時(shí)間 *版本號(hào) */ 6.構(gòu)造方法注釋
/** *描述該構(gòu)造方法的用處 *該構(gòu)造方法的參數(shù)列 *參數(shù)的類型 */
六、Jsp代碼格式規(guī)范
1.多行注釋:,一般是注釋從以結(jié)束中的所有內(nèi)容。
2.文本注釋:<%--內(nèi)容--%>,主要是對(duì)該頁面的一些描述,目的、創(chuàng)建人、創(chuàng)建時(shí)間、版本號(hào)、文件名、備注、修改人等.例如: <%---創(chuàng)建人-創(chuàng)建時(shí)間-版本號(hào)-文件名-備注-修改人--%> 3.偽劣標(biāo)簽注釋:<% java語句塊 %> 例如: <% JAVA代碼塊 %> 4.單行注釋://注釋內(nèi)容,一般與代碼后空4-8格,注釋必須對(duì)齊
七、JS代碼格式規(guī)范
1.文本注釋:/** 注釋內(nèi)容 **/,主要是對(duì)該頁面的一些描述,目的、創(chuàng)建人、創(chuàng)建時(shí)間、版本號(hào)、文件名、備注、修改人等.也可以用于注釋代碼塊。例如: /** *創(chuàng)建人 *創(chuàng)建時(shí)間 *版本號(hào) *文件名 *備注 *修改人 **/
2.文本注釋:/** 內(nèi)容 */ ,主要是對(duì)該頁面的一些描述,目的、創(chuàng)建人、創(chuàng)建時(shí)間、版本號(hào)、文件名、備注、修改人等.也可以用于注釋代碼塊。例如: /** *創(chuàng)建人 *創(chuàng)建時(shí)間 *版本號(hào) *文件名 *備注 *修改人 */ 3.單行注釋: //注釋內(nèi)容,一般與代碼后空4-8格,注釋必須對(duì)齊 4.多行注釋: /* 注釋內(nèi)容 */,一般是注釋從以/* 開始,以*/結(jié)束中的所有內(nèi)容。
八、JS注釋具體實(shí)現(xiàn) 1.文件注釋
/** *對(duì)此文件的描述信息 *創(chuàng)建人 *版本號(hào) *創(chuàng)建時(shí)間 */ 2.方法的注釋
/** *方法的用處 *該方法的參數(shù)列 *該方法返回的值 */ 3.模塊的注釋
/** *模塊名稱
*模塊的用處
*/
第三篇:數(shù)據(jù)結(jié)構(gòu)課設(shè)(完整代碼可直接運(yùn)行)附注釋
#include
ERROR
0//定義字符常量error #define
OK
1//定義字符常量OK #define INFINITY
INT_MAX//INT_MAX是系統(tǒng)庫中定義的無窮大常量,即2個(gè)字節(jié)所能表示的最大數(shù)
#define MAX_VERTEX_NUM
21//定義圖、網(wǎng)的最大定點(diǎn)數(shù)為21 #define STACK_INIT_SIZE
100//定義棧的容量
#define STACKINCREAMENT
10//定義棧的每次增長量 #define MAX_INT 10000 //無窮大 typedef int AdjType;typedef struct{ int pi[MAX_VERTEX_NUM];//存放v到vi的一條最短路徑 int end;}PathType;typedef char VType;//設(shè)頂點(diǎn)為字符類型
typedef enum{DG,UDG,DN,UDN}GraphKind;//定義圖、網(wǎng)的枚舉常量
/*················· 鄰接矩陣····················*/ typedef struct ArcCell {
int
adj;
//弧的權(quán)值
//infotype
*info;}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{
char vexs[MAX_VERTEX_NUM];//存儲(chǔ)頂點(diǎn)的數(shù)組
AdjMatrix arcs;//存儲(chǔ)鄰接矩陣的二維數(shù)組
int
vexnum,arcnum;//頂點(diǎn)數(shù)和弧數(shù)
GraphKind kind;//鏈接矩陣的類型
}MGraph;
/*················· 鄰接表····················*/ typedef struct ArcNode{
int
adjvex;//與首節(jié)點(diǎn)關(guān)聯(lián)的頂點(diǎn)
int
quan;//該頂點(diǎn)的權(quán)值
struct ArcNode
*nextarc;//指向下一個(gè)節(jié)點(diǎn)的指針
}ArcNode,*AList;typedef struct VNode {
char
data;//鏈表的各頂點(diǎn)
AList
firstarc;//鏈表的首節(jié)點(diǎn) }VNode,AdjList[MAX_VERTEX_NUM];typedef struct{
AdjList
vertices;//存儲(chǔ)鏈接表的各頂點(diǎn)
int
vexnum,arcnum;//頂點(diǎn)書和弧數(shù)
GraphKind
kind;//鏈接表的類型 }ALGraph;
/*················· 隊(duì)列····················*/ typedef struct QNode{ char
data;//隊(duì)列中元素?cái)?shù)據(jù)
struct QNode
*next;//指向下一元素的指針 }QNode,*QueuePre;typedef struct{ QueuePre
front;//隊(duì)首指針
QueuePre
rear;//隊(duì)尾指針 }LinkQueue;
/*················· 棧····················*/ typedef struct { int
*base;//棧底指針
int
*top;//棧首指針
int
stacksize;//棧的大小 }SqStack;
/*················· 求最小生成樹中的輔助數(shù)組··········*/ typedef struct { char
adjvex;//最小生成樹的節(jié)點(diǎn)
int
lowcost;//到該節(jié)點(diǎn)的最小權(quán)值開銷 }closedges[MAX_VERTEX_NUM];
int option;
//圖的類型標(biāo)識(shí)符 int visited[MAX_VERTEX_NUM];
//頂點(diǎn)訪問標(biāo)記數(shù)組 int indegree[MAX_VERTEX_NUM];//頂點(diǎn)入度記錄數(shù)組 int ve[MAX_VERTEX_NUM];
//頂點(diǎn)權(quán)值記錄數(shù)組
/*················· 鏈接矩陣類型設(shè)置··········*/ int SetGraphKind(MGraph &G,int option){
switch(option){
case 1: G.kind=DG;break;
case 2: G.kind=UDG;break;
case 3: G.kind=DN;break;
case 4: G.kind=UDN;break;
default: return ERROR;
}
return OK;}
/*················· 鄰接表類型設(shè)置··········*/ int SetGraphKind(ALGraph &G,int option){
switch(option){
case 1: G.kind=DG;break;
case 2: G.kind=UDG;break;
case 3: G.kind=DN;break;
case 4: G.kind=UDN;break;
default: return ERROR;
}
return OK;}
/*················· 鄰接矩陣頂點(diǎn)定位 ·················將頂點(diǎn)V代入,查詢頂點(diǎn)存儲(chǔ)數(shù)組,返回其數(shù)組下標(biāo) ··········*/ int LocateVex(MGraph G,char v){
int m;
for(m=1;m<=G.vexnum;m++){
if(G.vexs[m]==v)return m;
}
printf(“您輸入的頂點(diǎn)不存在”);
return ERROR;}
/*················· 鄰接表頂點(diǎn)定位 ·················將頂點(diǎn)V代入,查詢頂點(diǎn)存儲(chǔ)數(shù)組,返回其數(shù)組下標(biāo) ··········*/ int LocateVex(ALGraph G,char v){
int m;
for(m=1;m<=G.vexnum;m++){
if(G.vertices[m].data==v)return m;
}
printf(“您輸入的頂點(diǎn)不存在”);
return ERROR;
}
/*················· 隊(duì)列創(chuàng)建··········*/ int InitQueue(LinkQueue &Q){ Q.front=Q.rear=(QueuePre)malloc(sizeof(QNode));//申請存儲(chǔ)空間,隊(duì)首隊(duì)尾指向同一位置
if(!Q.front)return ERROR;Q.front->next=NULL;return OK;}
/*················· 元素入隊(duì)··········*/ int EnQueue(LinkQueue &Q,int e){ QueuePre p;p=(QueuePre)malloc(sizeof(QNode));if(!p)return OK;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}
/*················· 元素出隊(duì)··········*/ int DeQueue(LinkQueue &Q,int &e){ QueuePre p;if(Q.front==Q.rear)return ERROR;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return OK;}
/*················· 判斷隊(duì)列是否為空··········*/ int QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear)
return OK;return ERROR;}
/*················· 棧的創(chuàng)建··········*/ int InitStack(SqStack &S){ S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}
/*················· //元素入棧··········*/ int Push(SqStack &S,int e){ if(S.top-S.base>=S.stacksize){
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
if(!S.base)return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;} *S.top++=e;return OK;}
/*················· 元素出棧··········*/ int Pop(SqStack &S,int &e){ if(S.top==S.base)return ERROR;
e=*--S.top;return OK;}
/*················· 判斷棧是否為空··········*/ int StackEmpty(SqStack S){ if(S.top==S.base)return OK;return ERROR;}
/*················· 創(chuàng)建鄰接矩陣··········*/ int CreatGraph(MGraph &G){
int i,j,k,w;char x,y;
if(!SetGraphKind(G,option)){printf(“對(duì)圖類型的設(shè)置失敗”);return ERROR;}//設(shè)置鏈接矩陣類型
printf(“鄰接矩陣:請輸入定點(diǎn)的個(gè)數(shù)、弧的個(gè)數(shù):”);
scanf(“%d %d”,&G.vexnum,&G.arcnum);
if(G.vexnum>20){
printf(“您輸入的頂點(diǎn)個(gè)數(shù)超過最大值”);
return ERROR;
}//if
printf(“請輸入%d個(gè)頂點(diǎn)n”,G.vexnum);
for(i=1;i<=G.vexnum;++i){//輸入矩陣的各頂點(diǎn)
fflush(stdin);//清除緩存,略過
scanf(“%c”,&G.vexs[i]);
}//for
if(G.kind==DG||G.kind==UDG){//1.有向圖和無向圖的矩陣創(chuàng)建
for(i=1;i<=G.vexnum;i++)//矩陣初始化
for(j=1;j<=G.vexnum;j++)
G.arcs[i][j].adj=0;
if(G.kind==DG){//2.有向圖
printf(“請輸入有向圖的兩個(gè)相鄰的頂點(diǎn)
for(k=1;k<=G.arcnum;k++){//循環(huán)輸入
fflush(stdin);
scanf(“%c%c”,&x,&y);//輸入矩陣中弧關(guān)聯(lián)的兩頂點(diǎn)
i=LocateVex(G,x);j=LocateVex(G,y);//將兩頂點(diǎn)轉(zhuǎn)換成頂點(diǎn)存儲(chǔ)數(shù)組的下標(biāo)
G.arcs[i][j].adj=1;
}//for
}//2.if
else{//2.無向圖
printf(“請輸入無向圖的兩個(gè)相鄰的頂點(diǎn)(x,y):n”);
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c”,&x,&y);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=1;G.arcs[j][i].adj=G.arcs[i][j].adj;//反向關(guān)聯(lián)兩頂點(diǎn)
}//for
}//2.else
}//1.if
else{//1.有向網(wǎng)和無向網(wǎng)
for(i=1;i<=G.vexnum;i++)
for(j=1;j<=G.vexnum;j++)
G.arcs[i][j].adj=INT_MAX;//矩陣初始化
if(G.kind==DN){ //3.有向網(wǎng)
printf(“請輸入有向網(wǎng)的兩個(gè)相鄰的頂點(diǎn)
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=w;
}//for
}//3.if
else{//3
printf(“請輸入無向網(wǎng)的兩個(gè)相鄰的頂點(diǎn)(x,y)以及相應(yīng)的權(quán)值w:n”);
for(k=1;k<=G.arcnum;k++){fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
i=LocateVex(G,x);j=LocateVex(G,y);
G.arcs[i][j].adj=w;G.arcs[j][i].adj=G.arcs[i][j].adj;//逆向關(guān)聯(lián)
}//for
}//3.else
}
return OK;}
/*··············在鄰接表中插入節(jié)點(diǎn)··· ··········*/ int setList(int x,int y,ALGraph &G,int key[]){
int i,j,m,n;AList p,q;
m=LocateVex(G,x);//獲取節(jié)點(diǎn)x對(duì)應(yīng)的數(shù)組下標(biāo)
n=LocateVex(G,y);
p=G.vertices[m].firstarc;//獲取第m個(gè)鏈表的首節(jié)點(diǎn)
q=(AList)malloc(sizeof(ArcNode));//申請節(jié)點(diǎn)空間
if(!q)return ERROR;
q->nextarc=NULL;
q->adjvex=n;
while(key[m]&&p->nextarc){//key存儲(chǔ)著該鏈表的長度,當(dāng)其不為零時(shí)在首節(jié)點(diǎn)后插入新節(jié)點(diǎn)
p=p->nextarc;
key[m]++;//鏈表長度加1
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}//當(dāng)鏈表長度為零時(shí),新節(jié)點(diǎn)為首節(jié)點(diǎn)
else p->nextarc=q;
return 1;}
/*················· 創(chuàng)建鄰接表··········*/ int CreatAList(ALGraph &G){ int i,j,m,n,key[MAX_VERTEX_NUM];char x,y,w;AList p,q;SetGraphKind(G,option);printf(“鄰接表:請輸入頂點(diǎn)的個(gè)數(shù)和弧的個(gè)數(shù):”);scanf(“%d %d”,&G.vexnum ,&G.arcnum);if(G.vexnum>20){
printf(“您輸入的頂點(diǎn)個(gè)數(shù)超過最大值”);
return ERROR;
} printf(“請輸入個(gè)頂點(diǎn):n”);for(i=1;i<=G.vexnum;i++){
fflush(stdin);
scanf(“%c”,&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
key[i]=0;} if(G.kind==DG){//有向圖
printf(“請輸入弧(如AB,其中AB與BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c”,&x,&y);//輸入弧的兩頂點(diǎn)
m=LocateVex(G,x);//將兩頂點(diǎn)轉(zhuǎn)換成數(shù)組下標(biāo)
n=LocateVex(G,y);
p=G.vertices[m].firstarc;//獲取第m個(gè)鏈表的首節(jié)點(diǎn),及以第m個(gè)頂點(diǎn)為首節(jié)點(diǎn)的鏈表
q=(AList)malloc(sizeof(ArcNode));//申請節(jié)點(diǎn)存儲(chǔ)空間
if(!q)return ERROR;
q->nextarc=NULL;
q->adjvex=n;
while(key[m]&&p->nextarc){//鏈表長度不為零,且下一個(gè)節(jié)點(diǎn)存在時(shí),在首節(jié)點(diǎn)后插入新節(jié)點(diǎn)
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}//鏈表長度為零時(shí),新節(jié)點(diǎn)為首節(jié)點(diǎn)
else p->nextarc=q;
} } if(G.kind==UDG){
printf(“請輸入弧(如AB,其中AB與BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c”,&x,&y);
setList(x,y,G,key);
setList(y,x,G,key);
} }
if(G.kind==DN){
printf(“請輸入依次輸入弧以及這條弧的權(quán)值(如AB 8,其中AB與BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
m=LocateVex(G,x);
n=LocateVex(G,y);
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
} } if(G.kind==UDN){
printf(“無向網(wǎng)請輸入依次輸入弧以及這條弧的權(quán)值(如AB 8,其中AB與BA是不同的弧):n”);
for(j=1;j<=G.arcnum;j++){
fflush(stdin);
scanf(“%c%c %d”,&x,&y,&w);
m=LocateVex(G,x);
n=LocateVex(G,y);
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
int temp;
temp=m;
m=n;
n=temp;
p=G.vertices[m].firstarc;
q=(AList)malloc(sizeof(ArcNode));
if(!q)return ERROR;
q->nextarc=NULL;
q->quan=w;
q->adjvex=n;
while(key[m]&&p->nextarc){
p=p->nextarc;
key[m]++;
}
if(!key[m]){G.vertices[m].firstarc=q;key[m]++;}
else p->nextarc=q;
} } return OK;}
/*················· 判斷以第v個(gè)頂點(diǎn)為首節(jié)點(diǎn)的鏈表是否存在··········*/ int FirstAdjVex(ALGraph G,int v){ if(G.vertices[v].firstarc)
} return G.vertices[v].firstarc->adjvex;//存在則返回首節(jié)點(diǎn) return 0;/*················· 獲取以第v個(gè)頂點(diǎn)為首節(jié)點(diǎn)的鏈表中的節(jié)點(diǎn)w的子節(jié)點(diǎn)··········*/ int NextAdjVex(ALGraph G,int v,int w){ AList s;s=G.vertices[v].firstarc;//獲取鏈表的首節(jié)點(diǎn)v while(s->adjvex!=w)//當(dāng)節(jié)點(diǎn)不是w時(shí),指針后移直到找到節(jié)點(diǎn)w或到達(dá)最后一個(gè)節(jié)點(diǎn)
s=s->nextarc;if(s->nextarc)//跳出循環(huán)后,節(jié)點(diǎn)不為空,則表明找到了節(jié)點(diǎn)w,否則表示已至鏈表最后一個(gè)節(jié)點(diǎn)
return s->nextarc->adjvex;return 0;}
/*················· 遍歷節(jié)點(diǎn)v的葉子節(jié)點(diǎn)··········*/ void DFS(ALGraph G,int v){ int w;visited[v]=1;printf(“%c ”,G.vertices[v]);//輸出第v個(gè)頂點(diǎn),并標(biāo)記為已訪問
for(w=FirstAdjVex(G,v);w>=1;w=NextAdjVex(G,v,w)){//遍歷第v個(gè)頂點(diǎn)的子節(jié)點(diǎn),并遞歸遍歷子節(jié)點(diǎn)的子節(jié)點(diǎn)
if(!visited[w])DFS(G,w);
} }
/*················· 圖的深度優(yōu)先遍歷··········*/ void DFSTraverse(ALGraph G){ int v;visited[0]=1;//數(shù)組的存儲(chǔ)是從1開始的,數(shù)組【0】不使用
for(v=1;v<=G.vexnum;v++)visited[v]=0;//初始化各頂點(diǎn)的訪問狀態(tài)為未訪問
for(v=1;v<=G.vexnum;v++)
if(!visited[v])DFS(G,v);//從第一個(gè)頂點(diǎn)開始遍歷 }
/*················· 圖的廣度優(yōu)先遍歷··········*/ void BFSTraverse(ALGraph G){ int v,w,u;LinkQueue Q;for(v=1;v<=G.vexnum;v++)visited[v]=0;//初始化各頂點(diǎn)為未訪問
visited[0]=1;//數(shù)組的存儲(chǔ)是從1開始的,數(shù)組【0】不使用
InitQueue(Q);//創(chuàng)建隊(duì)列
for(v=1;v<=G.vexnum;v++)//從第一個(gè)頂點(diǎn)開始遍歷
if(!visited[v]){
visited[v]=1;
printf(“%c ”,G.vertices[v]);
EnQueue(Q,v);//將該頂點(diǎn)標(biāo)記為已訪問,輸出,并加入到隊(duì)列中
while(!QueueEmpty(Q)){//遍歷隊(duì)列中頂點(diǎn)的所有子節(jié)點(diǎn)
DeQueue(Q,u);//獲取隊(duì)首的頂點(diǎn),賦值給U
for(w=FirstAdjVex(G,u);w>=1;w=NextAdjVex(G,u,w)){//遍歷頂點(diǎn)U所有未訪問的子節(jié)點(diǎn)
if(!visited[w]){
visited[w]=1;
printf(“%c ”,G.vertices[w]);
EnQueue(Q,w);//將子節(jié)點(diǎn)加入隊(duì)列,以便遍歷子節(jié)點(diǎn)的子節(jié)點(diǎn)
}//if
else break;
}//for
}//while }//if }
/*················· 計(jì)算各頂點(diǎn)入度··········*/ void FindInDegree(ALGraph G,int in[]){ int i,j,k;AList p;for(k=1;k<=G.vexnum;k++)in[k]=0;//初始化各頂點(diǎn)入度為0 for(i=1;i<=G.vexnum;i++){
p=G.vertices[i].firstarc;//獲取個(gè)鏈表的首節(jié)點(diǎn)
while(p){//遍歷鏈表的子節(jié)點(diǎn)
j=p->adjvex;//獲取子節(jié)點(diǎn)
in[j]++;//子節(jié)點(diǎn)的入度加1
in[i]++;
p=p->nextarc;//指向下一子節(jié)點(diǎn)
} } }
/*················· 拓?fù)渑判颍ù蛴≥敵觯ぁぁぁぁぁぁぁぁぁ?/ int TopologicalSort(ALGraph G){ int i,k,count;AList p;SqStack S;
FindInDegree(G,indegree);//計(jì)算各頂點(diǎn)入度 InitStack(S);//創(chuàng)建棧 for(i=1;i<=G.vexnum;i++)
if(!indegree[i])Push(S,i);//尋找入度為0的點(diǎn),并加入到棧中 count=0;//輸出的頂點(diǎn)個(gè)數(shù)
if(StackEmpty(S))printf(“此有向圖不符合條件!”);while(!StackEmpty(S)){
Pop(S,i);//從棧中取出頂點(diǎn)開始輸出
printf(“%c ”,G.vertices[i].data);
++count;//輸出的頂點(diǎn)個(gè)數(shù)加1
for(p=G.vertices[i].firstarc;p;p=p->nextarc){//將頂點(diǎn)i的子節(jié)點(diǎn)的入度減1
k=p->adjvex;
if(!(--indegree[k]))Push(S,k);//如子節(jié)點(diǎn)的入度減為0,則入棧
}
}
if(count<=G.vexnum)return ERROR;
else return OK;}
/*················· 求最小生成樹··········*/ int Minimum(MGraph G,closedges m){ int i,j,min=INFINITY;for(i=1;i<=G.vexnum;i++){//從待選的可達(dá)集合中選取一條代價(jià)最小的邊
if(m[i].lowcost){//到頂點(diǎn)i可達(dá)時(shí)執(zhí)行,即到頂點(diǎn)的權(quán)值不為0
if(m[i].lowcost min=m[i].lowcost; j=i; } } } return j;} /*················· 最小生成樹(普里姆算法實(shí)現(xiàn))··········*/ void MinSpanTree_PRIM(MGraph G,char u){ int i,j,k;closedges closedge; k=LocateVex(G,u);//獲取初始頂點(diǎn)對(duì)應(yīng)的數(shù)組下標(biāo) for(j=1;j<=G.vexnum;j++)//初始化輔助數(shù)組,計(jì)算從初始頂點(diǎn)到各頂點(diǎn)的最小代價(jià) if(j!=k){ } closedge[j].adjvex=u;//u是已連通的頂點(diǎn),表示該頂點(diǎn)J是同那個(gè)頂點(diǎn)連在一起 closedge[j].lowcost=G.arcs[k][j].adj; closedge[k].lowcost=0;//頂點(diǎn)k到自身的最小代價(jià)設(shè)為0,即該頂點(diǎn)已加入最小生成樹中 for(i=2;i<=G.vexnum;i++){ k=Minimum(G,closedge);//獲取最小代價(jià)邊連通的頂點(diǎn) printf(“%c%c ”,closedge[k].adjvex,G.vexs[k]);//輸出最小生成樹的弧 closedge[k].lowcost=0;//該頂點(diǎn)已加入最小生成樹中 for(j=1;j<=G.vexnum;j++)//將頂點(diǎn)k代入重新計(jì)算到待連通頂點(diǎn)的最小代價(jià) if(G.arcs[k][j].adj closedge[j].adjvex=G.vexs[k]; closedge[j].lowcost=G.arcs[k][j].adj; } } } /*················· 對(duì)鏈表進(jìn)行拓?fù)渑判颍⒋鎯?chǔ)在棧中··········*/ int TopologicalOrder(ALGraph G,SqStack &T){ int i,j,k,count;SqStack S; AList p;FindInDegree(G,indegree);InitStack(S); for(i=1;i<=G.vexnum;i++)if(!indegree[i])Push(S,i);InitStack(T);count=1;for(i=1;i<=G.vexnum;i++)ve[i]=0;//初始化到達(dá)各頂點(diǎn)的總權(quán)值花銷為0 while(!StackEmpty(S)){ Pop(S,j);Push(T,j);++count; for(p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex; if(--indegree[k]==0)Push(S,k); if(ve[j]+p->quan>ve[k])ve[k]=ve[j]+p->quan;//頂點(diǎn)J的子節(jié)點(diǎn)K的總權(quán)值=頂點(diǎn)j的權(quán)值花銷+弧的權(quán)值,即該頂點(diǎn)的最早發(fā)生時(shí)間 } } if(count<=G.vexnum)return ERROR;else return OK;} /*················· 關(guān)鍵路徑 int j 指向頂點(diǎn)的數(shù)組下標(biāo) int k 被指向頂點(diǎn)的數(shù)組下標(biāo)標(biāo) int ee 最早發(fā)生時(shí)間 int el 最晚發(fā)生時(shí)間 int dut 事件持續(xù)時(shí)間 char tag 關(guān)鍵路徑標(biāo)識(shí)符,*表示該弧為關(guān)鍵路徑 SqStack T 堆 Alist p 鏈表的節(jié)點(diǎn) int v1[MAX_VERTEX_NUM] 頂點(diǎn)權(quán)值記錄數(shù)組,及該頂點(diǎn)的最早發(fā)生時(shí)間 ··········*/ int CriticalPath(ALGraph G){ int i,j,k,ee,el,dut,v1[MAX_VERTEX_NUM];SqStack T;AList p;char tag;int str[10];int count=0;//聲明一個(gè)數(shù)組來存放關(guān)鍵路徑的各個(gè)節(jié)點(diǎn),count表示當(dāng)前數(shù)組使用長度,也可理解為下一節(jié)點(diǎn)的存放位置 if(!TopologicalOrder(G,T))return ERROR;//按拓?fù)渑判驅(qū)⒏黜旤c(diǎn)依次入棧 for(i=1;i<=G.vexnum;i++){//初始化各頂點(diǎn)的權(quán)值為最后一個(gè)頂點(diǎn)的總權(quán)值花銷,即工程的總時(shí)間花銷 v1[i]=ve[G.vexnum];} while(!StackEmpty(T))//按拓?fù)漤樞虺鰲#謩e計(jì)算各頂點(diǎn)的最晚發(fā)生時(shí)間 for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex;dut=p->quan; if(v1[k]-dut } for(j=1;j<=G.vexnum;j++)//循環(huán)代入所有頂點(diǎn),遍歷其子節(jié)點(diǎn),根據(jù)弧的權(quán)值,得到最早發(fā)生時(shí)間和最晚發(fā)生時(shí)間,并判斷該弧是否為關(guān)鍵路徑 for(p=G.vertices[j].firstarc;p;p=p->nextarc){ k=p->adjvex;dut=p->quan; ee=ve[j];el=v1[k]-dut; tag=(ee==el)?'*':' '; printf(“%d %d %d %d %d %cn”,j,k,dut,ee,el,tag); } /* 下面為非必需代碼,功能為輸出關(guān)鍵路徑*/ if(count==0)//存儲(chǔ)關(guān)鍵路徑的第一個(gè)節(jié)點(diǎn)(第一個(gè)鏈接表的首節(jié)點(diǎn)—— str[count++]=j;if(tag=='*')//如果該弧為關(guān)鍵路徑,則將該弧的被指向頂點(diǎn)存儲(chǔ)到str中 { str[count++]=k;} for(int n=0;n printf(“%d”,str[n]); printf(“->”); } return OK;} //求關(guān)鍵路徑 //Dijkstra算法 //求G(用鄰接矩陣表示)中源點(diǎn)v到其他各頂點(diǎn)最短路徑,n為G中頂點(diǎn)數(shù) void Dijkstra(MGraph * G,PathType path[],int dist[],int v,int n){ int i,j,count,s[MAX_VERTEX_NUM],max,u;//s[n]用來標(biāo)志源點(diǎn)到某頂點(diǎn)的最短路徑是否求出 for(i=1;i<=n;i++){//1.初始化 s[i]=0;if(G->arcs[v][i].adj!=INFINITY)dist[i]=G->arcs[v][i].adj;else dist[i]=MAX_INT;//v到其他頂點(diǎn)的權(quán)為當(dāng)前最短路徑,送dist[i] path[i].pi[0]=v;path[i].end=0;} dist[v]=0;s[v]=1;//源點(diǎn)到源點(diǎn)本身的最短路徑求出 count=1; while(count<=n-1){//求n-1條最短路徑 max=MAX_INT;// MAX_INT為無窮大值,需要實(shí)際情況設(shè)置 for(j=1;j<=n;j++){//2.找當(dāng)前最短路徑長度 if(s[j]==0&&dist[j] if(max==MAX_INT)break;//最短路徑求完(不足n-1)條,跳出while循環(huán) s[u]=1;//表示V到Vu最短路徑求出 path[u].end++;path[u].pi[path[u].end]=u;for(j=1;j<=n;j++){//3.u求出后,修改dist和path向量,執(zhí)行完后返回2,知道跳出循環(huán) if(s[j]==0&&dist[j]>dist[u]+G->arcs[u][j].adj&&G->arcs[u][j].adj!=INFINITY){ dist[j]=dist[u]+G->arcs[u][j].adj;path[j]=path[u];} } count++;} } /*················· 有向圖的功能操作界面··········*/ void DG_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s;char x,y; for(k=0;;){ key=0;system(“cls”);//清空顯示 printf(“**************************n”); printf(“你選擇了對(duì)有向圖的基本操作及應(yīng)用:n1創(chuàng)建鄰接矩陣n2創(chuàng)建鄰接表n3拓?fù)浣Y(jié)構(gòu)n4退出n”); printf(“**************************n”); printf(“請選擇:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“有向圖的鄰接矩陣:n”); for(i=1;i<=G1.vexnum;i++){//輸出鄰接矩陣 for(j=1;j<=G1.vexnum;j++){ printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“有向圖的鄰接表:n”); for(i=1;i<=G2.vexnum;i++){//輸出鏈接表 printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“<%c ”,G2.vertices[i]); printf(“%c> ”,G2.vertices[j]); s=s->nextarc; } printf(“n”); }break; case 3:printf(“有向圖的拓?fù)渑判颍簄”);TopologicalSort(G2);break;case 4:key=1;break;} printf(“n”); if(key)break;//跳出循環(huán),返回上一層 system(“pause”);//暫停程序執(zhí)行,直到監(jiān)聽到操作 } printf(“nn”);} //DG /*················· 有向網(wǎng)的功能操作界面··········*/ void DN_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s; for(k=0;;){ key=0; system(“cls”); printf(“**************************n”); printf(“你選擇了對(duì)有向網(wǎng)的基本操作及應(yīng)用:n1創(chuàng)建鄰接矩陣n2創(chuàng)建鄰接表n3關(guān)鍵路徑n4最短路徑n5退出n”); printf(“**************************n”); printf(“請選擇:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“有向網(wǎng)的鄰接矩陣:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ if(G1.arcs[i][j].adj==INT_MAX)printf(“ ∞”); else printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“有向網(wǎng)的鄰接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“<%c ”,G2.vertices[i]); printf(“%c> ”,G2.vertices[j]); printf(“ %d ”,s->quan); s=s->nextarc; } printf(“n”); }break; case 3: printf(“有向網(wǎng)關(guān)鍵路徑:n”);CriticalPath(G2);break; case 4: {int i,j,v,count=0;//v為起點(diǎn),n為頂點(diǎn)個(gè)數(shù) char c; PathType path[MAX_VERTEX_NUM];//v到各頂點(diǎn)的最短路徑向量 int dist[MAX_VERTEX_NUM];//v到各頂點(diǎn)最短路徑長度向量 printf(“請輸入最短路徑起點(diǎn):”); fflush(stdin); scanf(“%c”,&c); v=LocateVex(G1,c); Dijkstra(&G1,path,dist,v,G1.vexnum); for(i=1;i<=G1.vexnum;i++){ if(dist[i]!=0&&dist[i]!=MAX_INT) { printf(“%c到%c的最短路徑:”,G1.vexs[v],G1.vexs[i]); for(j=0;j<=path[i].end;j++){ printf(“%c ”,G1.vexs[path[i].pi[j]]); } printf(“n”); printf(“最短路徑長度:%d”,dist[i]);//輸出為MAX_INT則表示兩點(diǎn)間無路徑 printf(“n”); } else count++; } if(count==G1.vexnum)printf(“該頂點(diǎn)無出度!”); break;} case 5:key=1;break; }printf(“n”); if(key)break;system(“pause”);} printf(“nn”);} //DN /*················· 無向圖的功能操作界面··········*/ void UDG_(MGraph G1,ALGraph G2){ int i,j,k,m,key;AList s; for(k=0;;){ key=0; system(“cls”); printf(“**************************n”); printf(“你選擇了對(duì)無向圖的基本操作及應(yīng)用:n1創(chuàng)建鄰接矩陣n2創(chuàng)建鄰接表n3深度遍歷n4廣度遍歷n5退出n”); printf(“**************************n”); printf(“請選擇:”); scanf(“%d”,&m); switch(m){ case 1:CreatGraph(G1);printf(“無向圖的鄰接矩陣:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“無向圖的鄰接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“(%c ”,G2.vertices[i]); printf(“%c)”,G2.vertices[j]); s=s->nextarc; } printf(“n”); }break; case 3: printf(“無向圖的深度優(yōu)先遍歷:n”);DFSTraverse(G2);printf(“n”);break; case 4: printf(“無向圖的廣度優(yōu)先遍歷:n”);BFSTraverse(G2);break; case 5: key=1;break; }printf(“n”); if(key)break; system(“pause”);} printf(“nn”);} //UDG /*················· 無向網(wǎng)的功能操作界面··········*/ void UDN_(MGraph G1,ALGraph G2){ int i,j,m,k,key;AList s;char u; for(k=0;;){ key=0; system(“cls”); printf(“**********************************n”); printf(“你選擇了對(duì)無向網(wǎng)的基本操作及應(yīng)用:n1創(chuàng)建鄰接矩陣n2創(chuàng)建鄰接表n3最小生成樹n4退出n”); printf(“**********************************n”); printf(“請選擇:”); scanf(“%d”,&m); switch(m){ case 1: CreatGraph(G1);printf(“無向網(wǎng)的鄰接矩陣:n”); for(i=1;i<=G1.vexnum;i++){ for(j=1;j<=G1.vexnum;j++){ if(G1.arcs[i][j].adj==INT_MAX)printf(“ ∞”); else printf(“ %d”,G1.arcs[i][j].adj); } printf(“n”); }break; case 2: CreatAList(G2);printf(“無向網(wǎng)的鄰接表:n”); for(i=1;i<=G2.vexnum;i++){ printf(“%c:”,G2.vertices[i]); s=G2.vertices[i].firstarc; while(s){ j=s->adjvex;fflush(stdin); printf(“(%c ”,G2.vertices[i]); printf(“%c)”,G2.vertices[j]); printf(“ %d ”,s->quan); s=s->nextarc; } printf(“n”); }break; case 3: printf(“請輸入第一個(gè)頂點(diǎn):”); fflush(stdin); scanf(“%c”,&u); printf(“無向網(wǎng)的最小生成樹:n”); MinSpanTree_PRIM(G1,u);break; case 4: key=1;break; }printf(“n”); if(key)break; system(“pause”);} printf(“nn”);} //UDN /*················· 首界面··········*/ void main(){ MGraph G1; ALGraph G2;int i,n;for(i=0;;){ n=0; system(“cls”); printf(“n”); printf(“**************圖的基本操作及應(yīng)用***************n1:有向圖的基本操作及應(yīng)用n2:無向圖的基本操作及應(yīng)用n3:有向網(wǎng)的基本操作及應(yīng)用n4:無向網(wǎng)的基本操作及應(yīng)用n5: 退出n”); printf(“********************************n”); printf(“請選擇:”); scanf(“%d”,&option); printf(“nn”); switch(option){ case 1: DG_(G1,G2);break; case 2: UDG_(G1,G2);break; case 3: DN_(G1,G2);break; case 4: UDN_(G1,G2);break; case 5: n=1;break; default: printf(“你輸入的編碼有誤!”);break; } if(n)break; printf(“nn”);} } 一、中文專著、學(xué)位論文、學(xué)術(shù)報(bào)告 序號(hào)、作者.文獻(xiàn)題名.版本.出版地:出版者,出版年:起止頁碼。例如: 1、劉少奇.論共產(chǎn)黨員的修養(yǎng).修訂2版.北京:人民出版社,1962:50。 2、張三.物權(quán)立法的本土資源研究.<博士論文>.北京:中國人民大學(xué),2008:27-28。 二、中文期刊文章 序號(hào)、作者.文獻(xiàn)題名.刊名,年,卷(期):起止頁碼。 例如: 3、李國海.論反壟斷法制裁手段及其范圍.中南大學(xué)學(xué)報(bào)(社會(huì)科學(xué)版),2005(2):193-198。 三、中文專著及論文集中的析出文獻(xiàn) 序號(hào)、析出文獻(xiàn)主要責(zé)任者.析出文獻(xiàn)題名.載:原文獻(xiàn)主要責(zé)任者.原文獻(xiàn)題名.版本.出版地:出版者,出版年:析出文獻(xiàn)起止頁碼 例如: 4、張光斗.也談21世紀(jì)高等工程教育的改革.見:林功實(shí).立足國內(nèi)培養(yǎng)跨世紀(jì)研究生.北京:北京理工大學(xué)出版社,1996:105~110。 四、電子文獻(xiàn) 序號(hào)、主要責(zé)任者.電子文獻(xiàn)題名.電子文獻(xiàn)的出處或可獲得地址,發(fā)表或更新日期/引用日期(任選)。 5、王明亮.關(guān)于中國學(xué)術(shù)期刊標(biāo)準(zhǔn)化數(shù)據(jù)庫系統(tǒng)工程的進(jìn)展.http://,1998-10-04 五、外文文獻(xiàn) 所引用語種通常注釋體例。例如: 6、Scholkopf B, Smola,A.Learning with Kernels.Cambridge: MIT Press, 2002 注釋格式如下: 引自期刊: ① 作者 : 《題名》,《刊名》,××××年第 ×期,第 × 頁 引自專著: ② 作者 : 《書名》,出版者及×××× 年版,第 × 頁 引自報(bào)紙: ③ 作者 : 《題名》,《報(bào)紙名》年-月-日(版次)參考文獻(xiàn)著錄格式如下: 引自期刊:[ 1] 作者(所有作者全列—下同).題名[ J].刊名 , 出刊年 ,卷(期): 起止頁碼.引自專著:[2] 作者.書名[ M].版次(初版不寫).譯者(指譯著, 所有譯者全列).出版地 : 出版者 , 出版年.頁碼.引自報(bào)紙:[3] 作者.題名[ N].報(bào)紙名 , 年-月-日(版次).引自論文集:[4] 作者.題名[ A].見 : 論文集編者.文集名[ C].出版地 : 出版者 , 出版年 部門代碼 總經(jīng)理:GMD 行政人事部:AD 技術(shù)部:TD 發(fā)展部:RDD 宣傳部:PD 策劃部:SD 工程部:ED 造價(jià)部:EC 財(cái)務(wù)部:ACD 投融資部:FD 戰(zhàn)略計(jì)劃部:SPD 招標(biāo)合約部:BCD 審計(jì)部:ADD 招商部:MD 研究院:RI 物業(yè)部:PD 后勤部:LD 資源管理部:RD第四篇:注釋格式
第五篇:部門代碼