校园网布线和信息查询(C实现)

来源:互联网 发布:mssql fetch array 编辑:程序博客网 时间:2024/05/21 09:27

这是我自己写的,数据结构课程设计。不过有bug,而且在实现最小生成树的时候并未实现,尚需调试,望指教!

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define INFINITY 9999
#define MaxVNum 30
#define MaxCost 9999
#define Max_Length 5000
typedef char* vexType;
typedef struct {
 int adj;         /*边对应顶点的邻接关系*/
 char *info;         /*边相关信息,可有可无*/
} Edge,AdjMatrix[MaxVNum][MaxVNum];
typedef struct {
 char *num;         /*建筑物编号,将编号*/
 char *name;         /*建筑物名称*/
 char *intro;        /*建筑物简介*/
}Vex,vex[MaxVNum];
typedef struct {
 vex vexs;         /*用一位数组表示顶点向量*/
 AdjMatrix edges;       /*邻接矩阵*/
 int vexNum,edgeNum;      
}MGraph;
typedef struct {
 vexType adjvex;
 int lowcost;
}closedges;

int Location(MGraph M,vexType v){
     int i;
 for(i=0;i<M.vexNum;i++){
  if(strcmp(M.vexs[i].num,v)==0)
   return i;
 }
 printf("  Vex  error!/n");
 exit(-1);
}
MGraph CreatUDN(){
 MGraph G;
 FILE *fp;
 char c;
 int i,j,k,w,count,x,y,p;
 int count2=1;
 int weight;
 char v1[200]={'/0'};
 char v2[200]={'/0'};
 char store[Max_Length]={'/0'};
 char EdgeWeight[200]={'/0'};
 G.vexNum = 16;
 G.edgeNum = 21;
 G.vexs[0].num="0";
    G.vexs[1].num="1";
    G.vexs[2].num="2";
    G.vexs[3].num="3";
    G.vexs[4].num="4";
    G.vexs[5].num="5";
    G.vexs[6].num="6";
    G.vexs[7].num="7";
    G.vexs[8].num="8";
    G.vexs[9].num="9";
    G.vexs[10].num="10";
    G.vexs[11].num="11";
    G.vexs[12].num="12";
    G.vexs[13].num="13";
    G.vexs[14].num="14";
    G.vexs[15].num="15";
 for(i=0;i<G.vexNum;i++){
   G.vexs[i].name=(char*)malloc(200*sizeof(char));
         G.vexs[i].intro=(char*)malloc(200*sizeof(char));
  }
 for(i=0;i<G.vexNum;i++){
  for(j=0;j<G.vexNum;j++){
   G.edges[i][j].adj=INFINITY;     /*用权为INFINITY标志两个顶点之间没有路径*/  
   G.edges[i][j].info=NULL;
  }
 }
 if((fp=fopen("DATA.txt","r"))==NULL){
  printf("无法打开文件,程序退出!/n");
  exit(-1);
 }
 i=0;
 while((c=fgetc(fp))!=EOF){       /*将文件中所有信息读入到一个数组中*/
  store[i]=c;
  i++;
 }
 fclose(fp);
 i=0;
 j=0;
 count=1;
 while(count2<=3*G.edgeNum){
   if(count>3)
    count=1;
 switch(count){
  case 1:
     j=0;
     while(store[i]!=','&&store[i]!='/n'&&store[i]!='/0'){
   v1[j++]=store[i];       /*将第一个顶点读入到v1中*/
   i++;
     }
     i++;
     count2++;
     count++;
     break;
  case 2:   
   j=0;
   while(store[i]!=','&&store[i]!='/n'&&store[i]!='/0'){
    v2[j++]=store[i];
    i++;
     }
   i++;
   count2++;
   count++;
   break;
  case 3:
   j=0;
   while(store[i]!=','&&store[i]!='/n'&&store[i]!='/0'){
    EdgeWeight[j++]=store[i];
    i++;
   }
   i++;
   count2++;
   count++;
   break;
 }
 if(count==3){
      x=Location(G,v1);
  y=Location(G,v2);
 }
 if(count==4){
  w=0;
  weight=0;
  while(EdgeWeight[w]!='/0'){
   weight=10*weight+(EdgeWeight[w]-48);
   w++;
  }
  G.edges[x][y].adj=weight;
  G.edges[x][y].adj=weight;
  for(k=0;k<200;k++){
   v1[k]='/0';
   v2[k]='/0';
   EdgeWeight[k]='/0';
  }
 }
}
 for(j=0;j<G.vexNum;j++){
     w=0;
  while(store[i]!='/n'){
   v1[w++]=store[i++];
   //v1[w++]=store[i++];
  }
  for(p=0;p<w;p++){
   G.vexs[j].name[p]=v1[p];
  }
  G.vexs[j].name[p]='/0';
  i++;
  for(k=0;k<200;k++){
   v1[k]='/0';
  }
 }
 for(j=0;j<G.vexNum;j++){
  w=0;
  while(store[i]!='$'){
   v1[w++]=store[i++];
   //v1[w++]=store[i++];
  }
  for(p=0;p<w;p++){
   G.vexs[j].intro[p]=v1[p];
  }
  G.vexs[j].intro[p]='/0';
  i+=2;
  for(k=0;k<200;k++){
   v1[k]='/0';
  }
   }
   return G;
}
 
