一、設計目的
本課程設計是軟件工程學生的必修課程,數(shù)據(jù)結構與算法課程設計既是一門基礎課程,又是一門實踐性課程。通過本實訓課程的學習和訓練,使同學學會分析研究數(shù)據(jù)對象的特性,學會數(shù)據(jù)的組織方法,以便選擇合適的數(shù)據(jù)邏輯結構和存儲結構,以及相應的運算(操作),把現(xiàn)實世界中的問題轉化為計算機內部的表示和處理;加深理解數(shù)據(jù)結構中的邏輯結構和物理結構,掌握其基本概念以及有關算法,培養(yǎng)基本的、良好的程序設計技能,編制高效可靠的程序,為后續(xù)課程打好基礎。
二、設計任務及要求
項目一:學生信息管理
項目簡介:
學生信息管理是學校教務部門日常工作的重要組成部分。本項目是對學生信息管理的簡單模擬,包含兩個模塊:基本信息查詢和成績管理。
數(shù)據(jù)要求:
每個學生的信息包括:學號、姓名、性別、出生年月、電話、住址。成績設置為五門課程成績,后續(xù)可擴展。數(shù)據(jù)可直接輸入輸出,也可以采用文件存儲。
功能要求:
至少包含下列基本功能,可增加功能計入加分項,缺少功能減分
1:學生基本信息的增加。
2:通過輸入學號或者姓名實現(xiàn)基本信息的查詢、修改、刪除。
3:通過輸入學號或者姓名實現(xiàn)成績的輸入、查詢、修改。
4:對成績進行降序排列,要求可以按照總分或者某一門指定課程排序。
界面要求:
根據(jù)系統(tǒng)功能要求設計。應有合理的提示,每個功能可以設立菜單,根據(jù)提示,可以完成相關的功能要求。
設計思路:
本項目的實質是完成對學生成績信息的建立、查找、插入、修改、刪除、排序等功能,可以首先定義項目的數(shù)據(jù)結構,然后將每個功能寫成一個函數(shù)來完成對數(shù)據(jù)的操作,最后完成主函數(shù)以驗證各個函數(shù)功能并得出運行結果。
數(shù)據(jù)結構:
本項目的數(shù)據(jù)是一組學生的信息,這組信息具有相同特性,屬于同一數(shù)據(jù)對象,相鄰數(shù)據(jù)元素之間通過學號存在序偶關系。由此可以看出,這些數(shù)據(jù)具有線性表中數(shù)據(jù)元素的性質,所以該系統(tǒng)的數(shù)據(jù)可以采用線性表來存儲。
模塊功能:
結構體:
typedef struct student//學生信息結構體
{
?? char sno[15];
?? char sname[20];
?? int sex;//0表示女性,1表示男性
?? char birthday[15];
?? char tnum[15];
?? char address[20];
?? int score[10];
}student;
typedef struct listnode//鏈表結點
{
?? student data;
?? struct listnode *next;
}listnode;
函數(shù):
void Add_student()//添加學生信息
void Browse_student()//瀏覽學生信息
void query_student()//查詢學生信息
void alter_student()//修改學生信息
void delete_student()//刪除學生信息
void Add_score()//添加成績信息
void Browse_score()//瀏覽成績信息
void query_score()//查詢成績信息
void alter_score()//修改成績信息
void sort_score()//排序成績信息
void alter_scorenum()//修改成績數(shù)目
void meau1();//學生基本信息頁
void meau2();//學生成績頁
void meau0()//首頁
?程序截圖:
主菜單界面:
基本信息管理頁面
成績管理頁面
源碼:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct student//學生信息結構體
{
char sno[15];
char sname[20];
int sex;//0表示女性,1表示男性
char birthday[15];
char tnum[15];
char address[20];
int score[10];
}student;
typedef struct listnode//鏈表結點
{
student data;
struct listnode *next;
}listnode;
struct listnode *head;
int count=0;//學生記錄總數(shù)
int scorecount=5;
void Add_student()//添加學生信息
{
int num;
int i;
while(1){
printf("錄入學生信息,請選擇:1.輸入數(shù)據(jù) 0.返回\n");
scanf("%d",&num);
if(num==1)
{
struct listnode *temp=(struct listnode*)malloc(sizeof(struct listnode));
temp->next=head->next;//頭插法
head->next=temp;
count++;
printf("學號:");
scanf("%s",temp->data.sno);
printf("姓名:");
scanf("%s",temp->data.sname);
while(1)
{
printf("性別(0表示女性,1表示男性):");
scanf("%d",&temp->data.sex);
if(temp->data.sex!=1 && temp->data.sex!=0)
printf("請輸入正確的性別序號!\n");
else
break;
}
printf("出生日期(如2020-01-01):");
scanf("%s",temp->data.birthday);
printf("電話:");
scanf("%s",temp->data.tnum);
printf("地址:");
scanf("%s",temp->data.address);
for(i=1;i<=scorecount;i++)//學生成績初始化為0
temp->data.score[i]=0;
}
else if(num==0)
{
system("cls");
meau1();
return;
}
else
printf("請輸入正確的序號!\n");
};
}
void Browse_student()//瀏覽學生信息
{
struct listnode *p=head;
printf("學號 姓名 性別 生日 電話 地址\n");
while(p->next!=NULL)
{
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
if(p->data.sex==1)
printf("男 ");
else if(p->data.sex==0)
printf("女 ");
printf("%-18s",p->data.birthday);
printf("%-16s",p->data.tnum);
printf("%-20s",p->data.address);
printf("\n");
}
getchar();
getchar();//小黑窗停留
}
void query_student()//查詢學生信息
{
int num;
char sno[15];
char sname[20];
struct listnode *p=head;
printf("1.輸入學號查詢 2.輸入姓名查詢 0.返回\n");
scanf("%d",&num);
if(num==0)
{
system("cls");
meau1();
return;
}
else if(num==1)
{
printf("請輸入待查找的學號:");
scanf("%s",sno);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sno,sno)==0)
{
printf("學號 姓名 性別 生日 電話 地址\n");
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
if(p->data.sex==1)
printf("男 ");
else if(p->data.sex==0)
printf("女 ");
printf("%-18s",p->data.birthday);
printf("%-16s",p->data.tnum);
printf("%-20s",p->data.address);
printf("\n");
query_student();
return;
}
p=p->next;
}
printf("沒找到\n");
query_student();
return;
p=head;//初始化頭指針
}
else if(num==2)
{
printf("請輸入待查找的姓名:");
scanf("%s",sname);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sname,sname)==0)
{
printf("學號 姓名 性別 生日 電話 地址\n");
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
if(p->data.sex==1)
printf("男 ");
else if(p->data.sex==0)
printf("女 ");
printf("%-18s",p->data.birthday);
printf("%-16s",p->data.tnum);
printf("%-20s",p->data.address);
printf("\n");
query_student();
return;
}
p=p->next;
}
printf("沒找到\n");
query_student();
return;
}
else
{
printf("請輸入正確的序號!\n");
query_student();
return;
}
}
void alter_student()//修改學生信息
{
int num;
char sno[15];
char sname[20];
struct listnode *p=head;
printf("1.輸入學號修改 2.輸入姓名修改 0.返回\n");
scanf("%d",&num);
if(num==0)
{
system("cls");
meau1();
return;
}
else if(num==1)
{
printf("請輸入待修改記錄的學號:\n");
scanf("%s",sno);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sno,sno)==0)
{
printf("請輸入要修改的選項(學號1,姓名2,性別3,生日4,電話5,地址6)\n");
scanf("%d",&num);
switch(num)
{
case 1:scanf("%s",p->next->data.sno);break;
case 2:scanf("%s",p->next->data.sname);break;
case 3:scanf("%d",&p->next->data.sex);break;
case 4:scanf("%s",p->next->data.birthday);break;
case 5:scanf("%s",p->next->data.tnum);break;
case 6:scanf("%s",p->next->data.address);break;
}
printf("修改成功,記錄更新為:\n");
printf("學號 姓名 性別 生日 電話 地址\n");
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
if(p->data.sex==1)
printf("男 ");
else if(p->data.sex==0)
printf("女 ");
printf("%-18s",p->data.birthday);
printf("%-16s",p->data.tnum);
printf("%-20s",p->data.address);
printf("\n");
alter_student();
return;
}
p=p->next;
}
printf("沒找到\n");
alter_student();
p=head;//初始化頭指針
}
else if(num==2)
{
printf("請輸入待修改記錄的姓名:");
scanf("%s",sname);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sname,sname)==0)
{
printf("請輸入要修改的選項(學號1,姓名2,性別3,生日4,電話5,地址6)\n");
scanf("%d",&num);
switch(num)
{
case 1:scanf("%s",p->next->data.sno);break;
case 2:scanf("%s",p->next->data.sname);break;
case 3:scanf("%d",&p->next->data.sex);break;
case 4:scanf("%s",p->next->data.birthday);break;
case 5:scanf("%s",p->next->data.tnum);break;
case 6:scanf("%s",p->next->data.address);break;
}
printf("修改成功,記錄更新為:\n");
printf("學號 姓名 性別 生日 電話 地址\n");
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
if(p->data.sex==1)
printf("男 ");
else if(p->data.sex==0)
printf("女 ");
printf("%-18s",p->data.birthday);
printf("%-16s",p->data.tnum);
printf("%-20s",p->data.address);
alter_student();
return;
}
p=p->next;
}
printf("沒找到\n");
alter_student();
}
else
{
printf("請輸入正確的序號!\n");
alter_student();
}
}
void delete_student()//刪除學生信息
{
struct listnode *p=head;
int num;
char sno[15];
char sname[20];
printf("1.輸入學號刪除記錄 2.輸入姓名刪除記錄 0.返回\n");
scanf("%d",&num);
if(num==0)
{
system("cls");
meau1();
return;
}
else if(num==1)
{
if(p->next==NULL)
{
printf("暫無學生信息\n");
delete_student();
return;
}
else
{
scanf("%s",sno);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sno,sno)==0)
{
p->next=p->next->next;
printf("已刪除學號為%s的記錄\n",sno);
delete_student();
return;
}
p=p->next;
}
printf("沒找到\n");
delete_student();
return;
}
}
else if(num==2)
{
if(p->next==NULL)
{
printf("暫無學生信息\n");
delete_student();
return;
}
else
{
scanf("%s",sname);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sname,sname)==0)
{
p->next=p->next->next;
printf("已刪除姓名為%s的記錄\n",sname);
alter_student();
return;
}
p=p->next;
}
printf("沒找到\n");
delete_student();
return;
}
}
else
{
printf("請輸入正確的序號!\n");
delete_student();
return;
}
}
void Add_score()//添加成績信息
{
char sno[15];
struct listnode *p=head;
int i;
printf("請輸入要錄入成績的學生學號:\n");
scanf("%s",sno);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sno,sno)==0)
{
printf("請輸入%d門成績\n",scorecount);
for(i=1;i<=scorecount;i++)
scanf("%d",&p->next->data.score[i]);
printf("輸入成功!\n");
printf("請按任意鍵繼續(xù)...");
getchar();
getchar();
system("cls");
meau2();
return;
}
p=p->next;
}
printf("沒找到該學號學生\n");
printf("請按任意鍵繼續(xù)...");
getchar();
getchar();
system("cls");
meau2();
return;
}
void Browse_score()//瀏覽成績信息
{
struct listnode *p=head;
int i;
printf("學號 姓名 ");
for(i=1;i<=scorecount;i++)
printf("成績%d ",i);
printf("\n");
while(p->next!=NULL)
{
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
for(i=1;i<=scorecount;i++)
printf("%-8d",p->data.score[i]);
printf("\n");
}
getchar();
getchar();//小黑窗停留
system("cls");
meau2();
return;
}
void query_score()//查詢成績信息
{
int num;
char sno[15];
char sname[20];
int i;
struct listnode *p=head;
printf("1.輸入學號查詢 2.輸入姓名查詢 0.返回\n");
scanf("%d",&num);
if(num==0)
{
system("cls");
meau2();
return;
}
else if(num==1)
{
printf("請輸入待查找的學號:");
scanf("%s",sno);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sno,sno)==0)
{
printf("學號 姓名 ");
for(i=1;i<=scorecount;i++)
printf("成績%d ",i);
printf("\n");
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
for(i=1;i<=scorecount;i++)
printf("%-8d",p->data.score[i]);
printf("\n");
getchar();
getchar();
system("cls");
meau2();
return;
}
p=p->next;
}
printf("沒找到該學號的成績\n");
query_score();
p=head;//初始化頭指針
return;
}
else if(num==2)
{
printf("請輸入待查找的姓名:");
scanf("%s",sname);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sname,sname)==0)
{
printf("學號 姓名 ");
for(i=1;i<=scorecount;i++)
printf("成績%d ",i);
printf("\n");
p=p->next;
printf("%-17s",p->data.sno);
printf("%-16s",p->data.sname);
for(i=1;i<=scorecount;i++)
printf("%-8d",p->data.score[i]);
printf("\n");
getchar();
getchar();
system("cls");
meau2();
return;
}
p=p->next;
}
printf("沒找到該姓名的成績\n");
query_score();
p=head;//初始化頭指針
return;
}
else
{
printf("請輸入正確的序號!\n");
query_student();
return;
}
}
void alter_score()//修改成績信息
{
int num;
char sno[15];
char sname[20];
struct listnode *p=head;
printf("1.輸入學號修改 2.輸入姓名修改 0.返回\n");
scanf("%d",&num);
if(num==0)
{
system("cls");
meau2();
return;
}
else if(num==1)
{
printf("請輸入待修改成績的學號:\n");
scanf("%s",sno);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sno,sno)==0)
{
printf("請輸入要修改的分數(shù)序列(序號從1開始)\n");
scanf("%d",&num);
printf("原成績?yōu)?d,請輸入新的成績:",p->next->data.score[num]);
scanf("%d",&p->next->data.score[num]);
printf("修改成功,記錄已更新!\n");
alter_score();
return;
}
p=p->next;
}
printf("沒找到\n");
alter_score();
p=head;//初始化頭指針
}
else if(num==2)
{
printf("請輸入待修改成績的姓名:");
scanf("%s",sname);
while(p->next!=NULL)
{
if(strcmp(p->next->data.sname,sname)==0)
{
printf("請輸入要修改的分數(shù)序列(序號從1開始)\n");
scanf("%d",&num);
printf("原成績?yōu)?d,請輸入新的成績:",p->next->data.score[num]);
scanf("%d",&p->next->data.score[num]);
printf("修改成功,記錄已更新!\n");
alter_score();
return;
}
p=p->next;
}
printf("沒找到\n");
alter_score();
return;
}
else
{
printf("請輸入正確的序號!\n");
alter_score();
return;
}
}
void sort_score()//排序成績信息
{
struct listnode *p=head;
student sort[100];
student temp;
int num;
int s=1;
int i,j;
int sum[100]={0};
int k;//排序科目序號
while(p->next!=NULL)//把所有學生信息存到一個數(shù)組
{
i=1;
sort[s]=p->next->data;
for(i=1;i<=scorecount;i++)//計算成績總分
sum[s]=sum[s]+sort[i].score[i];
p=p->next;
s++;//記錄長度
}
p=head;//初始化頭指針
printf("1.根據(jù)姓氏排序 2.根據(jù)總分排序 3.根據(jù)某門課程排序 0.返回\n");
scanf("%d",&num);
if(num==1)
{
if(p->next==NULL)//空記錄情況
{
printf("不存在學生記錄,無法排序!\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
meau2();
return;
}
printf("請輸入排序方式(降序0,升序1)\n");
scanf("%d",&num);
if(num==1)
{
for(i=1;i<=s-1;i++)//升序
{
for(j=1;j<=s-1-i;j++)
{
printf("*");
if(strcmp(sort[j].sname,sort[j+1].sname)>0)//第一個大于第二個
{
temp=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp;
}
}
}
}
else if(num==0)
{
for(i=1;i<=s-1;i++)//降序
{
for(j=1;j<=s-1-i;j++)
{
if(strcmp(sort[j].sname,sort[j+1].sname)<0)
{
temp=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp;
}
}
}
}
}
else if(num==2)
{
if(p->next==NULL)//空記錄情況
{
printf("不存在學生記錄,無法排序!\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
meau2();
return;
}
printf("請輸入排序方式(降序0,升序1)\n");
scanf("%d",&num);
if(num==1)
{
for(i=1;i<=s-1;i++)//升序
{
for(j=1;j<=s-1-i;j++)
{
if(sum[j]>sum[j+1])//第一個大于第二個
{
temp=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp;
}
}
}
}
else if(num==0)
{
for(i=1;i<=s-1;i++)//降序
{
for(j=1;j<=s-1-i;j++)
{
if(sum[j]<sum[j+1])
{
temp=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp;
}
}
}
}
}
else if(num==3)
{
if(p->next==NULL)//空記錄情況
{
printf("不存在學生記錄,無法排序!\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
meau2();
return;
}
printf("請輸入排序科目序號(從1開始):");
scanf("%d",&k);
printf("請輸入排序方式(降序0,升序1)\n");
scanf("%d",&num);
if(num==1)
{
for(i=1;i<=s-1;i++)//升序
{
for(j=1;j<=s-1-i;j++)
{
if(sort[j].score[k]>sort[j+1].score[k])//第一個大于第二個
{
temp=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp;
}
}
}
}
else if(num==0)
{
for(i=1;i<=s-1;i++)//降序
{
for(j=1;j<=s-1-i;j++)
{
if(sort[j].score[k]<sort[j+1].score[k])
{
temp=sort[j];
sort[j]=sort[j+1];
sort[j+1]=temp;
}
}
}
}
}
else if(num==0)
{
system("cls");
meau2();
return;
}
else
{
printf("請輸入正確的序號!\n");
sort_score();
return;
}
printf("學號 姓名 ");
for(i=1;i<=scorecount;i++)
printf("成績%d ",i);
printf("\n");
for(i=1;i<s;i++)
{
printf("%-17s",sort[i].sno);
printf("%-16s",sort[i].sname);
for(j=1;j<=scorecount;j++)
printf("%-7d ",sort[i].score[j]);
printf("\n");
}
getchar();
getchar();
system("cls");
meau2();
}
void alter_scorenum()//修改成績數(shù)目
{
struct listnode *p=head;
int i;
int nowcount=scorecount;
printf("請輸入要修改為幾門成績:");
scanf ("%d",&scorecount);
while(p->next!=NULL)
{
for(i=nowcount+1;i<=scorecount;i++)//把新增的幾門成績初始化為0 ,原有的成績不作修改
p->next->data.score[i]=0;
p=p->next;
}
printf("修改成功!\n");
printf("請按回車鍵返回!");
getchar();
getchar();
system("cls");
meau2();
}
void meau1();//學生基本信息頁
void meau2();//學生成績頁
void meau0()//首頁
{
int num;
do
{
printf("\n");
printf("\n");
printf(" *****************歡迎進入學生信息管理系統(tǒng)******************\n");
printf("\n");
printf(" 1.基本信息管理\n");
printf(" 2.成績管理\n");
printf(" 0.退出\n");
printf("\n");
printf(" *************************謝謝使用*************************\n");
printf("\n");
printf("請輸入序號:");
scanf("%d",&num);
switch(num)
{
case 1:system("cls");
meau1();
break;
case 2:system("cls");
meau2();
break;
case 0: exit(1);
default:system("cls"); printf("輸入的序號有誤,請重新輸入!\n");
}
}while(num!=0 && num!=1 && num!=2);
}
void meau1()//學生基本信息管理頁面
{
int num;
do
{
printf("\n");
printf("\n");
printf(" *********************學生基本信息管理*********************\n");
printf("\n");
printf(" 1.添加學生信息 2.瀏覽學生信息\n");
printf(" 3.查詢學生信息 4.修改學生信息\n");
printf(" 5.刪除學生信息 0.退出\n");
printf("\n");
printf(" *************************謝謝使用*************************\n");
printf("\n");
printf("請輸入序號:");
scanf("%d",&num);
switch(num)
{
case 1:
Add_student();//添加學生信息
break;
case 2:
Browse_student();//瀏覽學生信息
system("cls");
meau1();
break;
case 3:
query_student();//查詢學生信息
break;
case 4:
alter_student();//修改學生信息
break;
case 5:
delete_student();//刪除學生信息
break;
case 0:system("cls");
meau0(); //返回到首頁菜單
break;
default:system("cls");printf("輸入的序號有誤,請重新輸入!\n");
}
}while(num!=0 && num!=1 && num!=2 && num!=3 && num!=4 && num!=5);
}
void meau2()//學生成績管理頁面
{
int num;
do
{
printf("\n");
printf("\n");
printf(" ***********************學生成績管理***********************\n");
printf("\n");
printf(" 1.添加成績信息 2.瀏覽成績信息\n");
printf(" 3.查詢成績信息 4.修改成績信息\n");
printf(" 5.排序成績信息 6.修改成績數(shù)量\n");
printf(" 0.退出\n");
printf("\n");
printf(" *************************謝謝使用*************************\n");
printf("\n");
printf("請輸入序號:");
scanf("%d",&num);
switch(num)
{
case 1:
Add_score();//添加成績信息
break;
case 2:
Browse_score();//瀏覽成績信息
break;
case 3:
query_score();//查詢成績信息
break;
case 4:
alter_score();//修改成績信息
break;
case 5:
sort_score();//排序成績信息
break;
case 6:
alter_scorenum();
break;
case 0:system("cls");
meau0(); //返回到首頁菜單
break;
default:system("cls");printf("輸入的序號有誤,請重新輸入!\n");
}
}while(num!=0 && num!=1 && num!=2 && num!=3 && num!=4 && num!=5 && num!=6);
}
int main()
{
head=(struct listnode*)malloc(sizeof(struct listnode));//鏈表頭指針
head->next=NULL;
meau0();
return 0;
}
項目二 簡易停車場管理
項目簡介:
設停車場是一個可以停放n輛汽車的南北方向的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端),若車場內已停滿n輛車,那么后來的車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其它車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。
數(shù)據(jù)要求:
車輛信息包括:車牌號。
功能要求:
至少包含下列基本功能,可增加功能計入加分項,缺少功能減分
1:進場前顯示剩余車位。
2:輸出每輛車到達后的停車位置(停車場或便道上)。
3:統(tǒng)計輸出某輛車離開停車場時應繳納的費用和它在停車場內停留的時間。
4:對于錯誤操作能給出相應說明,如某個車牌未在停車場內,進行出場操作給出相應提示。
界面要求:
根據(jù)系統(tǒng)功能要求設計。應有合理的提示,每個功能可以設立菜單,根據(jù)提示,可以完成相關的功能要求。
設計思路:
停車場的管理流程如下:
①當車輛要進入停車場時,檢查停車場是否已滿,如果未滿則車輛進入停車場;如果停車場已滿,則車輛進入便道等候。
②當車輛要求出棧時,先讓在它之后進入停車場的車輛退出停車場為它讓路,再讓該車退出停車場,讓路的所有車輛再按其原來進入停車場的次序進入停車場。之后,再檢查在便道上是否有車等候,有車則讓最先等待的那輛車進入停車場。
數(shù)據(jù)結構:
由于停車場只有一個大門,當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,先進停車場的后退出,后進車場的先退出,符合棧的“后進先出,先進后出”的操作特點,因此,可以用一個棧來模擬停車場。而當停車場滿后,繼續(xù)來到的其它車輛只能停在便道上,根據(jù)便道停車的特點,先排隊的車輛先離開便道進入停車場,符合隊列的“先進先出,后進后出”的操作特點,因此,可以用一個隊列來模擬便道。排在停車場中間的車輛可以提出離開停車場,并且停車場內在要離開的車輛之后到達的車輛都必須先離開停車場為它讓路,然后這些車輛依原來到達停車場的次序進入停車場,因此在前面已設的一個棧和一個隊列的基礎上,還需要有一個地方保存為了讓路離開停車場的車輛,由于先退出停車場的后進入停車場,所以很顯然保存讓路車輛的場地也應該用一個棧來模擬。因此,本題求解過程中需用到兩個棧和一個隊列。
模塊功能:
??????
數(shù)據(jù)結構:
typedef struct Node?? //數(shù)據(jù)
{
??? char number[10];
??? char time[10];
}Node;
typedef struct QueueNode?? //隊列結點
{
??? struct Node data; //數(shù)據(jù)域
??? struct QueueNode * next;//指針域
}*QueueNode;
typedef struct LinkQueue??? //鏈隊列
{
??? struct QueueNode * front;//頭
??? struct QueueNode * rear;//尾
}LinkQueue;
typedef struct stack? ???????//棧結點
{
??? struct Node data;
??? struct stack *next;
}*StackNode;
typedef struct LinkStack???? //鏈棧
{
??? StackNode top;//棧頂
??? int count;//??側萘?
}LinkStack; ?
函數(shù):
?void menu(LinkQueue *road,LinkStack *park,LinkStack *move,char num[],char t[]);//菜單
int init(LinkQueue *road,LinkStack *park,LinkStack *move);//初始化
int linklength(LinkQueue q);//計算隊列長度
int inqueue(LinkQueue *q,char num[],char t[]);//入隊
int outqueue(LinkQueue *q,char *num,char *t);//出隊
int push(LinkStack *s,char num[],char t[]);//入棧
int pop(LinkStack *s,char *num,char *t);//出棧
void inpark(LinkQueue *road,LinkStack *park,LinkStack *move);//停車場入車
void outpark(LinkQueue *road,LinkStack *park,LinkStack *move);//停車場出車
void view(LinkQueue *road,LinkStack *park,LinkStack *move);//查看停車場狀態(tài)
void query(LinkQueue *road,LinkStack *park,LinkStack *move);//查詢車輛入場時間
void add(LinkQueue *road,LinkStack *park,LinkStack *move);//新增停車場車位
void vip(LinkQueue *road,LinkStack *park,LinkStack *move);//vip模塊
void money(LinkQueue *road,LinkStack *park,LinkStack *move);
程序截圖:
?
源碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int parkcount=0;//車位數(shù)量
char vipcar[100][10];//存放vip車牌號
int vipcount;//vip數(shù)量
int tick=5;
typedef struct Node //數(shù)據(jù)
{
char number[10];
char time[10];
}Node;
typedef struct QueueNode //隊列結點
{
struct Node data; //數(shù)據(jù)域
struct QueueNode * next;//指針域
}*QueueNode;
typedef struct LinkQueue //鏈隊列
{
struct QueueNode * front;//頭
struct QueueNode * rear;//尾
}LinkQueue;
typedef struct stack //棧結點
{
struct Node data;
struct stack *next;
}*StackNode;
typedef struct LinkStack //鏈棧
{
StackNode top;//棧頂
int count;//??側萘?
}LinkStack;
void menu(LinkQueue *road,LinkStack *park,LinkStack *move,char num[],char t[]);//菜單
int init(LinkQueue *road,LinkStack *park,LinkStack *move);//初始化
int linklength(LinkQueue q);//計算隊列長度
int inqueue(LinkQueue *q,char num[],char t[]);//入隊
int outqueue(LinkQueue *q,char *num,char *t);//出隊
int push(LinkStack *s,char num[],char t[]);//入棧
int pop(LinkStack *s,char *num,char *t);//出棧
void inpark(LinkQueue *road,LinkStack *park,LinkStack *move);//停車場入車
void outpark(LinkQueue *road,LinkStack *park,LinkStack *move);//停車場出車
void view(LinkQueue *road,LinkStack *park,LinkStack *move);//查看停車場狀態(tài)
void query(LinkQueue *road,LinkStack *park,LinkStack *move);//查詢車輛入場時間
void add(LinkQueue *road,LinkStack *park,LinkStack *move);//新增停車場車位
void vip(LinkQueue *road,LinkStack *park,LinkStack *move);//vip模塊
void money(LinkQueue *road,LinkStack *park,LinkStack *move);
void menu(LinkQueue *road,LinkStack *park,LinkStack *move,char num[],char t[])//菜單
{
int s;
do
{
printf(" ** 停車場管理程序 **\n");
printf("=========================================================\n");
printf("** **\n");
printf("** 1 --- 汽車進車場 2 --- 汽車出車場 **\n");
printf("** 3 --- 查看停車場狀態(tài) 4 --- 查詢汽車入場時間 **\n");
printf("** 5 --- 新增停車場車位 6 --- vip **\n");
printf("** 7 --- 修改價格 0 --- 退出程序 **\n");
printf("** **\n");
printf("** 停車場剩余%-1d車位,每小時收費%d元 **\n",parkcount-park->count,tick);
printf("=========================================================\n");
printf("請輸入序號:");
scanf("%d",&s);
if(s==0)
{
exit(1);
}
else if(s==1)
{
inpark(road,park,move);
}
else if(s==2)
{
outpark(road,park,move);
}
else if(s==3)
{
view(road,park,move);
}
else if(s==4)
{
query(road,park,move);
}
else if(s==5)
{
add(road,park,move);
}
else if(s==6)
{
vip(road,park,move);
}
else if(s==7)
{
money(road,park,move);
}
else
{
system("cls");
printf("請輸入正確的序號!\n");
}
}while(s!=1 && s!=2 && s!=3 && s!=4 && s!=5 && s!=6 && s!=7);
}
int init(LinkQueue *road,LinkStack *park,LinkStack *move)
{
QueueNode node = (QueueNode)malloc(sizeof(struct QueueNode));
if(node==NULL)
{
return 0;
}
node->next = NULL;//初始化等待隊列
road->front = node;
road->rear = node;
move->top = NULL;//初始化移動車輛棧
move->count = 0;
park->top=NULL;//初始化停車棧
park->count=0;
}
int linklength(LinkQueue q)//計算隊列長度
{
int i = 0;
while(q.front != q.rear)
{
i++;
q.front = q.front->next;
}
return i;
}
int inqueue(LinkQueue *q,char num[],char t[])//入隊
{
QueueNode node = (QueueNode)malloc(sizeof(struct QueueNode));
if(NULL == node)
{
return 0;
}
strcpy(node->data.number,num);
strcpy(node->data.time,t);
node->next = NULL;
q->rear->next = node;
q->rear = node;
return 1;
}
int outqueue(LinkQueue *q,char *num,char *t)//出隊
{
if(q->front == q->rear)
{
return 0;
}
strcpy(num,q->front->next->data.number);
strcpy(t,q->front->next->data.time);
QueueNode temp = q->front->next;//存放待刪除結點的地址
q->front->next = q->front->next->next;
if(temp->next == NULL)//只剩下頭尾兩個結點的情況,刪除尾結點,把頭尾指針都指向頭結點
{
q->rear = q->front;
}
free(temp);
return 1;
}
int push(LinkStack *s,char num[],char t[])//入棧
{
StackNode node = (StackNode)malloc(sizeof(struct stack));
if(node==NULL)
{
return 0;
}
strcpy(node->data.number,num);
strcpy(node->data.time,t);
node->next = s->top;
s->top = node;
s->count++;
return 1;
}
int pop(LinkStack *s,char *num,char *t)//出棧
{
if(s->count==0)
{
return 0;
}
strcpy(num,s->top->data.number);
strcpy(t,s->top->data.time);
StackNode temp = s->top;
s->top = s->top->next;
free(temp);
s->count--;
return 1;
}
void inpark(LinkQueue *road,LinkStack *park,LinkStack *move)//停車場入車
{
int s=0;
char num[10];
char t[10];
int flag;
StackNode p;
QueueNode r;
do
{
flag=0;
p=park->top;
r=road->front;
printf("請輸入入場車輛的車牌號:");
scanf("%s",num);
while(p!=NULL)
{
if(strcmp(p->data.number,num)==0)//檢查停車場里是否已存在相同車牌號的汽車
{
flag=1;
printf("停車場已存在相同車牌號的汽車,請檢查車牌號輸入是否正確!\n");
}
p=p->next;
}
while(r->next!=NULL)
{
if(strcmp(r->next->data.number,num)==0)//檢查停車場里是否已存在相同車牌號的汽車
{
flag=1;
printf("等候區(qū)已存在相同車牌號的汽車,請檢查車牌號輸入是否正確!\n");
}
r=r->next;
}
}while(flag==1);
while(1)
{
printf("請輸入汽車入場時間(格式hh:ss):");
scanf("%s",t);
if((t[0]-'0')>=2 && (t[1]-'0')>3 || t[2]!=':' || (t[3]-'0')>=6&& (t[4]-'0')>=0)
printf("請按正確的格式輸入入場時間!\n");
else
break;
}
if( park->count >=parkcount)//停車場內車已停滿
{
printf("停車場已滿,進入等待區(qū)!\n");
inqueue(road,num,t);//進入便道等候區(qū)
printf("請按任意鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
else
{
push(park,num,t);//入棧
printf("該車已進入停車場%d號車道\n",park->count);
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
}
void outpark(LinkQueue *road,LinkStack *park,LinkStack *move)//停車場出車
{
char num[10],snum[10];
char t[10],st[10];
StackNode p=park->top;
StackNode m=move->top;
int stay;
int flag=0;//標記
int f=0;//標記
int i;
do
{
flag=0;
p=park->top;
printf("請輸入出場汽車車牌:");
scanf("%s",num);
while(p!=NULL)
{
if(strcmp(p->data.number,num)==0)//檢查停車場里是否已存在相同車牌號的汽車
flag=1;
p=p->next;
}
if(flag==0)
{
printf("停車場內不存在該車牌,請確認輸入的車牌號是否正確!\n");
printf("按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
}while(flag==0);
while(park->top!=NULL)
{
pop(park,snum,st);
push(move,snum,st);
if(strcmp(snum,num)==0)
{
pop(move,snum,st);
while(1)
{
printf("請輸入汽車出場時間(格式hh:ss):");
scanf("%s",t);
if((t[0]-'0')>=2 && (t[1]-'0')>3 || t[2]!=':' || (t[3]-'0')>=6 && (t[4]-'0')>=0)
printf("請按正確的格式輸入出場時間!\n");
else if((t[0]-'0')*10+(t[1]-'0')<=(st[0]-'0')*10+(st[1]-'0') && (t[3]-'0')*10+(t[4]-'0')<(st[3]-'0')*10+(st[4]-'0'))//當出場時間大于入場時間
printf("出場時間不得早與入場時間!\n");
else
break;
}
for(i=0;i<=strlen(vipcar);i++)
{
if(strcmp(num,vipcar[i])==0)
f=1;
}
if(f==1)
{
printf("該車為vip車輛,享受八折優(yōu)惠!\n");
stay=((t[0]-'0')*10+(t[1]-'0')-(st[0]-'0')*10-(st[1]-'0'))*60+((t[3]-'0')*10+(t[4]-'0')-(st[3]-'0')*10-(st[4]-'0'));//停留時間
printf(" 收 據(jù)\n");
printf("================================ 車牌號: %s===============================\n",num);
printf("=========================================================================\n");
printf("|進車場時刻 | 出車場時刻 | 停留時間(分鐘) | 應付(元)|\n");
printf("| %s | %s | %d | %d\n",st,t,stay,(stay%60?(stay/60)*tick+tick:(stay/60)*tick)*4/5);
printf("注:不足一小時按一小時計算\n");
printf("=========================================================================\n");
}
else
{
stay=((t[0]-'0')*10+(t[1]-'0')-(st[0]-'0')*10-(st[1]-'0'))*60+((t[3]-'0')*10+(t[4]-'0')-(st[3]-'0')*10-(st[4]-'0'));//停留時間
printf(" 收 據(jù)\n");
printf("================================ 車牌號: %s===============================\n",num);
printf("=========================================================================\n");
printf("|進車場時刻 | 出車場時刻 | 停留時間(分鐘) | 應付(元)|\n");
printf("| %s | %s | %d | %d\n",st,t,stay,stay%60?(stay/60)*tick+tick:(stay/60)*tick);
printf("注:不足一小時按一小時計算\n");
printf("=========================================================================\n");
}
while(move->count)
{
pop(move,snum,st);
push(park,snum,st);
}
if(road->front != road->rear )//等候區(qū)存在車輛
{
outqueue(road,snum,st);
push(park,snum,st);
}
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
return;
}
}
printf("未找到此車牌的汽車\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
void view(LinkQueue *road,LinkStack *park,LinkStack *move)//查看停車場狀態(tài)
{
char num[10];
char t[10];
QueueNode r=road->front;
StackNode p=park->top;
printf("停車場中有%d輛汽車,車牌號分別是:",park->count);
while(p!=NULL)
{
if(p->next==NULL)
printf("%s",p->data.number);
else
printf("%s,",p->data.number);
p=p->next;
}
printf("\n");
printf("等候區(qū)中有%d輛汽車,車牌號分別是:",linklength(*road));
while(r->next!=NULL)
{
if(r->next->next==NULL)
printf("%s",r->next->data.number);
else
printf("%s,",r->next->data.number);
r=r->next;
}
printf("\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
void query(LinkQueue *road,LinkStack *park,LinkStack *move)
{
int s;
StackNode p=park->top;
char num[10];
char t[10];
printf("1.查詢停車場全部車輛入場時間\n");
printf("2.查詢某輛車的入場時間\n");
printf("0.返回\n");
printf("請輸入序號:");
scanf("%d",&s);
if(s==1)
{
printf("車牌號 入場時間\n");
while(p!=NULL)
{
printf("%s",p->data.number);
printf(" ");
printf("%s",p->data.time);
printf("\n");
p=p->next;
}
p=park->top;//初始化
}
else if(s==2)
{
printf("請輸入查詢汽車的車牌號:");
scanf("%s",num);
while(p!=NULL)
{
if(strcmp(p->data.number,num)==0)
{
printf("入場時間:%s",p->data.time);
break;
}
p=p->next;
}
}
else if(s==0)
{
system("cls");
menu(road,park,move,num,t);
}
printf("\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
void add(LinkQueue *road,LinkStack *park,LinkStack *move)
{
int s;
char num[10];
char t[10];
int i;
printf("請輸入要新增的車位:");
scanf("%d",&s);
parkcount=parkcount+s;
for(i=0;i<s;i++)
{
outqueue(road,num,t);
push(park,num,t);
}
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
void vip(LinkQueue *road,LinkStack *park,LinkStack *move)
{
int s;
int i;
int flag=0;
char num[10];
char t[10];
printf("1.購買vip 2.查詢全部vip車輛 3.查詢某輛汽車是否vip\n");
scanf("%d",&s);
if(s==1)
{
do
{
flag=0;
if(flag==0)
{
printf("請輸入購買vip的車牌號:");
scanf("%s",num);
}
for(i=0;i<strlen(vip);i++)
{
if(strcmp(vipcar[i],num)==0)
{
printf("此車牌號已是vip,不可重復購買\n");
flag=1;
}
}
}while(flag==1);
strcpy(vipcar[vipcount],num);
vipcount++;
printf("購買成功!\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
else if(s==2)
{
printf("vip車牌號:");
for(i=0;i<=strlen(vipcar);i++)
{
if(i==strlen(vipcar))
printf("%s",vipcar[i]);
else
printf("%s,",vipcar[i]);
}
printf("\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
else if(s==3)
{
printf("請輸入待查詢的車牌號:");
scanf("%s",num);
for(i=0;i<=strlen(vipcar);i++)
{
if(strcmp(vipcar[i],num)==0)
{
printf("是\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
return;
}
}
printf("否\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
}
void money(LinkQueue *road,LinkStack *park,LinkStack *move)
{
char num[10];
char t[10];
printf("請輸入要修改的票價:");
scanf("%d",&tick);
printf("修改成功\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu(road,park,move,num,t);
}
int main()
{
LinkQueue road;//便道
LinkStack park;//停車場通道
LinkStack move;//移動車輛
char num[10];
char t[10];
init(&road,&park,&move);
menu(&road,&park,&move,num,t);
return 0;
}
項目三 家譜管理
項目簡介:
家譜(或稱族譜)是一種以表譜形式,記載一個以血緣關系為主體的家族世系繁衍和重要人物事跡的特殊圖書體裁。家譜是中國特有的文化遺產,是中華民族的三大文獻(國史,地志,族譜)之一,屬珍貴的人文資料,對于歷史學、民俗學、人口學、社會學和經濟學的深入研究,均有其不可替代的獨特功能。本項目對家譜管理進行簡單的模擬。
數(shù)據(jù)要求:
每個成員信息包括:代目、姓名、性別、生日、住址、婚否、是否健在、死亡日期(如果已死亡)。
功能要求:
至少包含下列基本功能,可增加功能計入加分項,缺少功能減分
1:顯示家譜信息,統(tǒng)計代目和總人數(shù)。
2:顯示第n代所有人的信息。
3:根據(jù)姓名查找顯示成員信息。
4:添加家譜成員。
5:刪除家譜成員。
6:修改成員信息。
界面要求:
根據(jù)系統(tǒng)功能要求設計。應有合理的提示,每個功能可以設立菜單,根據(jù)提示,可以完成相關的功能要求。
設計思路:
本項目的實質是完成對家譜成員信息的建立、查找、插入、修改、刪除等功能,可以首先定義家族成員的數(shù)據(jù)結構,將家譜的樹型結構轉換為二叉樹存儲。然后將每個功能寫成一個函數(shù)來完成對數(shù)據(jù)的操作,最后完成主函數(shù)以驗證各個函數(shù)功能并得出運行結果。
數(shù)據(jù)結構:
因為家族中的成員之間存在一個對多個的層次結構關系,家譜從形狀上看像一顆倒長的樹,所以用樹結構來表示家譜比較適合。樹型結構是一類非常重要的非線性數(shù)據(jù)結構,直觀看來,樹是以分支關系定義的層次結構??梢远骀湵碜鳛闃涞拇鎯Y構。鏈表中的兩個鏈域分別指向該結點的第一個孩子結點和下一個兄弟結點,固該表示法又稱二叉樹表示法,或孩子兄弟表示法。孩子兄弟表示法是一種鏈式存儲結構,它通過描述每個結點的一個孩子和兄弟信息來反映結點之間的層次關系,其具體的結點結構為:
firstChild |
data |
nextSibling |
其中,firstchild為指向該結點第一個孩子的指針,nextsibling為指向該結點下一個兄弟,elem是數(shù)據(jù)元素內容,舉例如下:
其存儲形式定義如下:
typedef struct CSLinklist{
??????? Elemtype data;
??????? struct CSLinklist *firstchild,*nextsibling;
??? } CSLinklist,*CSTree;
模塊功能:
??????
數(shù)據(jù)結構:
??typedef struct data{
??? char name[20];
??? char birthday[20];
?? ?int sex;//0女生,1男生
??? int marry;//0未婚,1已婚
??? char address[20];
??? char death_date[20];
??? int generation;//第幾代
}data;
typedef struct node{
??? data person;
??? struct node *lchild,*rbrother;
}node,*tree;
typedef struct{?? //循環(huán)隊列的定義
??? tree queue[100];
??? int front,rear;
}queue;
函數(shù):
int countnum(tree T); //計算共有幾人
int BirthdayPreOrderTraverse(tree T);//查找生日前序遍歷
int NamePreOrderTraverse(tree T,char name[20]);//查找姓名前序遍歷
int AddPreOrderTraverse(tree T,char name[20]);//添加孩子前序遍歷
void printfinfo(tree p);//打印結點信息
void Qinit(queue *Q);//初始化隊列
void inqueue(queue *Q,tree e);//入隊
void outqueue(queue *Q,tree *e);//出隊
int empty(queue Q);//判隊空
int full(queue Q);//判隊滿
int TreeDepth(tree T);//返回二叉樹深度
void Tinit();//初始化二叉樹
void today_birthday();//顯示今天生日的成員
void show();//顯示家譜
void shownum();//顯示第幾代人的信息
void lookupname();// 根據(jù)姓名查找成員
void Addchildren();//為成員添加孩子
void deletemember();//刪除成員
void modifymember();//修改成員信息
void determinemember();//確定成員的關系
程序截圖:
源碼 :
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
typedef struct data{
char name[20];
char birthday[20];
int sex;//0女生,1男生
int marry;//0未婚,1已婚
char address[20];
char death_date[20];
int generation;//第幾代
}data;
typedef struct node{
data person;
struct node *lchild,*rbrother;
}node,*tree;
typedef struct{ //循環(huán)隊列的定義
tree queue[100];
int front,rear;
}queue;
tree BT;
int count=0;
int flag=0;//標記
int countnum(tree T); //計算共有幾人
int BirthdayPreOrderTraverse(tree T);//查找生日前序遍歷
int NamePreOrderTraverse(tree T,char name[20]);//查找姓名前序遍歷
int AddPreOrderTraverse(tree T,char name[20]);//添加孩子前序遍歷
void printfinfo(tree p);//打印結點信息
void Qinit(queue *Q);//初始化隊列
void inqueue(queue *Q,tree e);//入隊
void outqueue(queue *Q,tree *e);//出隊
int empty(queue Q);//判隊空
int full(queue Q);//判隊滿
int TreeDepth(tree T);//返回二叉樹深度
void Tinit();//初始化二叉樹
void today_birthday();//顯示今天生日的成員
void show();//顯示家譜
void shownum();//顯示第幾代人的信息
void lookupname();// 根據(jù)姓名查找成員
void Addchildren();//為成員添加孩子
void deletemember();//刪除成員
void modifymember();//修改成員信息
void determinemember();//確定成員的關系
void menu();
int countnum(tree T) //計算共有幾人
{
if (T == NULL)
{
return 0;
}
else
{
count++;
countnum(T->lchild);
countnum(T->rbrother);
}
}
int BirthdayPreOrderTraverse(tree T)//查找生日前序遍歷
{
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
int m=0;
int d=0;
if (T == NULL)
{
return 0;
}
else
{
m=(T->person.birthday[5]-'0')*10+(T->person.birthday[6]-'0');
d=(T->person.birthday [8]-'0')*10+(T->person.birthday[9]-'0');
if(m==1+p->tm_mon && d==p->tm_mday)
{
flag=1;
printf("%s ",T->person.name);
}
BirthdayPreOrderTraverse(T->lchild);
BirthdayPreOrderTraverse(T->rbrother);
}
}
int NamePreOrderTraverse(tree T,char name[20])//查找姓名前序遍歷
{
if (T == NULL)
{
return 0;
}
else
{
if(strcmp(name,T->person.name)==0)
{
flag=1;
printf("此人為家譜第%d代成員,其信息為:\n",T->person.generation);
printfinfo(T);
printf("他的孩子信息為:\n");
if(T->lchild)
{
T=T->lchild;
printfinfo(T);
while(T->rbrother)
{
T=T->rbrother;
printfinfo(T);
}
}
}
NamePreOrderTraverse(T->lchild,name);
NamePreOrderTraverse(T->rbrother,name);
}
}
int AddPreOrderTraverse(tree T,char name[20])//添加孩子前序遍歷
{
tree p=(tree)malloc(sizeof(struct node));
int num;//孩子排行
int i;
if (T == NULL)
{
return 0;
}
else
{
if(strcmp(name,T->person.name)==0)
{
flag=1;
printf("請輸入添加孩子的排行(從1開始計數(shù)):");
scanf("%d",&num);
if(T->lchild)//如果左孩子存在
{
p->person.generation=T->person.generation+1;
if(num==1)//排行第一代 ,則把結點放在父結點的左孩子
{
p->rbrother=T->lchild;
T->lchild=p;
}
else
{
num--;
T=T->lchild;
num--;//排在第幾代需取第幾代前一代的數(shù)
while(T->rbrother && num>0)
{
T=T->rbrother;
num--;
}
p->rbrother=T->rbrother;
T->rbrother=p;
}
}
else//左孩子不存在先創(chuàng)建左孩子
{
p->person.generation=T->person.generation+1;
T->lchild=p;
}
printf("請輸入添加孩子的姓名:");
scanf("%s",&p->person.name);
do
{
if(strlen(p->person.birthday)!=10 && strlen(p->person.birthday)!=0)
printf("請輸入正確的日期格式\n");
printf("請輸入添加孩子的出生年月(格式形如: 2020-01-01):");
scanf("%s",&p->person.birthday);
} while(strlen(p->person.birthday)!=10);
printf("請輸入添加孩子的家庭住址:");
scanf("%s",&p->person.address);
printf("請輸入添加孩子的婚姻狀況 0/1 (0表示未婚,1表示已婚):");
scanf("%d",&p->person.marry);
printf("請輸入添加孩子的去世時間 (在世填0-0-0):");
scanf("%s",&p->person.death_date);
printf("請輸入添加孩子的性別 0/1 (0表示女,1表示男):");
scanf("%d",&p->person.sex);
}
AddPreOrderTraverse(T->lchild,name);
AddPreOrderTraverse(T->rbrother,name);
}
}
int DeletePreOrderTraverse(tree T,char name[20])//刪除孩子前序遍歷
{
if(strcmp(name,BT->person.name)==0)//刪除根節(jié)點情況
{
flag=1;
if(BT->rbrother!=NULL)//根結點不存在右兄弟
{
BT=BT->rbrother;
return 0;
}
else if(BT->rbrother==NULL)//根節(jié)點存在右兄弟
{
BT=NULL;
return 0;
}
}
if (T == NULL)
{
return 0;
}
else
{
if(T->lchild!=NULL)
if(strcmp(name,T->lchild->person.name)==0)//當前結點的左孩子
{
flag=1;
T->lchild=T->lchild->rbrother;//當前結點左孩子等于左孩子的右兄弟
}
if(T->rbrother!=NULL)
if(strcmp(name,T->rbrother->person.name)==0)
{
flag=1;
T->rbrother=T->rbrother->rbrother;
}
DeletePreOrderTraverse(T->lchild,name);
DeletePreOrderTraverse(T->rbrother,name);
}
}
int modifyPreOrderTraverse(tree T,char name[20])//修改成員信息前序遍歷
{
int num;
if (T == NULL)
{
return 0;
}
else
{
if(strcmp(name,T->person.name)==0)
{
flag=1;
printf("請選擇要修改%s的哪項數(shù)據(jù):\n",T->person.name);
printf("1.修改姓名\n");
printf("2.修改出生年月\n");
printf("3.修改家庭住址\n");
printf("4.修改婚姻狀況\n");
printf("5.修改在世情況\n");
printf("6.修改性別\n");
printf("7.返回上一級\n");
scanf("%d",&num);
switch(num)
{
case 1:
printf("請輸入修改后的姓名:");
scanf("%s",T->person.name);
break;
case 2:
do
{
if(strlen(T->person.birthday)!=10 && strlen(T->person.birthday)!=0)
printf("請輸入正確的日期格式\n");
printf("請輸入修改后的出生年月(格式形如: 2020-01-01):");
scanf("%s",&T->person.birthday);
} while(strlen(T->person.birthday)!=10);
break;
case 3:
printf("請輸入修改后的家庭住址:");
scanf("%s",T->person.address);
break;
case 4:
printf("請輸入修改后的婚姻狀況(0未婚,1已婚):");
scanf("%d",&T->person.marry) ;
break;
case 5:
printf("請輸入修改后的在世情況(在世填0-0-0):");
scanf("%d",&T->person.death_date);
break;
case 6:
printf("請輸入修改后的性別(0女生,1男生):");
scanf("%d",&T->person.sex);
break;
case 7:
return 0;
}
}
modifyPreOrderTraverse(T->lchild,name);
modifyPreOrderTraverse(T->rbrother,name);
}
}
int deterPreOrderTraverse(tree T,char name[20],int *gen)//確定成員的關系前序遍歷
{
if (T == NULL)
{
return 0;
}
else
{
if(strcmp(name,T->person.name)==0)
{
flag=1;
*gen=T->person.generation;
}
deterPreOrderTraverse(T->lchild,name,gen);
deterPreOrderTraverse(T->rbrother,name,gen);
}
}
void printfinfo(tree p)//打印結點信息
{
printf("%s ",p->person.name);
printf("出生于:%s ",p->person.birthday);
printf("%s ",p->person.address);
if(p->person.marry==1)
printf("已婚 ");
else
printf("未婚 ");
if(p->person.sex==1)
printf("男 ");
else
printf("女 ");
if(strcmp(p->person.death_date,"0-0-0")==0)
printf("健在\n");
else
printf("死亡日期:%s\n",p->person.death_date);
}
void new_left(tree p,data d)//創(chuàng)建左孩子
{
tree q=(tree)malloc(sizeof(node));
q->person=d;
q->lchild=q->rbrother=NULL;
p->lchild=q;
}
void new_right(tree p,data d)//創(chuàng)建右兄弟
{
tree q=(tree)malloc(sizeof(node));
q->person=d;
q->lchild=q->rbrother=NULL;
p->rbrother=q;
}
int Generation(tree T)//返回代數(shù)
{
if(T==NULL)
return 0;
if(T)
return Generation(T->lchild)+1;
}
void Tinit()//初始化二叉樹
{
data initdata[10]={{"A","1960-06-12",1,1,"廈門集美","2019-10-01",1},
{"B","1980-06-12",1,1,"廈門集美","0-0-0",2},
{"C","1981-06-18",1,1,"廈門集美","0-0-0",2},
{"D","1982-06-12",1,1,"廈門集美","0-0-0",2},
{"E","2021-06-12",1,1,"廈門集美","0-0-0",3},
{"F","2021-06-12",1,1,"廈門集美","0-0-0",3},
{"G","2021-06-12",1,1,"廈門集美","0-0-0",3},
{"H","2021-06-12",1,1,"廈門集美","0-0-0",3},
{"I","2021-06-12",1,1,"廈門集美","0-0-0",3},
{"J","2021-06-12",1,1,"廈門集美","0-0-0",3}
};
BT=(tree)malloc(sizeof(node));
BT->person=initdata[0];
BT->lchild=BT->rbrother=NULL;
new_left(BT,initdata[1]);
new_left(BT->lchild,initdata[4]);
new_right(BT->lchild->lchild,initdata[5]);
new_right(BT->lchild->lchild->rbrother,initdata[7]);
new_right(BT->lchild,initdata[2]);
new_left(BT->lchild->rbrother,initdata[6]);
new_right(BT->lchild->rbrother->lchild,initdata[8]);
new_right(BT->lchild->rbrother,initdata[3]);
new_left(BT->lchild->rbrother->rbrother,initdata[9]);
}
void today_birthday()//顯示今天生日的成員
{
flag=0;
time_t timep;
struct tm *p;
time (&timep);
p=gmtime(&timep);
printf("今天日期是%d-%d,今天生日成員:",1+p->tm_mon,p->tm_mday);
BirthdayPreOrderTraverse(BT);
printf("\n");
if(flag==0)
printf("家譜中沒有成員過生日\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void show()//顯示家譜
{
queue *q=(queue *)malloc(sizeof(queue));
q->front=q->rear=0;
count=0;
if(BT!=NULL)//計算BT共有多少人
countnum(BT);
system("cls");
printf("共計%d代,%d人\n",Generation(BT),count);
printf("\n");
int d=1;
tree p=BT;
tree n=(tree)malloc(sizeof(struct node));//分隔符
strcpy(n->person.name,"NULL");
n->lchild=n->rbrother=NULL;
if(p)
{
printf("第1代\n");
q->queue[q->rear++]=p;//根結點入隊
while(p->rbrother)//把根結點所有右兄弟入隊
{
p=p->rbrother;
q->queue[q->rear++]=p;
}
q->queue[q->rear++]=n;//分隔符入隊
while(q->front!=q->rear)//隊列不為空
{
p=q->queue[q->front++];//取隊頭結點
if(strcmp(p->person.name,"NULL")==0 && q->front!=q->rear)//為分割號表示一代結束
{
printf("第%d代\n",++d);
q->queue[q->rear++]=n;//加入分割號區(qū)分代各代
}
else if(q->front!=q->rear)
{
printfinfo(p);
}
if(p->lchild) //如果左孩子存在
{
p=p->lchild;
q->queue[q->rear++]=p;//把左孩子所有右兄弟入隊,表示一代
while(p->rbrother)
{
p=p->rbrother;
q->queue[q->rear++]=p;
}
}
}
}
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void shownum()//顯示第幾代人
{
int num;
printf("請輸入需要查詢的第幾代人:");
scanf("%d",&num);
queue *q=(queue *)malloc(sizeof(queue));
q->front=q->rear=0;
system("cls");
int d=1;
tree p=BT;
tree n=(tree)malloc(sizeof(struct node));//分隔符
strcpy(n->person.name,"NULL");
n->lchild=n->rbrother=NULL;
if(p)
{
q->queue[q->rear++]=p;//根結點入隊
while(p->rbrother)//把根結點所有右兄弟入隊
{
p=p->rbrother;
q->queue[q->rear++]=p;
}
q->queue[q->rear++]=n;//分隔符入隊
while(q->front!=q->rear)//隊列不為空
{
p=q->queue[q->front++];//取隊頭結點
if(strcmp(p->person.name,"NULL")==0 && q->front!=q->rear)//為分割號表示一代結束
{
d++;
q->queue[q->rear++]=n;//加入分割號區(qū)分代各代
}
else if(q->front!=q->rear && num==d)
{
printfinfo(p);
}
if(p->lchild) //如果左孩子存在
{
p=p->lchild;
q->queue[q->rear++]=p;//把左孩子所有右兄弟入隊,表示一代
while(p->rbrother)
{
p=p->rbrother;
q->queue[q->rear++]=p;
}
}
}
}
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void Addchildren() //為成員添加孩子
{
char name[20];
printf("請輸入要添加孩子成員的姓名:");
scanf("%s",name);
flag=0;
AddPreOrderTraverse(BT,name);
if(flag==0)
printf("沒有這個人\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void lookupname()//根據(jù)姓名查找成員
{
char name[20];
flag=0;
printf("請輸入要查詢人的姓名:");
scanf("%s",name);
NamePreOrderTraverse(BT,name);
if(flag==0)
printf("對不起,找不到此人的信息\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void deletemember()//刪除成員
{
flag=0;
char name[20];
printf("請輸入要刪除成員的姓名:");
scanf("%s",name);
DeletePreOrderTraverse(BT,name);
if(flag==0)
printf("對不起,找不到此人的信息\n");
else
printf("刪除成功!");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void modifymember()//修改成員信息
{
flag=0;
char name[20];
printf("請輸入要修改人的姓名:");
scanf("%s",name);
modifyPreOrderTraverse(BT,name);
if(flag==0)
printf("對不起,找不到此人的信息\n");
else
printf("修改成功!\n");
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void determinemember()//確定成員的關系
{
int i;
int firstgen=0;//第一個人代數(shù)
int secondgen=0;//第二個人代數(shù)
char name1[20],name2[20];
flag=0;
printf("請輸入第一個人的姓名:");
scanf("%s",name1);
deterPreOrderTraverse(BT,name1,&firstgen);
if(flag==0)
printf("家譜無此人,請重新進入!\n");
else
{
flag=0;
printf("請輸入第二個人的姓名:");
scanf("%s",name2);
deterPreOrderTraverse(BT,name2,&secondgen);
if(flag==0)
printf("家譜無此人,請重新進入!\n");
else
if(secondgen>firstgen)
{
printf("%s比%s大%d輩\n",name1,name2,secondgen-firstgen);
for(i=0;i<secondgen-firstgen;i++)
{
}
}
else if(secondgen<firstgen)
printf("%s比%s小%d輩\n",name1,name2,firstgen-secondgen);
else if(secondgen==firstgen)
printf("%s和%s同輩\n",name1,name2);
}
printf("請按回車鍵繼續(xù)...");
getchar();
getchar();
system("cls");
menu();
}
void menu()
{
int num;
printf("\n");
printf(" 歡迎進入家譜管理系統(tǒng)\n");
printf(" 1.顯示今天生日成員 2.顯示家譜\n");
printf(" 3.顯示第n代所有人的信息 4.根據(jù)姓名查找成員\n");
printf(" 5.為成員添加孩子 6.刪除成員\n");
printf(" 7.修改成員信息 8.確定兩個人的關系\n");
printf(" 0.退出程序\n");
do
{
printf("請輸入序號:");
scanf("%d",&num);
switch(num)
{
case 0:
exit(1);
case 1:
today_birthday();
break;
case 2:
show();
break;
case 3:
shownum();
break;
case 4:
lookupname();
break;
case 5:
Addchildren();
break;
case 6:
deletemember();
break;
case 7:
modifymember();
break;
case 8:
determinemember();
break;
default:printf("請輸入正確的序號!\n");
}
}while(num!=0 && num!=1 && num!=2 && num!=3 && num!=4 && num!=5 && num!=6 && num!=7 && num!=8);
}
int main()
{
Tinit();//初始化二叉樹
menu();
return 0;
}
項目四 校園導游系統(tǒng)
項目簡介:
設計一個校園地圖導游程序,提供景點增刪改查等信息查詢服務。
數(shù)據(jù)要求:
根據(jù)學校平面圖,選擇不少于10個景點。根據(jù)地圖位置,模擬各景點位置和景點間路徑,存儲路徑長度。校園內各景點信息包括:景點編號、名稱、簡介等信息。
功能要求:
至少包含下列基本功能,可增加功能計入加分項,缺少功能減分
1:提供圖中任意景點相關信息的查詢。
2:新增景點信息和路徑信息。
3:修改景點信息。
4:刪除景點信息。
5:求一個景點到所有景點的最短路徑。
6:求任意的兩個景點之間的最短路徑。
界面要求:
根據(jù)以下廈門理工學院地圖,抽象出各個景點(至少10個)以及其大體距離和位置關系,模擬出系統(tǒng)的地圖信息。
要求顯示模擬的地圖,設計合理的查詢界面和功能菜單。
廈門理工學院地圖(可自行百度地圖查看)
設計思路:
本項目的實質是對帶權圖的操作,包含對圖頂點和邊的增刪改查,以及最短路徑問題應用。最短路徑不僅僅指一般地理意義上的距離最短,還可以引申到其他的度量,如時間、費用、線路容量等。相應地,最短路徑問題就成為最快路徑問題、最低費用問題等。最優(yōu)路徑問題不僅包括最短路徑問題,還有可能涉及到最少時間問題、最少收費(存在收費公路)問題、或者是幾個問題的綜合,這時將必須考慮道路級別、道路流量、道路穿越代價(如紅燈平均等待時間)等諸多因素。但是必須指出的是,一般來說最優(yōu)路徑在距離上應該是最短的,但最短路徑在行駛時間和能源消耗的意義上未必是最優(yōu)的。其實,無論是距離最短、時間最快還是費用最低,它們的核心算法都是最短路徑算法。
數(shù)據(jù)結構:
帶權無向圖存儲可采用鄰接矩陣或者鄰接表結構存儲。
模塊功能:
??????
數(shù)據(jù)結構:
??typedef struct
{
?? int num;
?? char name[20];
?? char info[50];
}data;
typedef struct
{
?? data vexs[max];//結點
?? int arcs[max][max];//鄰接矩陣
?? int vexnum,arcnum;//結點數(shù),邊數(shù)
}MGrapt;
函數(shù):
void initG();// 初始化圖
void menu();//顯示菜單
void queryinfo();//景點信息查詢
void addinfo();//新增景點信息
void modifyinfo();//修改景點和道路信息
void deleteinfo();//刪除景點和道路信息
void Pathquery();//求任意兩點的路徑查詢
void onetoallpath();//求一個到所有的最短路徑
void twopath();//求兩個之間的最短路徑
void netting();//最佳布網(wǎng)方案
void ergodic();// 求任意一點走遍全校最短路徑
程序截圖:
文章來源:http://www.zghlxwxcb.cn/news/detail-485077.html
源碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-485077.html
#include<stdio.h>
#include<string.h>
#define max 100
typedef struct
{
int num;
char name[20];
char info[50];
}data;
typedef struct
{
data vexs[max];//結點
int arcs[max][max];//鄰接矩陣
int vexnum,arcnum;//結點數(shù),邊數(shù)
}MGrapt;
int DFSvisited[max]={0};//結點訪問標記
int DFSsave[max]={0};
int djsave[max];
int count;
int shortlength[max];
int primqueue[max]={0};
int s;
MGrapt TG;//理工地圖
int Infinity=65536;//無窮大
void initG();// 初始化圖
void menu();//顯示菜單
void queryinfo();//景點信息查詢
void addinfo();//新增景點信息
void modifyinfo();//修改景點和道路信息
void deleteinfo();//刪除景點和道路信息
void Pathquery();//求任意兩點的路徑查詢
void onetoallpath();//求一個到所有的最短路徑
void twopath();//求兩個之間的最短路徑
void netting();//最佳布網(wǎng)方案
void ergodic();// 求任意一點走遍全校最短路徑
void initG()// 初始化圖
{
int i,j;
TG.vexnum=14;//14個結點
TG.arcnum=20;//20條邊
data temp[100]={{1,"北門","這里是北門"},
{2,"一期食堂","這里是一期食堂"},
{3,"舊操場","這里是舊操場"},
{4,"明理9","這里是明理9"},
{5,"博學苑","這里是博學苑"},
{6,"藝術會堂","這里是藝術會堂"},
{7,"醫(yī)務室","這里是醫(yī)務室"},
{8,"風洞實驗室","這里是風洞實驗室"},
{9,"創(chuàng)新創(chuàng)業(yè)園","這里是創(chuàng)新創(chuàng)業(yè)園"},
{10,"計算機學院","這里是計算機與信息工程學院"},
{11,"材料學院","這里是材料科學與工程學院"},
{12,"圖書館","這里是圖書館"},
{13,"新操場","這里是新操場"},
{14,"體育館","這里是體育館"},
};
for(i=0;i<TG.vexnum;i++)
TG.vexs[i]=temp[i];
for(i=0;i<TG.vexnum;i++)
TG.arcs[i][i]=Infinity;
for(i=0;i<max;i++)//鄰接矩陣所有元素初始化為無窮大 ,無路徑就為無窮大
for(j=0;j<max;j++)
TG.arcs[i][j]=Infinity;
TG.arcs[0][1]=140;
TG.arcs[0][2]=176;
TG.arcs[1][3]=276;
TG.arcs[2][5]=310;
TG.arcs[2][13]=184;
TG.arcs[3][4]=110;
TG.arcs[3][6]=224;
TG.arcs[4][5]=100;
TG.arcs[5][6]=230;
TG.arcs[5][7]=150;
TG.arcs[5][10]=210;
TG.arcs[5][11]=240;
TG.arcs[6][8]=180;
TG.arcs[6][7]=203;
TG.arcs[7][8]=176;
TG.arcs[8][9]=146;
TG.arcs[9][10]=120;
TG.arcs[10][12]=500;
TG.arcs[11][12]=337;
TG.arcs[12][13]=157;
for(i=0;i<TG.vexnum;i++)
for(j=0;j<TG.vexnum;j++)
TG.arcs[j][i]=TG.arcs[i][j];
}
void menu()
{
int num;
do
{
printf("\n");
printf("************歡迎使用廈門理工學院導游咨詢系統(tǒng)***********");
printf("\n");
printf(" 1.景點信息查詢\n");
printf(" 2.新增景點信息\n");
printf(" 3.修改景點和道路信息\n");
printf(" 4.刪除景點和道路信息\n");
printf(" 5.任意兩個景點的路徑查詢\n");
printf(" 6.求一個景點到所有景點的最短路徑\n");
printf(" 7.求任意兩個景點之間的最短路徑\n");
printf(" 8.最佳布網(wǎng)方案\n");
printf(" 0.退出系統(tǒng)\n");
printf("*******************************************************\n");
printf("請輸入序號:");
scanf("%d",&num);
if(num!=0 && num!=1 && num!=2 && num!=3 && num!=4 && num!=5 && num!=6 && num!=7 && num!=8)
{
system("cls");
printf("請輸入正確的序號!");
}
}while(num!=0 && num!=1 && num!=2 && num!=3 && num!=4 && num!=5 && num!=6 && num!=7 && num!=8);
switch(num)
{
case 0: exit(0);
case 1: queryinfo();break;
case 2: addinfo();break;
case 3: modifyinfo();break;
case 4: deleteinfo();break;
case 5: Pathquery();break;
case 6: onetoallpath();break;
case 7: twopath();break;
case 8: netting();break;
// case 9:
}
}
void queryinfo()//景點信息查詢
{
int num;
int i,j;
int flag=0;
char name[20];
system("cls");
do
{
printf("\n");
printf(" 1:按照景點編號查詢\n");
printf(" 2:按照景點名稱查詢\n");
printf(" 3:列出所有景點和道路信息\n");
printf(" 0:返回上一級\n");
printf("請輸入序號:");
scanf("%d",&num);
if(num!=0 && num!=1 && num!=2 && num!=3 )
{
system("cls");
printf("請輸入正確的序號!");
}
}while(num!=0 && num!=1 && num!=2 && num!=3);
if(num==1)
{
flag=0;
printf("請輸入景點編號:");
scanf("%d",&num);
for(i=0;i<TG.vexnum;i++)
{
if(TG.vexs[i].num==num)
{
flag=1;
printf("景點編號:%d\n",TG.vexs[i].num);
printf("景點名稱:%s\n",TG.vexs[i].name);
printf("景點介紹:%s\n",TG.vexs[i].info);
printf("\n");
printf("該景點路徑信息:\n");
for(j=0;j<TG.vexnum;j++)
{
if(TG.arcs[i][j]!=Infinity)
printf("到景點%d--%s的距離為%d\n",TG.vexs[j].num,TG.vexs[j].name,TG.arcs[i][j]);
}
}
}
if(flag==0)
printf("對不起,無此編號!");
getchar();
getchar();
system("cls");
queryinfo();
}
else if(num==2)
{
flag=0;
printf("請輸入景點名稱:");
scanf("%s",name);
for(i=0;i<TG.vexnum;i++)
{
if(strcmp(name,TG.vexs[i].name)==0)
{
flag=1;
printf("景點編號:%d\n",TG.vexs[i].num);
printf("景點名稱:%s\n",TG.vexs[i].name);
printf("景點介紹:%s\n",TG.vexs[i].info);
printf("\n");
printf("該景點路徑信息:\n");
for(j=0;j<TG.vexnum;j++)
{
if(TG.arcs[i][j]!=Infinity)
printf("到景點%d--%s的距離為%d\n",TG.vexs[j].num,TG.vexs[j].name,TG.arcs[i][j]);
}
}
}
if(flag==0)
printf("對不起,無此名稱!");
getchar();
getchar();
system("cls");
queryinfo();
}
else if(num==3)
{
printf("景點編號 景點名稱 景點介紹\n");
for(i=0;i<TG.vexnum;i++)
printf("%-16d%-16s%s\n",TG.vexs[i].num,TG.vexs[i].name,TG.vexs[i].info);
printf("\n");
printf("道路信息:\n");
for(i=0;i<TG.vexnum;i++)
{
for(j=i;j<TG.vexnum;j++)
{
if(TG.arcs[i][j]!=Infinity)
printf("景點%d--%s和景點%d--%s存在道路,距離為%d\n",TG.vexs[i].num,TG.vexs[i].name,TG.vexs[j].num,TG.vexs[j].name,TG.arcs[i][j]);
}
}
getchar();
getchar();
system("cls");
queryinfo();
}
else if(num==0)
{
system("cls");
menu();
}
}
void addinfo()//新增景點信息
{
int num;
char name[20];
char info[50];
int flag=0;
int i;
printf("請輸入待新增的景點信息:\n");
do
{
printf("景點編號:");
scanf("%d",&num);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==num)
flag=1;
if(flag==1)
{
printf("該編號已存在!");
getchar();
getchar();
system("cls");
menu();
}
}while(flag==1);
printf("景點名稱:");
scanf("%s",name);
printf("景點介紹:");
scanf("%s",info);
TG.vexs[TG.vexnum].num=num;
strcpy(TG.vexs[TG.vexnum].name,name);
strcpy(TG.vexs[TG.vexnum].info,info);
TG.vexnum++;
printf("新增景點信息成功!");
getchar();
getchar();
system("cls");
menu();
}
void modifyinfo()//修改景點和道路信息
{
int num;
char name[20];
char info[50];
int i;
int flag;
int x,y;
int first,second,length;
system("cls");
do
{
printf("\n");
printf(" 1:輸入景點編號修改景點信息\n");
printf(" 2:輸入景點名稱修改景點信息\n");
printf(" 3:修改路徑信息,如原無路徑則新增\n");
printf(" 0:返回上一級\n");
printf("請輸入序號:");
scanf("%d",&num);
if(num!=0 && num!=1 && num!=2 && num!=3)
{
system("cls");
printf("請輸入正確的序號!");
}
}while(num!=0 && num!=1 && num!=2 && num!=3);
if(num==0)
{
system("cls");
menu();
}
else if(num==1)
{
flag=0;
do
{
printf("請輸入景點編號:");
scanf("%d",&num);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==num)
{
x=i;
flag=1;
}
if(flag==0)
{
printf("對不起,無此編號!");
getchar();
getchar();
system("cls");
modifyinfo();
}
}while(flag==0);
printf("請輸入修改后的名稱:");
scanf("%s",name);
strcpy(TG.vexs[x].name,name);
printf("請輸入修改后的介紹:");
scanf("%s",info);
strcpy(TG.vexs[x].info,info);
printf("景點信息修改成功!");
getchar();
getchar();
system("cls");
modifyinfo();
}
else if(num==2)
{
flag=0;
do
{
printf("請輸入景點名稱:");
scanf("%s",name);
for(i=0;i<TG.vexnum;i++)
if(strcmp(TG.vexs[i].name,name)==0)
{
x=i;
flag=1;
}
if(flag==0)
{
printf("對不起,無此名稱!");
getchar();
getchar();
system("cls");
modifyinfo();
}
}while(flag==0);
printf("請輸入修改后的名稱:");
scanf("%s",name);
strcpy(TG.vexs[x].name,name);
printf("請輸入修改后的介紹:");
scanf("%s",info);
strcpy(TG.vexs[x].info,info);
printf("景點信息修改成功!");
getchar();
getchar();
system("cls");
modifyinfo();
}
else if(num==3)
{
flag=0;
printf("請輸入待修改的路徑信息,如無路徑則新增\n");
printf("格式形如(1-2,60),表示編號 1 2,路徑長度60:\n");
scanf("%d-%d,%d",&first,&second,&length);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==first)
{
x=i;
flag=1;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
modifyinfo();
}
flag=0;
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==second)
{
y=i;
flag=1;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
modifyinfo();
}
TG.arcs[x][y]=length;
TG.arcs[y][x]=length;
printf("修改信息成功!");
getchar();
getchar();
system("cls");
modifyinfo();
}
}
void deleteinfo()//刪除景點和道路信息
{
int num;
char name[20];
char info[50];
int i;
int flag;
int x,y;
int first,second,length;
system("cls");
do
{
printf("\n");
printf(" 1:輸入景點編號刪除景點信息\n");
printf(" 2:輸入景點名稱刪除景點信息\n");
printf(" 3:刪除道路信息\n");
printf(" 0:返回上一級\n");
printf("請輸入序號:");
scanf("%d",&num);
if(num!=0 && num!=1 && num!=2 && num!=3)
{
system("cls");
printf("請輸入正確的序號!");
}
}while(num!=0 && num!=1 && num!=2 && num!=3);
if(num==0)
{
system("cls");
menu();
}
else if(num==1)
{
flag=0;
do
{
printf("請輸入景點編號:");
scanf("%d",&num);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==num)
{
x=i;
flag=1;
}
if(flag==0)
{
printf("對不起,無此編號!");
getchar();
getchar();
system("cls");
deleteinfo();
}
}while(flag==0);
for(i=x;i<TG.vexnum;i++)
TG.vexs[i]=TG.vexs[i+1];
TG.vexnum--;
printf("景點刪除成功!");
getchar();
getchar();
system("cls");
deleteinfo();
}
else if(num==2)
{
flag=0;
do
{
printf("請輸入景點名稱:");
scanf("%s",name);
for(i=0;i<TG.vexnum;i++)
if(strcmp(TG.vexs[i].name,name)==0)
{
x=i;
flag=1;
}
if(flag==0)
{
printf("對不起,無此名稱!");
getchar();
getchar();
system("cls");
deleteinfo();
}
}while(flag==0);
for(i=x;i<TG.vexnum;i++)
TG.vexs[i]=TG.vexs[i+1];
TG.vexnum--;
getchar();
getchar();
system("cls");
deleteinfo();
}
else if(num==3)
{
flag=0;
printf("請輸入待刪除的路徑信息\n");
printf("格式形如(1-2),表示編號 1 2\n");
scanf("%d-%d,%d",&first,&second);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==first)
{
x=i;
flag=1;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
deleteinfo();
}
flag=0;
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==second)
{
y=i;
flag=1;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
deleteinfo();
}
TG.arcs[x][y]=Infinity;
TG.arcs[y][x]=Infinity;
printf("刪除成功!");
getchar();
getchar();
system("cls");
deleteinfo();
}
}
void DFS(int m,int start, int end)//深搜
{
int i,j;
for(i = 0; i < TG.vexnum; i++)
{
if(TG.arcs[start][i] !=Infinity && DFSvisited[i] == 0)//起始結點到i存在路徑且i未被訪問
{
DFSvisited[i] = 1;
if(i == end)//等于目標結點時打印
{
count++;
printf("★%d.",count);
for(j = 0; j < m; j++)
{
printf("%s->", TG.vexs[DFSsave[j]].name);
}
printf("%s\n", TG.vexs[end].name);
DFSvisited[i] = 0;
}
else //不等則存儲結點
{
DFSsave[m] = i;
m++;
DFS(m,i, end);
m--;
DFSvisited[i] = 0;//遞歸把這條路徑上所有結點初始化為未訪問
}
}
}
}
void Pathquery()//求任意兩點的路徑查詢
{
int flag=0;
int start,end;
int x,y;
int i;
for(i=0;i<TG.vexnum;i++)//初始化訪問
{
DFSvisited[i]=0;
DFSsave[i]=0;
}
printf("請輸入起始景點編號和終點景點編號,用空格隔開:");
scanf("%d %d",&start,&end);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==start)
{
flag=1;
x=i;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
menu();
}
flag=0;
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==end)
{
flag=1;
y=i;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
menu();
}
DFSsave[0]=x;//開始結點
DFSvisited[x]=1;
DFS(1,x,y);
getchar();
getchar();
system("cls");
menu();
}
void onetoallpath()//求一個到所有的最短路徑
{
int start;
int i,j;
int flag=0;
int x=0;
int stack[max]={-1};
int s=0;
printf("請輸入起始景點編號:");
scanf("%d",&start);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==start)
{
flag=1;
x=i;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
menu();
}
Dijkstra(x);
printf("%s到其他各景點的最短距離如下:\n",TG.vexs[x].name);
for(i=0;i<TG.vexnum;i++)
{
if(i!=x)
{
s=0;
stack[0]=djsave[i]; //終點的前一個結點下標值放入數(shù)組
printf("%s->",TG.vexs[x].name);
/*for(i=0;i<TG.vexnum;i++)
printf("%d、",djsave[i]);*/
for(j=1;j<TG.vexnum;j++)
{
stack[j]=djsave[stack[j-1]];//每次存儲上一個結點的前一個結點下標
}
for(j=0;j<TG.vexnum;j++)
{
if(stack[j]==-1)
break;
s++;//計算共有多少結點(不包括開始和結束)
}
for(j=s-1;j>=0;j--)
printf("%s->",TG.vexs[stack[j]].name);
printf("%s\n",TG.vexs[i].name);
printf("距離為:%dm\n",shortlength[i]);
}
}
getchar();
getchar();
system("cls");
menu();
}
int Dijkstra(int start)
{
int visited[max]={0};
int min,i,j,k;
int s=0;
for(i=0;i<TG.vexnum;i++)//記錄起點所有鄰接結點權值
{
shortlength[i]=TG.arcs[start][i];
visited[i]=0;//初始化為未訪問
djsave[i]=-1;
}
shortlength[start]=0;
visited[start]=1;//開始結點標記已訪問
for(i=0;i<TG.vexnum;i++)
{
k=-1;
min=Infinity;
for(j=0;j<TG.vexnum;j++)//找出最短路徑
{
if(visited[j]==0 && shortlength[j]<min)//j結點未被訪問,起點到j結點的權值小于最小值
{
min=shortlength[j];
k=j;
}
}
visited[k]=1;
for(j=0;j<TG.vexnum;j++)
{
if(visited[j]==0 && TG.arcs[k][j]+shortlength[k]<shortlength[j])//修正最短路徑
{
shortlength[j]=TG.arcs[k][j]+shortlength[k];
djsave[j]=k;
}
}
}
}
void twopath()//求兩個之間的最短路徑
{
int flag=0;
int start,end;
int x=0,y=0;
int i=0;
int stack[max]={-1};
int s=0;
printf("請輸入起始景點編號和終點景點編號,用空格隔開:");
scanf("%d %d",&start,&end);
if(start==end)
{
printf("起點和終點不能相同!");
getchar();
getchar();
system("cls");
menu();
}
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==start)
{
x=i;
flag=1;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
menu();
}
flag=0;
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==end)
{
y=i;
flag=1;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
menu();
}
Dijkstra(x);
printf("從%s到%s的最短路徑是:\n",TG.vexs[x].name,TG.vexs[y].name);
stack[0]=djsave[y]; //終點的前一個結點下標值放入數(shù)組
printf("%s->",TG.vexs[x].name);
/*for(i=0;i<TG.vexnum;i++)
printf("%d、",djsave[i]);*/
for(i=1;i<TG.vexnum;i++)
{
stack[i]=djsave[stack[i-1]];//每次存儲上一個結點的前一個結點下標
}
for(i=0;i<TG.vexnum;i++)
{
if(stack[i]==-1)
break;
s++;//計算共有多少結點(不包括開始和結束)
}
for(i=s-2;i>=0;i--)
printf("%s->",TG.vexs[stack[i]].name);
printf("%s\n",TG.vexs[y].name);
printf("距離為:%dm",shortlength[y]);
getchar();
getchar();
system("cls");
menu();
}
int prim(int start)
{
int lowcost[max]={0};
int min;
int i,k,j;
int cost=0;
s=0;//全局變量
for(i=0;i<TG.vexnum;i++)
{
if(i!=start)
{
primqueue[i]=start;
lowcost[i]=TG.arcs[start][i];//把1結點的鄰接結點對應的權值記錄下來
}
}
//lowcost[start]=0;//1結點賦值為0表示已訪問
for(i=0;i<TG.vexnum-1;i++)
{
min=99999;
j=0;
k=0;
while(j<TG.vexnum)
{
if(lowcost[j]!=0 && lowcost[j]<min)//找出權值最下的且記錄該下標
{
min=lowcost[j];
k=j;
}
j++;
}
cost=cost+min;//把最小結點權值加入
printf(" 從%s---%s:%d m\n", TG.vexs[primqueue[k]].name,TG.vexs[k].name,lowcost[k]);
//printf("%d\n",cost);
lowcost[k]=0;//該結點標記為已訪問
// primqueue[s++]=k;
for(j=0;j<TG.vexnum;j++)//更新頂點集到其他結點的路徑
{
if(j!=k && lowcost[j]!=0 && TG.arcs[k][j]<lowcost[j])//已訪問的結點就不需要找到該結點的最短路徑
{
lowcost[j]=TG.arcs[k][j];
primqueue[j]=k;
}
}
}
return cost;
}
void netting()// 求任意一點走遍全校最短路徑
{
int start;
int i;
int x;
int flag=0;
int length=0;
printf("請輸入景點編號:");
scanf("%d",&start);
for(i=0;i<TG.vexnum;i++)
if(TG.vexs[i].num==start)
{
flag=1;
x=i;
}
if(flag==0)
{
printf("輸入的編號不存在!");
getchar();
getchar();
system("cls");
menu();
}
length=prim(x);
printf(" 總長度為:%dm ",length);
getchar();
getchar();
system("cls");
menu();
}
int main()
{
initG();
menu();
return 0;
}
到了這里,關于基于C語言的數(shù)據(jù)結構課程設計(學生管理系統(tǒng)、停車場管理、家譜管理、校園導航系統(tǒng))的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!