系統(tǒng)的展示和選題在這篇博客:點(diǎn)擊這里? ? ? ? (就沒有詳解啦,代碼中的注釋已經(jīng)寫的很詳細(xì)了)
成都創(chuàng)新互聯(lián)公司專業(yè)提供服務(wù)器機(jī)柜租賃服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購買服務(wù)器機(jī)柜租賃服務(wù),并享受7*24小時(shí)金牌售后服務(wù)。直說了,我使用的軟件是vs,但是dev也可以運(yùn)行,反倒是初次使用vs的同學(xué),沒有關(guān)掉sdl檢查的話運(yùn)行會(huì)報(bào)錯(cuò),說是scanf啥的出問題。解決方法:項(xiàng)目->屬性->C/C++->常規(guī)->SDL檢查->將是改為否->保存。
另外,建議大家使用多文件編程,這樣修改的時(shí)候方便很多,可以快速的找出bug在哪里。
像我,使用多文件變成,主函數(shù)文件就幾行代碼:
一共就使用了5個(gè)文件,其中一個(gè)文件是主函數(shù),代碼僅5行。
但是呢,為了方便大家,我就直接把多文件去掉,把完整的代碼直接放這了,加起來也快有1100行了(空格大概占了100行)。
上源代碼:(vs和dev都是可以運(yùn)行的!運(yùn)行不了見開頭)
//用到的全部頭文件和定義的結(jié)構(gòu)體
#include//常規(guī)
#include//字符串
#include//鏈表相關(guān)
#include//數(shù)學(xué)函數(shù)相關(guān)
#include//清屏函數(shù)頭文件
#include//調(diào)用并顯示當(dāng)前時(shí)間
#include//隱藏密碼輸入函數(shù)getch()的頭文件
#include//無窮大或無窮小相關(guān)
#define Error -1;//定義錯(cuò)誤信息
#define MVNum 700//全中國大概有661座城市
typedef struct ENode {//定義邊的結(jié)構(gòu)體
int v1, v2;//表示頂點(diǎn)(即城市所在的鄰接表的位置的下標(biāo))
char city1[10], city2[10];//頂點(diǎn)/城市的名稱
int mileage, cost, time;//邊的權(quán)重:路程、費(fèi)用、時(shí)間(單位為分鐘)
}*edge;
typedef struct AdjVNode {//定義鄰接點(diǎn)的結(jié)構(gòu)體
int adjv;//鄰接點(diǎn),表示所連接的城市的位置,也就是下標(biāo)
char CityName[10];//表示所連接的城市名稱
int mileage, cost, time;//邊的權(quán)重:路程、費(fèi)用、時(shí)間
struct AdjVNode* Next;//指向下一個(gè)鄰接點(diǎn)的指針
}*adjoin;
typedef struct VNode {//定義頂點(diǎn)表頭結(jié)點(diǎn)的結(jié)構(gòu)體
char CityName[10];//頂點(diǎn)數(shù)據(jù),即為城市名稱
adjoin FirstEdge;//邊的表頭指針
}adjlist[MVNum];
typedef struct GNode {//定義圖的結(jié)構(gòu)體
int Nv, Ne;//圖的頂點(diǎn)數(shù)、邊數(shù)
adjlist G;//鄰接表
}*graph;
typedef int DataType;//定義數(shù)據(jù)類型,可改為其他
typedef struct Queue {//創(chuàng)建結(jié)構(gòu)體
DataType Data;//隊(duì)列的元素/數(shù)據(jù)
struct Queue* Next;//尾指針
}*queue;
//實(shí)現(xiàn)隊(duì)列的頭文件,隊(duì)列元素為整型,鏈表實(shí)現(xiàn)
//該頭文件模仿C++中隊(duì)列頭文件的實(shí)現(xiàn)
//#include"HeaderFile.h"http://引入頭文件,其中已包含各個(gè)定義的結(jié)構(gòu)體
queue CreateQ();//創(chuàng)建隊(duì)列
DataType back(queue Q);//返回隊(duì)列中的最后一個(gè)元素
bool empty(queue Q);//判斷隊(duì)列是否為空,如果隊(duì)列空則返回真
DataType front(queue Q);//返回隊(duì)列的第一個(gè)元素
void pop(queue Q);//刪除隊(duì)列中的第一個(gè)元素
void push(queue Q, DataType data);//在隊(duì)列末尾加入一個(gè)元素
int size(queue Q);//返回隊(duì)列中元素的個(gè)數(shù)
void show(queue Q);//額外添加,將隊(duì)列所有元素輸出,測試用
//------下面是具體實(shí)現(xiàn)
queue CreateQ() {//創(chuàng)建隊(duì)列
queue Q = (queue)malloc(sizeof(struct Queue));//創(chuàng)建頭節(jié)點(diǎn)/開辟空間
Q->Next = NULL;//頭節(jié)點(diǎn)空置
return Q;
}
DataType back(queue Q) {//返回隊(duì)列中的最后一個(gè)元素
if (empty(Q)) return Error;//如果隊(duì)列為空返回錯(cuò)誤信息
queue p = Q->Next;
while (p->Next)p = p->Next;//找到最后一個(gè)元素的位置
return p->Data;//返回最后一個(gè)元素
}
bool empty(queue Q) {//判斷隊(duì)列是否為空,如果隊(duì)列空則返回真
return Q->Next == NULL;
}
DataType front(queue Q) {//返回隊(duì)列的第一個(gè)元素
if (empty(Q)) return Error;//如果隊(duì)列為空返回錯(cuò)誤信息
return Q->Next->Data;//否則隊(duì)列不為空直接返回第一個(gè)元素
}
void pop(queue Q) {//刪除隊(duì)列中的第一個(gè)元素
if (empty(Q))return;//如果隊(duì)列為空直接退出
queue p = Q->Next;//刪除第一個(gè)元素/結(jié)點(diǎn)
Q->Next = p->Next;
p->Next = NULL;
free(p);//將已刪除的結(jié)點(diǎn)的空間釋放
}
void push(queue Q, DataType data) {//在隊(duì)列末尾加入一個(gè)元素
queue p = (queue)malloc(sizeof(struct Queue));//創(chuàng)建結(jié)點(diǎn)
p->Next = NULL;//將準(zhǔn)備插入的結(jié)點(diǎn)的尾指針指向空
p->Data = data;//存入數(shù)據(jù)
if (Q->Next) {//如果當(dāng)前隊(duì)列不為空
queue q = Q->Next;
while (q->Next)q = q->Next;
q->Next = p;//插入結(jié)點(diǎn)
}
else Q->Next = p;//否則直接將要插入的結(jié)點(diǎn)作為第一個(gè)結(jié)點(diǎn)
}
int size(queue Q) {//返回隊(duì)列中元素的個(gè)數(shù)
int count = 0;//開一個(gè)變量計(jì)數(shù)
queue p = Q->Next;
while (p)p = p->Next, count++;//計(jì)數(shù)
return count;//返回元素個(gè)數(shù)
}
void show(queue Q) {//額外添加,將隊(duì)列所有元素輸出,測試用
if (empty(Q)) {//如果隊(duì)列為空直接退出
printf("隊(duì)列為空\n");
return;
}
queue p = Q->Next;//遍歷輸出
while (p) {
printf("%d ", p->Data);
p = p->Next;
}
printf("\n");
}
//實(shí)現(xiàn)圖的頭文件,用鄰接表實(shí)現(xiàn)
//#include"queue.h"http://引入隊(duì)列頭文件,其中已包含頭文件和結(jié)構(gòu)體
//定義/初始化一個(gè)圖,如果文件中有路線也把路線插入圖中
graph CreateG();
//判斷圖是否為空
bool empty(graph G);
//在圖G中查找城市名稱,如果不存在則返回錯(cuò)誤信息ERROR,存在則返回該城市所在鄰接表的下標(biāo)位置
int Search_CityName(graph G, char city[]);
//往圖G中插入一條新的路線E
void Insert_Path(graph G, edge E);
//將鄰接表進(jìn)行輸出,測試用
void show(graph G);
//將所有的路線進(jìn)行輸出
void Show_Path(graph G);
//將圖中的某條路線進(jìn)行修改
void Modify_Path(graph G, edge E);
//將圖進(jìn)行保存,格式為:城市1 城市2 路程 費(fèi)用 時(shí)間
bool Save_File(graph G);
//讀取文件,將文件中的路線全部輸進(jìn)鄰接表中
bool Read_File(graph G);
//用該函數(shù)來遞歸查找P數(shù)組中的路徑
void print_path(graph G, int i, int j);
//用Folyd算法生成當(dāng)前城市能到達(dá)的所有城市
void Floyd_path(graph G, char city[]);
//用Folyd算法生成任意兩個(gè)城市之間的費(fèi)用最少的路線
void Floyd_Cost(graph G, char city1[], char city2[]);
//用Folyd算法生成任意兩個(gè)城市之間的路程最少的路線
void Floyd_Mileage(graph G, char city1[], char city2[]);
//用Folyd算法生成任意兩個(gè)城市之間的所用時(shí)間最少的路線
void Floyd_Time(graph G, char city1[], char city2[]);
//用廣度優(yōu)先搜索算法搜索中轉(zhuǎn)站最少的路線,需要用到隊(duì)列
void Bfs(graph G, char city1[], char city2[]);
//將v1到v2的中轉(zhuǎn)站最少的路線打印出來
void Print_Path(graph G, int v1, int v2);
//----下面是具體實(shí)現(xiàn)的函數(shù)
//定義/初始化一個(gè)圖
graph CreateG() {
graph G = (graph)malloc(sizeof(struct GNode));//建立圖/開辟空間
G->Ne = 0;//初始邊數(shù)為0
G->Nv = 0;//初始的頂點(diǎn)/城市數(shù)目也為0
for (int i = 0; i< MVNum; i++)//將圖中的全部頂點(diǎn)的表頭指針賦為空NULL
G->G[i].FirstEdge = NULL;
Read_File(G);//將文件中的路線輸入圖中
return G;//將圖返回
}
//判斷圖是否為空
bool empty(graph G) {
return G->Nv == 0;
}
//在圖G中查找城市名稱,如果不存在則返回錯(cuò)誤信息Error,存在則返回該城市所在鄰接表的下標(biāo)位置
int Search_CityName(graph G, char city[]) {
if (empty(G))return Error;//如果當(dāng)前圖為空,則直接返回錯(cuò)誤信息
for (int i = 0; i< G->Nv; i++) //否則進(jìn)行查找
if (strcmp(G->G[i].CityName, city) == 0)return i;//找到了直接返回下標(biāo)
return Error;//沒找到返回錯(cuò)誤信息
}
//往圖G中插入一條新的路線
void Insert_Path(graph G, edge E) {
E->v1 = Search_CityName(G, E->city1);//現(xiàn)在原先的鄰接表中查找兩城市的位置
E->v2 = Search_CityName(G, E->city2);
if (E->v1 == -1)E->v1 = G->Nv++;//沒找到就在圖中加入新的點(diǎn),同時(shí)圖中的頂點(diǎn)數(shù)+1
if (E->v2 == -1)E->v2 = G->Nv++;
adjoin p = (adjoin)malloc(sizeof(struct AdjVNode));//開辟一個(gè)新的鄰接點(diǎn)
p->adjv = E->v2; p->cost = E->cost;//給鄰接點(diǎn)賦值:
p->mileage = E->mileage; p->time = E->time; strcpy(p->CityName, E->city2);
strcpy(G->G[E->v1].CityName, E->city1);//將城市名稱放入頂點(diǎn)數(shù)據(jù)
adjoin s = G->G[E->v1].FirstEdge;//用尾插法將鄰接點(diǎn)與鄰接表進(jìn)行連接
if (s == NULL) {
p->Next = G->G[E->v1].FirstEdge;
G->G[E->v1].FirstEdge = p;
}
else {
while (s->Next != NULL)s = s->Next;
p->Next = s->Next;
s->Next = p;
}
adjoin q = (adjoin)malloc(sizeof(struct AdjVNode));//無向邊需要在邊的兩頭都加入鄰接點(diǎn)
q->adjv = E->v1; q->cost = E->cost;//給鄰接點(diǎn)賦值
q->mileage = E->mileage; q->time = E->time; strcpy(q->CityName, E->city1);
strcpy(G->G[E->v2].CityName, E->city2);//將城市名稱放入頂點(diǎn)數(shù)據(jù)
s = G->G[E->v2].FirstEdge;//用尾插法將鄰接點(diǎn)與鄰接表進(jìn)行連接
if (s == NULL) {
q->Next = G->G[E->v2].FirstEdge;
G->G[E->v2].FirstEdge = q;
}
else {
while (s->Next != NULL)s = s->Next;
q->Next = s->Next;
s->Next = q;
}
G->Ne++;//最后圖的邊的數(shù)目+1
}
//將鄰接表進(jìn)行輸出,測試用
void show(graph G) {
for (int i = 0; i< G->Nv; i++) {
printf("%s 可以去的城市:", G->G[i].CityName);
adjoin p = G->G[i].FirstEdge;//將指針指向鄰接表的該位置的表頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
while (p != NULL) {
printf("%s(費(fèi)用為:%d) ", p->CityName, p->cost);
p = p->Next;
}
printf("\n\n");
}
}
//將圖進(jìn)行保存,格式為:城市1 城市2 路程 費(fèi)用 時(shí)間
bool Save_File(graph G) {
bool vis[MVNum][MVNum] = { false };//開一個(gè)布爾類型的二維數(shù)組進(jìn)行標(biāo)記,防止重復(fù)輸出相同的路線
FILE* fpw = fopen("path.txt", "w");//以只寫的形式打開文本文件
//若文件不存在則新建,否則,從起始位置開始寫入文件,會(huì)覆蓋文件原來的內(nèi)容
if (fpw == NULL)return false;//如果打開文件失敗則退出
for (int i = 0; i< G->Nv; i++) {
adjoin p = G->G[i].FirstEdge;//將指針指向鄰接表的該位置的表頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
while (p != NULL) {
if (!vis[i][p->adjv] && !vis[p->adjv][i]) {
fprintf(fpw, "%s %s %d %d %d\n", G->G[i].CityName, p->CityName, p->mileage, p->cost, p->time);
vis[i][p->adjv] = true;
vis[p->adjv][i] = true;
}
p = p->Next;
}
}
fclose(fpw);//關(guān)閉文件指針
return true;
}
//讀取文件,將文件中的路線全部輸進(jìn)圖G中
bool Read_File(graph G) {
FILE* fpr = fopen("path.txt", "r");
//以只讀的形式打開文本文件,不存在則退出
edge E = (edge)malloc(sizeof(struct ENode));//給一條邊開辟空間,用來進(jìn)行讀取輸入
if (fpr == NULL)return false;//如果文件不存在或文件為空,則退出
//用while語句將所有的路線都插入圖G中
while (fscanf(fpr, "%s %s %d %d %d", E->city1, E->city2, &E->mileage, &E->cost, &E->time) != EOF)
Insert_Path(G, E);//直接將從文件中讀出的路線插入圖G中,并且不用保存
fclose(fpr);//關(guān)閉文件指針
return true;
}
//將圖G中的某條路線進(jìn)行修改
void Modify_Path(graph G, edge E) {
E->v1 = Search_CityName(G, E->city1);//現(xiàn)在原先的鄰接表中查找兩城市的位置
E->v2 = Search_CityName(G, E->city2);
if (E->v1 == -1 || E->v2 == -1) {//如果有一個(gè)城市沒有找到對(duì)應(yīng)的鄰接表中的位置,說明該路線不存在
printf("該路線不存在!\n");
return;
}
adjoin p = G->G[E->v1].FirstEdge;//將城市1所在的鄰接表的位置的表頭指針賦給p
while (p != NULL) {
if (p->adjv == E->v2) {//用指針p進(jìn)行遍歷查找城市2
p->cost = E->cost;//找到后進(jìn)行數(shù)據(jù)修改
p->mileage = E->mileage;
p->time = E->time;
break;//找到了直接退出循環(huán)
}
p = p->Next;//沒找到繼續(xù)找
}
p = G->G[E->v2].FirstEdge;//將城市2所在的鄰接表的位置的表頭指針賦給p
while (p != NULL) {
if (p->adjv == E->v1) {//用指針p進(jìn)行遍歷查找城市1
p->cost = E->cost;//找到后進(jìn)行數(shù)據(jù)修改
p->mileage = E->mileage;
p->time = E->time;
break;//找到了直接退出循環(huán)
}
p = p->Next;//沒找到繼續(xù)找
}
Save_File(G);//將修改后的路線進(jìn)行保存
}
//將所有的路線進(jìn)行輸出
void Show_Path(graph G) {
system("cls");
printf("-----------------------------------------------------路線總表-----------------------------------------------------------\n");
printf("________________________________________________________________________________________________________________________\n");
printf("|%10s\t\t|%10s\t\t|%10s\t\t|%10s\t\t|%10s\t\t|\n", "起點(diǎn)", "終點(diǎn)", "路程(千米)", "費(fèi)用(元)", "時(shí)間(分)");
printf("________________________________________________________________________________________________________________________\n");
bool vis[MVNum][MVNum] = { false };//開一個(gè)布爾類型的二維數(shù)組進(jìn)行標(biāo)記,防止重復(fù)輸出相同的路線
for (int i = 0; i< G->Nv; i++) {
adjoin p = G->G[i].FirstEdge;//將指針指向鄰接表的該位置的表頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
bool flag = false;//定義一個(gè)標(biāo)記用于換行輸出
while (p != NULL) {
if (!vis[i][p->adjv] && !vis[p->adjv][i]) {
//printf("%s到%s(反方向相同) 所需路程:%d 所需路費(fèi):%d 所需時(shí)間:%d", G->G[i].CityName, p->CityName, p->mileage, p->cost, p->time);
printf("|%10s\t\t|%10s\t\t|%10d\t\t|%10d\t\t|%10d\t\t|", G->G[i].CityName, p->CityName, p->mileage, p->cost, p->time);
vis[i][p->adjv] = true;//將路線輸出后進(jìn)行標(biāo)記
vis[p->adjv][i] = true;
flag = true;
}
p = p->Next;
if (flag) {//如果標(biāo)記變?yōu)檎?,說明有了輸出,進(jìn)行換行
printf("\n________________________________________________________________________________________________________________________\n");
flag = false;//重新標(biāo)記為假
}
}
}
}
//用矩陣D來保存費(fèi)用這個(gè)權(quán)值,用P來保存路徑
//開的空間比較大,要用用全局變量,否則在函數(shù)內(nèi)部定義會(huì)造成堆棧溢出
long long D[MVNum][MVNum], P[MVNum][MVNum];
//用Folyd算法生成當(dāng)前城市能到達(dá)的所有城市
void Floyd_path(graph G, char city[]) {
int v = -1;
for (int i = 0; i< G->Nv; i++)//對(duì)兩個(gè)矩陣進(jìn)行初始化
if (strcmp(G->G[i].CityName, city) == 0) {
v = i;
break;
}
for (int i = 0; i< G->Nv; i++)//對(duì)Path矩陣進(jìn)行初始化
for (int j = 0; j< G->Nv; j++) {
P[i][j] = -1;//
}
//memset(P,-1,sizeof P);
for (int i = 0; i< G->Nv; i++) {
adjoin p = G->G[i].FirstEdge;
while (p != NULL) {
P[i][p->adjv] = 1;
P[p->adjv][i] = 1;
p = p->Next;
}
}
for (int k = 0; k< G->Nv; k++)//floyd算法
for (int i = 0; i< G->Nv; i++)
for (int j = 0; j< G->Nv; j++)
if (P[i][k] == 1 && P[k][j] == 1) {
P[i][j] = 1;
}
printf("%s 能夠到達(dá)的所有城市:", G->G[v].CityName);
for (int i = 0; i< G->Nv; i++) {
if (P[v][i] == 1 && v != i)
printf("%s ", G->G[i].CityName);
}
printf("\n\n");
}
//用該函數(shù)來遞歸查找P數(shù)組中的路徑
void print_path(graph G, int i, int j) {
int k = P[i][j];//找到上一個(gè)中轉(zhuǎn)站/頂點(diǎn)(中轉(zhuǎn)城市)
if (k == -1)
//說明沒有中轉(zhuǎn)頂點(diǎn),直接返回
return;
print_path(G, i, k);//尋找i和k之間
printf("%s->", G->G[k].CityName);
print_path(G, k, j);//尋找k和j之間
}
//用Folyd算法生成任意兩個(gè)城市之間的費(fèi)用最少的路線
bool Floyd_Cost(graph G, int v1, int v2) {
for (int i = 0; i< G->Nv; i++)//對(duì)兩個(gè)矩陣進(jìn)行初始化
for (int j = 0; j< G->Nv; j++) {
if (i == j)D[i][j] = 0;//如果相同說明是同一點(diǎn)
else D[i][j] = INT_MAX;//否則先全部賦值為無窮大
P[i][j] = -1;//一開始路徑都沒有
}
for (int i = 0; i< G->Nv; i++) {//記錄所有相鄰城市之間的費(fèi)用
adjoin p = G->G[i].FirstEdge;
while (p != NULL) {
D[i][p->adjv] = p->cost;//將邊上的費(fèi)用這個(gè)權(quán)值賦給數(shù)組D
p = p->Next;
}
}
for (int k = 0; k< G->Nv; k++)//floyd算法
for (int i = 0; i< G->Nv; i++)
for (int j = 0; j< G->Nv; j++)
if (D[i][k] + D[k][j]< D[i][j]) {
D[i][j] = D[i][k] + D[k][j];
//因?yàn)槁焚M(fèi)不會(huì)是負(fù)數(shù),所以不用加特判了
if (i != j)P[i][j] = k;
}
if (D[v1][v2] >= INT_MAX) return false;
//如果最后的路線總費(fèi)用大于等定義好的無窮大,那么說明路線不存在
printf("從 %s 至 %s 花費(fèi)最小的路線為:%s->", G->G[v1].CityName, G->G[v2].CityName, G->G[v1].CityName);
print_path(G, v1, v2);
printf("%s 共花費(fèi)%d元\n\n", G->G[v2].CityName, D[v1][v2]);
return true;
}
//用Folyd算法生成任意兩個(gè)城市之間的路程最少的路線
void Floyd_Mileage(graph G, int v1, int v2) {
for (int i = 0; i< G->Nv; i++)//對(duì)兩個(gè)矩陣進(jìn)行初始化
for (int j = 0; j< G->Nv; j++) {
if (i == j)D[i][j] = 0;//如果相同說明是同一點(diǎn)
else D[i][j] = INT_MAX;//否則先全部賦值為無窮大
P[i][j] = -1;//一開始路徑都沒有
}
for (int i = 0; i< G->Nv; i++) {//記錄所有相鄰城市之間的路程
adjoin p = G->G[i].FirstEdge;
while (p != NULL) {
D[i][p->adjv] = p->mileage;//將邊上的費(fèi)用這個(gè)權(quán)值賦給數(shù)組D
p = p->Next;
}
}
for (int k = 0; k< G->Nv; k++)//floyd算法
for (int i = 0; i< G->Nv; i++)
for (int j = 0; j< G->Nv; j++)
if (D[i][k] + D[k][j]< D[i][j]) {
D[i][j] = D[i][k] + D[k][j];
//因?yàn)槁烦滩粫?huì)是負(fù)數(shù),所以不用加特判了
if (i != j)P[i][j] = k;
}
printf("從 %s 至 %s 路程最小的路線為:%s->", G->G[v1].CityName, G->G[v2].CityName, G->G[v1].CityName);
print_path(G, v1, v2);
printf("%s 共有%dkm的路程\n\n", G->G[v2].CityName, D[v1][v2]);
}
//用Folyd算法生成任意兩個(gè)城市之間的所用時(shí)間最少的路線
void Floyd_Time(graph G, int v1, int v2) {
for (int i = 0; i< G->Nv; i++)//對(duì)兩個(gè)矩陣進(jìn)行初始化
for (int j = 0; j< G->Nv; j++) {
if (i == j)D[i][j] = 0;//如果相同說明是同一點(diǎn)
else D[i][j] = INT_MAX;//否則先全部賦值為無窮大
P[i][j] = -1;//一開始路徑都沒有
}
for (int i = 0; i< G->Nv; i++) {//記錄所有相鄰城市之間的時(shí)間
adjoin p = G->G[i].FirstEdge;
while (p != NULL) {
D[i][p->adjv] = p->time;//將邊上的費(fèi)用這個(gè)權(quán)值賦給數(shù)組D
p = p->Next;
}
}
for (int k = 0; k< G->Nv; k++)//floyd算法
for (int i = 0; i< G->Nv; i++)
for (int j = 0; j< G->Nv; j++)
if (D[i][k] + D[k][j]< D[i][j]) {
D[i][j] = D[i][k] + D[k][j];
//因?yàn)闀r(shí)間不會(huì)是負(fù)數(shù),所以不用加特判了
if (i != j)P[i][j] = k;
}
printf("從 %s 至 %s 所花時(shí)間最少的路線為:%s->", G->G[v1].CityName, G->G[v2].CityName, G->G[v1].CityName);
print_path(G, v1, v2);
printf("%s 共需時(shí)間%d分鐘\n\n", G->G[v2].CityName, D[v1][v2]);
}
//下面這三個(gè)數(shù)組用與Bfs也就是廣搜,搜索中轉(zhuǎn)站最少的路線
int d[MVNum] = { 0 }, p[MVNum] = { 0 };
bool vis[MVNum];//用vis數(shù)組標(biāo)記已經(jīng)遍歷過的鄰接點(diǎn)
//用數(shù)組d來保存路線的長度,用數(shù)組P來保存廣搜的路徑
//將v1到v2的中轉(zhuǎn)站最少的路線打印出來,需要先執(zhí)行Bfs函數(shù)
void Print_Path(graph G, int v1, int v2) {
if (v2 == v1)printf("%s", G->G[v1].CityName);//遞歸結(jié)束標(biāo)志
//剛進(jìn)來時(shí),v1肯定不等于v2,但是因?yàn)関1是起點(diǎn),所以會(huì)遞歸到v1==v2時(shí)才會(huì)進(jìn)行輸出
else if (p[v2] == -1)return;
else {
Print_Path(G, v1, p[v2]);//這里進(jìn)行遞歸,直到v1==v2
printf("->%s", G->G[v2].CityName);
}
}
//用廣度優(yōu)先搜索算法搜索中轉(zhuǎn)站最少的路線,需要用到隊(duì)列
void Bfs(graph G, int v1, int v2) {
printf("從 %s 至 %s 中轉(zhuǎn)站最少的路線為:", G->G[v1].CityName, G->G[v2].CityName);
memset(vis, false, sizeof vis);//將vis數(shù)組全部賦值為false
memset(p, -1, sizeof p);//將數(shù)組p全部賦值為-1,表示沒有初始路徑
queue q = CreateQ();//創(chuàng)建一個(gè)隊(duì)列
push(q, v1);//入隊(duì)
vis[v1] = true;//標(biāo)記
while (!empty(q)) {//當(dāng)隊(duì)列不為空時(shí)繼續(xù)執(zhí)行
int v = front(q);//將隊(duì)頭出列
pop(q);//出隊(duì),隊(duì)頭出隊(duì)后馬上將隊(duì)頭刪除
adjoin t = G->G[v].FirstEdge;
while (t != NULL) {
if (!vis[t->adjv]) {//如果這個(gè)鄰接點(diǎn)沒有遍歷過
vis[t->adjv] = true;//進(jìn)行標(biāo)記
p[t->adjv] = v;//記錄父節(jié)點(diǎn)
d[t->adjv] = d[v] + 1;//中轉(zhuǎn)站+1
push(q, t->adjv);//入隊(duì)
}
t = t->Next;
}
}
Print_Path(G, v1, v2);//將路徑進(jìn)行打印
printf(" 中轉(zhuǎn)站的個(gè)數(shù)為:%d \n\n", d[v2] - 1);
//輸出中轉(zhuǎn)站個(gè)數(shù)并進(jìn)行換行,進(jìn)行-1是因?yàn)閐[v2]已經(jīng)將v2也就是終點(diǎn)城市算進(jìn)去了
}
//這個(gè)頭文件用來設(shè)計(jì)系統(tǒng)的界面
//#include"graph.h"http://引入圖的頭文件
//其實(shí)也可以直接定義一個(gè)管理員的結(jié)構(gòu)體,但是因?yàn)橐呀?jīng)實(shí)現(xiàn)了,就沒管太多
char Ad_Name[15][20], ad_name[20];//存放管理員用戶名稱和輸入管理員用戶名稱
char Ad_Number[15][20], ad_number[20];//用來存放管理員賬號(hào)
char password[15][20], key[20];//用來存放管理員密碼
int adsum = 0;//使用一個(gè)變量來記錄用戶個(gè)數(shù)
void save_password();//保存管理員用戶名、賬號(hào)和密碼
void hide_password(char* pswd, unsigned maxlen);//隱藏密碼進(jìn)行輸入
void Enter_Ad();//進(jìn)入管理員界面,需要輸入密碼
void Welcome();//主菜單界面,無需密碼進(jìn)入
void Welcome_Print();//打印主菜單界面
void Welcome_Ad_Print();//打印管理員界面
void Welcome_Ad(graph G);//進(jìn)入管理員界面,需要進(jìn)行登錄
int Change_Password();//修改管理員密碼
void Printflove();//打印愛心
void Goodbye();//結(jié)束程序
void Function_One(graph G);//實(shí)現(xiàn)用戶的功能1,查詢城市路線
void Function_Three(graph G);//實(shí)現(xiàn)用戶的功能3
void Ad_Function_Two(graph G);//實(shí)現(xiàn)用戶/管理員的功能2,修改/更新路線
void Ad_Function_Three(graph G);//實(shí)現(xiàn)管理員的功能3,添加新路線
void Ad_Function_Four(graph G);//實(shí)現(xiàn)管理員的功能4,查詢所有路線
void Ad_Function_Six();//實(shí)現(xiàn)管理員的功能6,注冊(cè)管理員賬號(hào)
void Ad_Function_Seven();//實(shí)現(xiàn)管理員功能7,查看管理員賬號(hào)
void Ad_Functino_Eight();//實(shí)現(xiàn)管理員功能8,注銷管理員賬號(hào)
void Ad_Function_Nine();//實(shí)現(xiàn)管理員功能9,修改管理員用戶名
//將文件中存儲(chǔ)的所有用戶名和密碼都讀取進(jìn)password和Ad_Name數(shù)組中
void Read_Ad_Password();
int Sreach_Adname(char adname[]);//在數(shù)組Ad_name中找到用戶名的位置
int Sreach_Adnumber(char adnumber[]);//在數(shù)組Ad_Number中找到賬號(hào)的位置
//-----下面是函數(shù)功能實(shí)現(xiàn)
void Welcome_Print() {//打印主菜單界面
system("cls");//清屏
time_t t;
struct tm* p;
time(&t);
p = gmtime(&t);
printf("\t\t\t\t**********************************************\n");//界面
printf("\t\t\t\t**--------------%d年%02d月%02d日--------------**\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
printf("\t\t\t\t**-----------------%02d時(shí)%02d分-----------------**\n", 8 + p->tm_hour, p->tm_min);
printf("\t\t\t\t**********************************************\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t** 歡迎進(jìn)入! **\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t**********************************************\n");
printf("\t\t\t\t**---------------用戶功能菜單---------------**\n");
printf("\t\t\t\t** 查詢城市路線 ----------1 **\n");
printf("\t\t\t\t** 查詢所有路線 ----------2 **\n");
printf("\t\t\t\t** 查詢可到達(dá)城市 ----------3 **\n");
printf("\t\t\t\t** 進(jìn)入管理員界面 ----------4 **\n");
printf("\t\t\t\t** 退出咨詢系統(tǒng) ----------0 **\n");
printf("\t\t\t\t**********************************************\n");
}
void Welcome() {//主菜單界面
//進(jìn)入操作前先創(chuàng)建一個(gè)圖,并將文件中的數(shù)據(jù)輸進(jìn)去
graph G = CreateG();
while (1) {//操作需要可以持續(xù)進(jìn)行,用一個(gè)死循環(huán)
Welcome_Print();
printf("請(qǐng)輸入你所想查詢信息的選項(xiàng)(數(shù)字): ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
Function_One(G);
break;
case 2:
Ad_Function_Four(G);
break;
case 3:
Function_Three(G);
break;
case 4:
Welcome_Ad(G);
Welcome_Print();
break;
case 0:
Goodbye();
break;
}
printf("是否要繼續(xù)進(jìn)行操作?(是:1/否:0)\n");
scanf("%d", &choice);
if (choice == 0)Goodbye();
}
}
void Welcome_Ad_Print() {//打印管理員界面
system("cls");//清屏
time_t t;
struct tm* p;
time(&t);
p = gmtime(&t);
printf("\t\t\t\t**********************************************\n");//界面
printf("\t\t\t\t**--------------%d年%02d月%02d日--------------**\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
printf("\t\t\t\t**-----------------%02d時(shí)%02d分-----------------**\n", 8 + p->tm_hour, p->tm_min);
printf("\t\t\t\t**********************************************\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t** 歡迎進(jìn)入! **\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t**********************************************\n");
printf("\t\t\t\t**-------------管理員功能菜單---------------**\n");
printf("\t\t\t\t** 修改管理員密碼 ----------1 **\n");
printf("\t\t\t\t** 修改/更新路線 ----------2 **\n");
printf("\t\t\t\t** 添加新路線 ----------3 **\n");
printf("\t\t\t\t** 顯示所有路線 ----------4 **\n");
printf("\t\t\t\t** 退出管理員界面 ----------5 **\n");
printf("\t\t\t\t** 注冊(cè)管理員賬號(hào) ----------6 **\n");
printf("\t\t\t\t** 查看管理員賬號(hào) ----------7 **\n");
printf("\t\t\t\t** 注銷管理員賬號(hào) ----------8 **\n");
printf("\t\t\t\t** 修改用戶名稱 ----------9 **\n");
printf("\t\t\t\t** 退出咨詢系統(tǒng) ----------0 **\n");
printf("\t\t\t\t**********************************************\n");
}
void Welcome_Ad(graph G) {//進(jìn)入管理員界面
Read_Ad_Password();//先將文件中的管理員用戶名和密碼讀取出來
int choice;
if (adsum == 0) {
printf("當(dāng)前系統(tǒng)沒有管理員賬號(hào),是否進(jìn)行注冊(cè)?(是:1/否:0)\n");
scanf("%d", &choice);
if (choice == 1) Ad_Function_Six();//進(jìn)行注冊(cè)
else return;//否則退出管理員界面
}
Enter_Ad();//需要先進(jìn)行登錄
while (1) {//操作需要可以持續(xù)進(jìn)行,用一個(gè)死循環(huán)
Welcome_Ad_Print();//將管理員界面打印出來
printf("請(qǐng)輸入你想進(jìn)行的操作(數(shù)字): ");
scanf("%d", &choice);
switch (choice) {
case 1:
Change_Password();//修改管理員的密碼
break;
case 2:
Ad_Function_Two(G);//修改/更新路線
break;
case 3:
Ad_Function_Three(G);//加入新的路線
break;
case 4:
Ad_Function_Four(G);//查詢所有路線
break;
case 5:
return;//要退出管理員界面,直接退出這個(gè)函數(shù)即可
break;
case 6:
Ad_Function_Six();//注冊(cè)管理員賬號(hào)
break;
case 7:
Ad_Function_Seven();//查看管理員賬號(hào)
break;
case 8:
Ad_Functino_Eight();//注銷管理員賬號(hào)
break;
case 9:
Ad_Function_Nine();//修改管理員用戶名
break;
case 0:
Goodbye();//退出系統(tǒng)(直接結(jié)束整個(gè)程序)
break;
}
printf("是否要繼續(xù)進(jìn)行操作?(是:1/否:0)\n");
scanf("%d", &choice);
if (choice == 0)Goodbye();
}
}
//進(jìn)入管理員界面,需要輸入密碼
void Enter_Ad() {
system("cls");//清屏
time_t t;
struct tm* p;
time(&t);
p = gmtime(&t);
printf("\t\t\t\t**********************************************\n");
printf("\t\t\t\t**--------------%d年%02d月%02d日--------------**\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
printf("\t\t\t\t****************當(dāng)前時(shí)間%02d時(shí)%02d分%***************\n", 8 + p->tm_hour, p->tm_min);
printf("\t\t\t\t**********************************************\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t** 交通咨詢系統(tǒng) **\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t**********************************************\n");
printf("\t\t\t\t** 感謝使用本系統(tǒng),希望您使用愉快! **\n");
printf("\t\t\t\t**********************************************\n");
printf("進(jìn)入管理員界面需要進(jìn)行登錄\n");
int i, j;
while (1) {
printf("請(qǐng)輸入管理員用戶名或者賬號(hào):\n");
scanf("%s", ad_number);
i = Sreach_Adname(ad_number);
j = Sreach_Adnumber(ad_number);
if (i == -1 && j == -1) printf("不存在該用戶名或賬號(hào)!請(qǐng)重新輸入!\n");
else {
if (i == -1)i = j;
break;
}
}
int sum = 0;//開一個(gè)變量來記錄輸錯(cuò)密碼的次數(shù),錯(cuò)誤此時(shí)超過5次關(guān)閉系統(tǒng)
while (1) {
printf("請(qǐng)輸入管理員密碼:\n");
hide_password(key, 21);
printf("\n");
if (strcmp(key, password[i]) != 0) {
sum++;
if (sum >= 5) {
printf("多次輸入密碼錯(cuò)誤!系統(tǒng)關(guān)閉!\n");
sum = 0;
exit(0);
}
else {
printf("密碼錯(cuò)誤!請(qǐng)重新輸入!你還有%d次機(jī)會(huì)!\n", 5 - sum);
}
}
else {
printf("登陸成功!\n");
break;
}
}
system("pause");
}
//將修改后的賬號(hào)密碼保存
void save_password() {
FILE* fp = fopen("adname_password.txt", "w+");//打開管理員文件
//“w+”:首先建立一個(gè)新文件,進(jìn)行寫操作,然后從頭開始寫(若文件存在,原內(nèi)容將全部消失)
for (int i = 0; i< adsum; i++)
fprintf(fp, "%s %s %s\n", Ad_Name[i], Ad_Number[i], password[i]);
//將數(shù)組中的所有管理員用戶名、賬號(hào)和密碼寫入文件中
fclose(fp);//關(guān)閉文件
}
void hide_password(char* pswd, unsigned maxlen) {//隱藏密碼進(jìn)行輸入
int index = 0;
char buff = '\0';
while ((buff = getch()) != '\r') {
if (buff == '\b' && index != 0) {
index--;
printf("\b \b");
}
else if (index< maxlen - 1 && buff != '\b') {
pswd[index++] = buff;
putchar('*');
}
}
pswd[index] = '\0';
}
int Change_Password() {//修改密碼
int i;
while (1) {
printf("請(qǐng)輸入要修改密碼的管理員用戶名:\n");
scanf("%s", ad_name);
i = Sreach_Adname(ad_name);
if (i == -1) printf("不存在該管理員!請(qǐng)重新輸入!\n");
else break;
}
printf("請(qǐng)輸入原來的密碼:\n");
while (1) {
hide_password(key, 21);//隱藏密碼輸入
printf("\n");
if (strcmp(key, password[i]) != 0) {
printf("密碼錯(cuò)誤!\n");
}
else break;
}
printf("請(qǐng)輸入想要更改的管理員密碼:\n");
hide_password(password[i], 21);//隱藏密碼輸入
save_password();//重新保存文件
printf("\n修改成功!\n");
return 0;
}
void Printflove() {//打印愛心
float a, x, y;
for (y = 1.5f; y >-1.5f; y -= 0.1f) {
for (x = -1.5f; x< 1.5f; x += 0.05f) {
a = x * x + y * y - 1;
char ch = a * a * a - x * x * y * y * y<= 0.0f ? '*' : ' ';
putchar(ch);
}
printf("\n");
printf("\t\t\t ");
}
}
void Goodbye() {//結(jié)束程序
system("cls");
Printflove();
printf("\t**********************************************\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t** 歡迎下次使用!~再見!~~ **\n");
printf("\t\t\t\t** **\n");
printf("\t\t\t\t**********************************************\n");
exit(0);
}
void Function_One(graph G) {//實(shí)現(xiàn)用戶的功能1,查詢城市路線
char city1[10], city2[10];//開兩個(gè)數(shù)組輸入兩個(gè)城市名稱
printf("請(qǐng)輸入兩個(gè)城市的名稱(起點(diǎn)和終點(diǎn)):\n");
scanf("%s%s", city1, city2);
int v1 = Search_CityName(G, city1);//現(xiàn)在原先的鄰接表中查找兩城市的位置
int v2 = Search_CityName(G, city2);
if (v1 == -1 || v2 == -1) {//防止重復(fù)輸出沒有路線的信息,在查詢之前就先進(jìn)行判斷
//如果兩個(gè)城市中有一個(gè)或兩個(gè)沒找到在鄰接表中的位置,說明該路線不存在
printf("抱歉!暫時(shí)沒有%s到達(dá)%s的路線!\n", city1, city2);
return;
}
if (v1 == v2) {
printf("您已經(jīng)在該城市中,無需查找路線!\n");
return;
}
//直接調(diào)用已經(jīng)寫好的函數(shù)
if (!Floyd_Cost(G, v1, v2))//費(fèi)用最少
printf("抱歉!暫時(shí)沒有%s到達(dá)%s的路線!\n", city1, city2);
else {
Floyd_Mileage(G, v1, v2);//路程最少
Floyd_Time(G, v1, v2);//時(shí)間最少
Bfs(G, v1, v2);//中轉(zhuǎn)站最少
}
}
//實(shí)現(xiàn)用戶的功能3,查詢當(dāng)前城市可以到達(dá)的城市
void Function_Three(graph G) {
char city[10];
printf("請(qǐng)輸入當(dāng)前城市:\n");
scanf("%s", city);
int v = Search_CityName(G, city);
if (v == -1) {
printf("抱歉!暫時(shí)不存在該城市!\n");
return;
}
Floyd_path(G, city);
}
//實(shí)現(xiàn)管理員的功能2,修改/更新路線
void Ad_Function_Two(graph G) {
printf("請(qǐng)輸入更新之后的路線:\n");
printf("格式為:城市1 城市2 路程 費(fèi)用 時(shí)間\n");
edge E = (edge)malloc(sizeof(struct ENode));
scanf("%s%s%d%d%d", E->city1, E->city2, &E->mileage, &E->cost, &E->time);
E->v1 = Search_CityName(G, E->city1);//現(xiàn)在原先的鄰接表中查找兩城市的位置
E->v2 = Search_CityName(G, E->city2);
if (E->v1 == -1 || E->v2 == -1) {//如果有一個(gè)城市沒有找到對(duì)應(yīng)的鄰接表中的位置,說明該路線不存在
printf("該路線不存在!\n");
return;
}
else {
Modify_Path(G, E);
printf("修改成功!\n");
}
}
//實(shí)現(xiàn)管理員的功能3,添加新路線
void Ad_Function_Three(graph G) {
printf("請(qǐng)輸入新的路線:\n");
printf("格式為:城市1 城市2 路程 費(fèi)用 時(shí)間\n");
edge E = (edge)malloc(sizeof(struct ENode));
scanf("%s%s%d%d%d", E->city1, E->city2, &E->mileage, &E->cost, &E->time);
Insert_Path(G, E);
printf("添加路線成功!\n");
Save_File(G);//輸入新的路線之后進(jìn)行保存
}
//實(shí)現(xiàn)管理員的功能4,查詢所有路線
void Ad_Function_Four(graph G) {
Show_Path(G);
}
//將文件中存儲(chǔ)的所有用戶名和密碼都讀取進(jìn)password和Ad_Name數(shù)組中
void Read_Ad_Password() {
FILE* fpr = fopen("adname_password.txt", "r");//打開文件,如果文件不存在會(huì)自動(dòng)創(chuàng)建文件
int i = 0;
adsum = 0;//先將管理員人數(shù)清零,因?yàn)槭侵匦聦⑺泄芾韱T再輸入數(shù)組
//不清零會(huì)導(dǎo)致重復(fù)進(jìn)入管理員界面的時(shí)會(huì)顯示的人數(shù)超過10人
if (fpr == NULL)return;
while (fscanf(fpr, "%s %s %s", ad_name, ad_number, key) != EOF) {
strcpy(Ad_Name[i], ad_name);//將文件中的用戶名、賬號(hào)密碼都寫入數(shù)組中
strcpy(Ad_Number[i], ad_number);
strcpy(password[i++], key);
adsum++;//管理員用戶個(gè)數(shù)++
}
fclose(fpr);//關(guān)閉文件指針
}
//實(shí)現(xiàn)管理員的功能6,注冊(cè)管理員賬號(hào)
void Ad_Function_Six() {
if (adsum >= 10) {//如果當(dāng)前管理員賬號(hào)有10個(gè),則不允許再添加管理員賬號(hào)
printf("管理員賬號(hào)已滿!無法再進(jìn)行注冊(cè)!\n");
}
else {
while (1) {
printf("請(qǐng)輸入新的管理員用戶名:\n");
scanf("%s", ad_name);
int i = Sreach_Adname(ad_name);
if (i == -1) {
strcpy(Ad_Name[adsum], ad_name);
break;
}
else printf("該用戶名已存在!請(qǐng)重新輸入!\n");
}
while (1) {
printf("請(qǐng)輸入對(duì)應(yīng)的管理員賬號(hào):\n");
scanf("%s", ad_number);
int i = Sreach_Adnumber(ad_number);
if (i == -1) {
strcpy(Ad_Number[adsum], ad_number);
break;
}
else printf("該賬號(hào)已存在!請(qǐng)重新輸入!\n");
}
printf("請(qǐng)輸入對(duì)應(yīng)的管理員密碼:\n");
hide_password(key, 21);//隱藏密碼輸入
strcpy(password[adsum++], key);
save_password();//將新注冊(cè)的管理員賬號(hào)進(jìn)行保存,保存進(jìn)文件中
printf("\n注冊(cè)成功!\n");
}
system("pause");//請(qǐng)按任意鍵繼續(xù)
}
//實(shí)現(xiàn)管理員功能7,查看管理員賬號(hào)
void Ad_Function_Seven() {
system("cls");
printf("-------------------------------管理員名單-------------------------------\n");
printf("________________________________________________________________________\n");
printf("|%10s\t\t|%10s\t\t|%10s\t\t|\n", "管理員用戶名", "管理員賬號(hào)", "管理員密碼");
printf("________________________________________________________________________\n");
for (int i = 0; i< adsum; i++) {
printf("|%10s\t\t|%10s\t\t|%10s\t\t|\n", Ad_Name[i], Ad_Number[i], password[i]);
printf("________________________________________________________________________\n");
}
printf("當(dāng)前管理員人數(shù)為:%d人\n", adsum);
}
//實(shí)現(xiàn)管理員功能8,注銷管理員賬號(hào)
void Ad_Functino_Eight() {
printf("請(qǐng)輸入想要注銷的管理員用戶名:\n");
scanf("%s", ad_name);
int i = Sreach_Adname(ad_name), choice;
if (i == -1)printf("不存在該管理員用戶名!\n");
else {
while (1) {
printf("請(qǐng)輸入對(duì)應(yīng)的管理員密碼:\n");
hide_password(key, 21);//隱藏密碼輸入
if (strcmp(key, password[i]) != 0)printf("\n密碼錯(cuò)誤!\n");
else break;
}
printf("\n請(qǐng)?jiān)俅未_認(rèn)是否注銷該管理員賬號(hào)?(是:1/否:0)\n");
scanf("%d", &choice);
if (choice == 1) {
for (int j = i; j< adsum - 1; j++) {
strcpy(Ad_Name[j], Ad_Name[j + 1]);//將用戶名前移
strcpy(password[j], password[j + 1]);//將密碼前移
strcpy(Ad_Number[j], Ad_Number[j + 1]);//將賬號(hào)前移
}
adsum--;
save_password();//保存新的數(shù)組
printf("管理員賬號(hào)注銷成功!\n");
}
else return;
}
}
//實(shí)現(xiàn)管理員功能9,修改管理員用戶名
void Ad_Function_Nine() {
printf("請(qǐng)輸入要修改的管理員用戶名:");
scanf("%s", ad_name);
int i = Sreach_Adname(ad_name);
if (i == -1) printf("不存在該管理員用戶名!");
else {
printf("請(qǐng)輸入修改之后的管理員用戶名:");
scanf("%s", ad_name);
strcpy(Ad_Name[i], ad_name);
save_password();//將修改后的結(jié)果進(jìn)行保存
printf("修改用戶名成功!\n");
}
//system("pause");//請(qǐng)按任意鍵繼續(xù)
}
//在數(shù)組Ad_Name中找到用戶名的位置
int Sreach_Adname(char adname[]) {
for (int i = 0; i< adsum; i++)
if (strcmp(adname, Ad_Name[i]) == 0)return i;//找到了直接返回該用戶名的下標(biāo)位置
return Error;//沒找到返回錯(cuò)誤信息
}
//在數(shù)組Ad_Number中找到賬號(hào)的位置
int Sreach_Adnumber(char adnumber[]) {
for (int i = 0; i< adsum; i++)
if (strcmp(Ad_Number[i], adnumber) == 0)return i;
return Error;
}
//引入界面頭文件,里面已經(jīng)包含了圖的實(shí)現(xiàn)
//#include"interface.h"
int main() {
Welcome();
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