void Search(MGraph G){
 int i,flag=0;
 char c;
 char v[200];
 printf("/t0--A座行政楼/t1--B座实验楼/t2--D座实验楼/n"
   "/t3--四教/t/t4--二教/t/t5--三教/t/t6--西图书馆/n"
   "/t7--电气学院实验楼/t/t8--生化学院实验楼/n"
   "/t9--男生1栋/t10--女生1栋/t11--男生12栋/n"
   "/t12--师生活动中心/t/t13--五教/n"
   "/t14--七教/t/t/t15--东图书馆/n/n");
 printf("/t请输入您要查找的建筑物的编号或名称:/n");
 scanf("%s",v);         /*读入编号或名称*/
 for(i=0;i<G.vexNum;i++){
  if(strcmp(v,G.vexs[i].name)==0||strcmp(v,G.vexs[i].num)==0){
   printf("/n您查询的建筑物是%s/n/n简介:%s/n/n",G.vexs[i].name,G.vexs[i].intro);
   flag=1;
  }
 }
 if(!flag)
  printf("您输入的建筑物名称不正确!/n/n");
}

int LocateVex(MGraph G,vexType u){
 int i;
 for(i=0;i<G.vexNum;++i){
  if(strcmp(u,G.vexs[i].name)==0)
   return i;
 }
 printf("  Oh,no! 顶点错误!/n");
 exit(-1);
}
void MiniSpanTree_Prim(MGraph G,vexType u){
 closedges closedge[MaxVNum];
 int minCost;
 int i,j,k;
 k=LocateVex(G,u);
 for(j=0;j<G.vexNum;++j){       /*初始化辅助数组*/
  if(j!=k){
   strcpy(closedge[j].adjvex,u);
   closedge[j].lowcost=G.edges[k][j].adj;
  }
 }
 closedge[k].lowcost=0;        /*初始,U={u}*/
 for(i=1;i<G.vexNum;++i){       /*寻找当前最小权的边所对应的边的头结点*/
  minCost=MaxCost;
  for(j=1;j<G.vexNum;j++){
   if(closedge[j].lowcost<minCost&&closedge[j].lowcost>0){
    minCost=closedge[j].lowcost;
    k=j;
   }
  }
  printf("第%d条线是:| %s——%s |",i,closedge[k].adjvex,G.vexs[k].name); /*输出生成树的边*/
  closedge[k].lowcost = 0;         /*第k顶点并入U集*/
  for(j=0;j<G.vexNum;++j){
   if(G.edges[k][j].adj<closedge[j].lowcost){    /*新顶点并入U后重新选择最小边*/
    strcpy(closedge[j].adjvex,G.vexs[k].name);
    closedge[j].lowcost=G.edges[k][j].adj;
   }
  }
 }
}
void main(){
 MGraph G;
 int Flag=1;
 char c;
 vexType u;
 u=(char*)malloc(50*sizeof(char));
 G=CreatUDN();
 printf("/n/t/t欢迎使用校园网布线及信息查询系统!/n/n");
 Search(G);
 while(Flag){
  printf("您是否需要继续查询(y/n)?/n");
  scanf("%c",&c);
  switch(c){
   case 'y':
    Search(G);
    Flag=1;
    break;
   case 'n':
    Flag=0;
    printf("您已结束查询!/n/n");
    break;
   case '/n':
    break;
   default:
    Flag=1;
    printf("您输入有误!/n");
    break;
  }
 }
 strcpy(u,G.vexs[0].name);
 printf("现在为您提供最小代价铺设网线方案,您应按如下顺序铺设网线:/n");
 MiniSpanTree_Prim(G,u);
 printf("系统已结束,谢谢使用!/n");
}

 

 

/****************DATA.txt*****************/

0,1,200
0,2,300
0,6,800
0,15,2200
1,2,150
0,4,280
3,4,160
4,5,180
5,6,220
6,7,200
6,8,250
6,9,300
6,12,1700
6,15,2500
9,10,400
9,11,900
10,11,1000
11,12,700
12,15,800
13,14,300
14,15,700
A座行政楼
B座实验楼
D座实验楼
四教
二教
三教
西图书馆
电气工程学院实验楼
生物与化学工程学院实验楼
男生1栋
女生1栋
男生12栋
师生活动中心
五教
七教
东图书馆
行政楼,是我们学校最高的建筑。这里是学校高层工作的地方,设施全面,功能强大。$
B座,是我们计算机与信息学院和机械与车辆工程学院的实验楼,实验室林立,设备齐全。$
D座,是管理工程学院与纺织服装学院实验楼。$
第四教学楼,大三大四的课程都是在这上的。$
第二教学楼,这栋楼一般是晚上11点才关门,所以等到期末的时候,这里就聚集了大批的备考者。$
虽然名字叫三教但是这是数理学院实验楼,我们的物理实验是在这里做的。$
老图书馆,我校最大的图书馆,藏书较多,但是新书很少...$
电气学院总部所在地,很多电气类实验课的实验都在这里完成的,比如我们的数电、模电。$
生化学院总部所在地,当然也有很多实验室,但是跟我们计算机是一点不搭嘎的...$
男生1栋,就在1.5正对面,买饭特方便,羡慕ing...$
女生1栋,我们计算机学院的女生大部分都聚集于此,黄金宝地,君子必争!$
当当当当!这就是我们寝室所在地啦!IT英才的摇篮,国家栋梁的孵化场!$
这是我校的大礼堂,里面还算比较豪华,设备也不错。一般大型活动都会再此举行。$
第五教学楼,大一大二上课的主要场地。$
艺术设计学院总部所在地,到目前为止我还没去过那里!——||$
新图书馆,里面有电子阅览室,这里只能阅览不可外借,不过书总体来说还不错,计算机方面的新书挺多的!$

 

原创粉丝点击