真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

交通咨詢系統(tǒng)源代碼(數(shù)據(jù)結(jié)構(gòu)課設(shè))-創(chuàng)新互聯(lián)

系統(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)查看詳情吧


當(dāng)前題目:交通咨詢系統(tǒng)源代碼(數(shù)據(jù)結(jié)構(gòu)課設(shè))-創(chuàng)新互聯(lián)
文章出自:http://weahome.cn/article/dpejos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部