实验4 附加

2024-08-30 07:32
文章标签 实验 附加

本文主要是介绍实验4 附加,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*扩展实现源代码*/

# include <stdio.h>

# include <stdlib.h>

# include <conio.h>

 

# define True 1

# define False 0

# define OK 1

# define ERROR 0

# define OVERFLOW -2

# define NULL 0

# define MAXLEN 10

# define LARGE 999

typedef int Status;

 

typedef struct

{

 int a[MAXLEN],b[MAXLEN],h[MAXLEN];/*第K边的起点,终点,权值*/

 char vexs[MAXLEN];/*顶点信息集合*/

 int vexnum,arcnum;/*顶点数和边数*/

 int kind;/*图的类型*/

 int arcs[MAXLEN][MAXLEN];/*邻接矩阵*/

}Graph;

 

typedef struct node/*表结点结构*/

{

 int Adjvex;/*存放与头结点相邻接的顶点在数组中的序号*/

 int info;/*权值*/

 struct node *next;/*指向与头结点相邻接下一个顶点的表结点*/

}EdgeNode;

 

typedef struct/*头结点结构*/

{

 int id;/*顶点入度*/

 char data;/*顶点信息*/

 EdgeNode *Link;/*指向头结点对应的单链表中的表结点*/

}Vexnode;

 

typedef struct/*邻接表结构*/

{

 Vexnode Adjs[MAXLEN];/*邻接表的头结点集合*/

 int vexnum,arcnum;/*顶点数,边数*/

 int kind;

}AdjList;

 

typedef struct QNode/*队列存储结构*/

{

 int data;

 struct QNode

 *next;

}LinkQList;

 

typedef struct

{

 LinkQList *front;/*队头指针*/

 LinkQList *rear;/*队尾指针*/

}LinkQueue;

 

 

 

typedef struct/*栈结构*/

{

 int stack[MAXLEN];

 int top;

}Stack;

 

int CNULL=-1;

Graph G;

AdjList Adjl;

Stack *t;/*拓扑序列顶点栈*/

Stack *s;/*零入度顶点栈*/

LinkQueue *q;

 

Graph Printf_Adjmatrix(Graph G)/*输出邻接矩阵*/

{

 int i,j;

 printf("邻接矩阵:/n");

 printf("vertex/t");

 for (i=0;i<G.vexnum;i++) printf("%4c",G.vexs[i]);

 printf("/n");

 for(i=0;i<G.vexnum;i++)

  { printf("% 4c /t",G.vexs[i]);

    for(j=0;j<G.vexnum;j++) printf("%4d",G.arcs[i][j]);

    printf("/n");

  }

 return G;

}

 

void Creat_1(Graph G)

{

  int i,j,k,c=0;

  for (i=0;i<G.vexnum;i++)

     for(j=0;j<G.vexnum;j++)

      G.arcs[i][j]=c;

  for(k=0;k<G.arcnum;k++)

    G.arcs[G.a[k]-1][G.b[k]-1]=1;

  Printf_Adjmatrix(G);

}

void Creat_2(Graph G)

{

   int i,j,k,c=0;

   for (i=0;i<G.vexnum;i++)

     for(j=0;j<G.vexnum;j++)

      G.arcs[i][j]=c;

   for(k=0;k<G.arcnum;k++)

    { G.arcs[G.a[k]-1][G.b[k]-1]=1;

      G.arcs[G.b[k]-1][G.a[k]-1]=1;

     }

   Printf_Adjmatrix(G);

}

Graph Creat_3(Graph G)

{

  int i,j,k,c=999;

  for (i=0;i<G.vexnum;i++)

     for(j=0;j<G.vexnum;j++)

      G.arcs[i][j]=c;

  for(k=0;k<G.arcnum;k++)

       G.arcs[G.a[k]-1][G.b[k]-1]=G.h[k];

  Printf_Adjmatrix(G);

  return G;

}

Graph Creat_4(Graph G)

{

  int i,j,k,c=999;

  for (i=0;i<G.vexnum;i++)

     for(j=0;j<G.vexnum;j++)

      G.arcs[i][j]=c;

  for (k=0;k<G.arcnum;k++)

   { G.arcs[G.a[k]-1][G.b[k]-1]=G.h[k];

      G.arcs[G.b[k]-1][G.a[k]-1]=G.h[k];

     }

 Printf_Adjmatrix(G);

 return G;

}

 

void CreatGraph(Graph G)/*邻接矩阵*/

{

 switch(G.kind)

    {

     case 1:Creat_1(G);break;

     case 2:Creat_2(G);break;

     case 3:Creat_3(G);break;

     case 4:Creat_4(G);break;

     default:printf("ERROR/n");

     }

}

 

AdjList  CreatList (Graph G ,AdjList Adjl)/*邻接表*/

{

  int i;

  EdgeNode *p;

  if(G.kind==1||G.kind==3)

    { for(i=0;i<Adjl.arcnum;i++)

      { p=(EdgeNode*)malloc(sizeof(EdgeNode));

       p->Adjvex=G.b[i];

       p->info=G.h[i];

       p->next=Adjl.Adjs[G.a[i]-1].Link;

       Adjl.Adjs[G.a[i]-1].Link=p;

       }

     }

  if(G.kind==2||G.kind==4) 

    { for(i=0;i<Adjl.arcnum;i++)

      { p=(EdgeNode*)malloc(sizeof(EdgeNode));

       p->info=G.h[i];

        p->Adjvex=G.b[i];

         p->next=Adjl.Adjs[G.a[i]-1].Link;

        Adjl.Adjs[G.a[i]-1].Link=p;

       

        p=(EdgeNode*)malloc(sizeof(EdgeNode));

        p->info=G.h[i];

        p->Adjvex=G.a[i];

         p->next=Adjl.Adjs[G.b[i]-1].Link;

       Adjl.Adjs[G.b[i]-1].Link=p;

       }

     }

 printf("邻接表为:/n");

 for(i=0;i<G.vexnum;i++)

 { printf("[%d,%c]=>",i+1,Adjl.Adjs[i].data);

   p=Adjl.Adjs[i].Link;

   while(p!=CNULL)

    {printf("[%c,%d]-->",Adjl.Adjs[(p->Adjvex)-1].data,p->info);

   p=p->next;

 }

printf("^/n");

}

return Adjl;

}

void InitQueue(LinkQueue *p)

{    p->front=(LinkQList *)malloc(sizeof(LinkQList));

     p->rear=p->front;

     (p->front)->next=NULL;

}

 

Status Empty(LinkQueue *q)

{

 int v;

 if(q->front==q->rear) v=True;

 else   v=False;

 return v;

}

Status AddQueue(LinkQueue *q,int e)/*入队列*/

{

 q->rear->next=(LinkQList *)malloc(sizeof(LinkQList));

 q->rear=q->rear->next;

 if(!q->rear) return -1;

 q->rear->data=e;

 q->rear->next=NULL;

 return OK;

}

 

Status DelQueue(LinkQueue *q)/*出队列*/

{

  LinkQList *p;

  int e;

  if (q->front==q->rear)

      printf("the LinkList is OVERFLOW");

  else p=(q->front)->next;

       (q->front)->next=p->next;

  e=p->data;

  if(q->rear==p)

       q->rear=q->front;

  free(p);/*释放P所指的内存区*/

  return(e);

}

 

 

void DFS(int i, AdjList Adjl)/*深度优先搜索*/

{

 EdgeNode *p;

 int j;

 int visited[MAXLEN];/*访问标志数组,访问过为1,未访问过为0*/

 for(j=0;j<Adjl.vexnum;j++) visited[j]=0;/*初始化,所有点都未访问*/

  printf("%4c->",Adjl.Adjs[i-1].data);

  visited[i-1]=1;

  p=Adjl.Adjs[i-1].Link;

  while(p!=CNULL)

  {if (visited[(p->Adjvex)-1]!=1) DFS((p->Adjvex),Adjl);

     p=p->next;

   }

}

 

void BFS(int i,AdjList Adjl)/*广度优先搜索*/

{

  EdgeNode *p;

  int j;

  int visited[MAXLEN];

  for (j=0;j<Adjl.vexnum;j++) visited[j]=0;/*初始化所有点*/

 

  InitQueue(q);

  printf("%4c->",Adjl.Adjs[i-1].data);

  visited[i-1]=1;

  AddQueue(q,i);

  while(!Empty(q))

    {i=DelQueue(q);

     p=Adjl.Adjs[i-1].Link;

     while(p!=CNULL)

       {if (visited[(p->Adjvex)-1]==0)

          {printf("%4c->",Adjl.Adjs[p->Adjvex-1].data);

           visited[(p->Adjvex)-1]=1;

           AddQueue(q,p->Adjvex);

           p=p->next;

           }

        }

     }

}

 

Status Initstack(Stack *s)/*构造空栈*/

{

 s->top=0;

 return OK;

}

 

Status Push(Stack *s,int x)/*入栈*/

       if (s->top==MAXLEN){

              printf("the stack is OVERFLOW!/n");exit(0);}

 else{ s->top=s->top+1;

       s->stack[s->top]=x;

      }

  return OK;

}

Status Pop(Stack *s)

  int y;

  if(s->top==0)printf("the stack is Empty!/n");

  else {y=s->stack[s->top];

       s->top=s->top-1;

       }

  return y;

}

 

Status StackEmpty(Stack *s)

{

  if (s->top==MAXLEN) return (True);

  else return (False);

}

 

Status TopSort(AdjList Adjl)/*拓扑排序*/

{

  int i,k,count;

  EdgeNode *p;

  

  printf("拓扑排序序列为:/n");

  Initstack(s);

  

  for(i=0;i<Adjl.vexnum;i++)

    if(Adjl.Adjs[i].id==0) Push(s,Adjl.Adjs[i].data);

  count=0;

  while(!StackEmpty(s))

    { i=Pop(s);

      printf("%4c->",Adjl.Adjs[i].data);

      ++count;

      for(p=Adjl.Adjs[i].Link;p;p=p->next)

         { k=p->Adjvex;

          if(!(--Adjl.Adjs[k-1].id)) Push(s,k-1);

          }

     }

  if(count<Adjl.vexnum)

    { printf("/n网中有环!/n"); /*拓扑排序输出的顶点数<图中的顶点数*/

      return ERROR;

     }

  else return OK;

}

 

void Prim(Graph G)/*最小生成树*/

{

  int i,j,k,min;

  int lowcost[MAXLEN];/*权值*/

  int closet[MAXLEN];/*最小生成树结点*/

  printf("最小生成树的边为:/n");

  for(i=1;i<G.vexnum;i++)

   {

     lowcost[i]=G.arcs[0][i];

     closet[i]=1;

    }

  closet[1]=0;

  j=1;

  for(i=1;i<G.vexnum;i++)

   {

     min=lowcost[j];

     k=i;

     for(j=1;j<G.vexnum;j++)

       if(lowcost[j]<min&&closet[j]!=0)

         {

         min=lowcost[j];

         k=j;

        }

      printf("(%c,%c),",G.vexs[k-1],G.vexs[closet[k-1]]);

      closet[k]=0;

      for(j=1;j<G.vexnum;j++)

        if(G.arcs[k][j]<lowcost[j]&&closet[j]!=0)

           {

              lowcost[j]=G.arcs[k][j];

              closet[j]=k;

           }

     }

}

 

int ve[MAXLEN];/*最早发生时间*/

int vl[MAXLEN];/*最迟发生时间*/

 

Status TopOrder(AdjList Adjl,Stack *t)/*求各顶点事件的最早发生时间ve*/

  int i,j,count,k;

  EdgeNode *p;

  Initstack(s);

  Initstack(t);

  for(i=0;i<Adjl.vexnum;i++)

    if(Adjl.Adjs[i].id==0) Push(s,i);

 

  count=0;

  for(i=0;i<Adjl.vexnum;i++) ve[i]=0;

  while(!StackEmpty(s))

    { j=Pop(s);Push(t,j);++count;

      for(p=Adjl.Adjs[j].Link;p;p=p->next)

        { k=p->Adjvex;

          if(--Adjl.Adjs[k-1].id==0) Push(s,k-1);

         if(ve[j]+(p->info)>ve[k-1]) ve[k-1]=ve[j]+(p->info);

         }

     }

  if(count<Adjl.vexnum) return ERROR;

   else return OK;

}

 

Status CriticalPath(AdjList Adjl)/*关键路径*/

{

   int i,j,k,dut,ee,el;

   EdgeNode *p;

   

   if(!TopOrder(Adjl,t)) return ERROR;

   for(i=0;i<Adjl.vexnum;i++) vl[i]=ve[i-1];/*初始化顶点事件的最迟发生时间*/

   printf("关键路径为:/n");

  while(!StackEmpty(t))/*按拓扑排序的逆序求各顶点的最迟发生时间ve值*/

    for(j=Pop(t), p=Adjl.Adjs[j].Link;p;p=p->next)

       { k=p->Adjvex; dut=(p->info);

         if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut;

        }

  for(j=0;j<Adjl.vexnum;++j)/*求ee,el和关键活动*/

    for(p=Adjl.Adjs[j].Link;p;p=p->next)

      { k=p->Adjvex;dut=p->info;

        ee=ve[j];el=vl[k-1]-dut;

        if(ee==el) printf("(%c,%c)->",Adjl.Adjs[j].data,Adjl.Adjs[k-1].data);

       }

       return OK;

}

 

void ShortPath_Dijkstra(Graph G)

  int cost[MAXLEN][MAXLEN];

  int dist[MAXLEN];/*某源点到各顶点的最短路径长度*/

  int path[MAXLEN];/*某源点到终点经过的顶点集合的数组*/

  int s[MAXLEN];/*最短路径的终点集合*/

  int i,j,v0,min,u;/*U存放最短路径的终点*/

  printf("/n请输入起点的编号:");

  scanf("%d",&v0);

  v0--;

  for(i=0;i<G.vexnum;i++)

    {for(j=0;j<G.vexnum;j++)

      cost[i][j]=G.arcs[i][j];

     }

  for(i=0;i<G.vexnum;i++)

    { dist[i]=cost[v0][i];

      if(dist[i]<LARGE&&dist[i]>0) path[i]=v0;

      s[i]=0;

     }

  s[v0]=1;

  for(i=0;i<G.vexnum;i++)

    { min=LARGE;

      u=v0;

      for(j=0;j<G.vexnum;j++)

        if(s[j]==0&&dist[j]<min)

          {min=dist[j];u=j;}

      s[u]=1;   /*U顶点是求得最短路径的顶点编号*/

      for(j=0;j<G.vexnum;j++)

         if(s[j]==0&&dist[u]+cost[u][j]<dist[j])

           { dist[j]=dist[u]+cost[u][j];

             path[j]=u;

            }

      }

  printf("/n顶点%d到各顶点的最短路径长度为:/n",v0);

  for(i=0;i<G.vexnum;i++)/*输入结果*/

     if(s[i]==1)

       { u=i;

         while(u!=v0)

            { printf("%4c<-",G.vexs[u]);

              u=path[u];

             }

          printf("%4c",G.vexs[u]);

          printf(":%d/n",path[i]);

         }

      else printf("%4c<-%4c:无路径/n",G.vexs[i],G.vexs[v0]);

}

 

void ShortPath_Floyd(Graph G)

{ int path[MAXLEN][MAXLEN];

  int short3[MAXLEN][MAXLEN];/*权值*/

  int i,j,k;

  for(i=0;i<G.vexnum;i++)

     for(j=0;j<G.vexnum;j++)

       { short3[i][j]=G.arcs[i][j];

         path[i][j]=0;

        }

  printf("/n各顶点间的最短路径为:/n");

  for(k=0;k<G.vexnum;k++)

    for(i=0;i<G.vexnum;i++)

      { if(short3[i][j]>(short3[i][k]+short3[k][j]))

         { short3[i][j]=short3[i][k]+short3[k][j];

            path[i][j]=k;

           }

        printf("(%4c->%4c):%d",G.vexs[i-1],G.vexs[j-1],short3[i][j]);

       }

}

int menu()

{

 int a;

 printf("/n请选择图的实现:/n");

 printf("1__邻接矩阵/n");

 printf("2__邻接表/n");

 printf("3__深度优先搜索/n");

 printf("4__广度优先搜索/n");

 printf("5__最小生成树/n");

 printf("6__拓扑排序/n");

 printf("7__关键路径/n");

 printf("8__从某个源点到其余各顶点的最短路径/n");

 printf("9__每一对顶点之间的最短路径/n");

 printf("10__退出....../n");

 scanf("%d",&a);

 return a;

}

void chushihuachuli()

{

 int i,j,k,h;

 printf("/n请输入图的类型(1:有向图 2:无向图 3:有向网 4:无向网):");

 scanf("%d",&i);

 {

        G.kind=i;

        Adjl.kind=i;

 }

   printf("请输入顶点数,边数(逗号隔开):");

   scanf("%d,%d",&i,&j);

   G.vexnum=i;Adjl.vexnum=i;

   G.arcnum=j;Adjl.arcnum=j;

  for (i=0;i<G.vexnum;i++)

  { 

   printf("第%d个顶点的信息:/n",i+1);

   scanf("%s",&G.vexs[i]);

   Adjl.Adjs[i].data=G.vexs[i];

   Adjl.Adjs[i].Link=CNULL;

   Adjl.Adjs[i].id=0;

  }

  for (k=1;k<=G.arcnum;k++)

  {

   if (G.kind==1||G.kind==3)

             printf("第%d条边的起点编号,终点编号:(逗号隔开)",k);

         else 

                      printf("第%d条边的两个顶点的编号:(逗号隔开)",k);

   scanf("%d,%d",&i,&j);

   G.a[k-1]=i;G.b[k-1]=j;

   if(i<1||i>G.vexnum||j<1||j>G.vexnum)

       {printf("     编号超出范围,重新输入");continue;}

   if (G.kind==3||G.kind==4)

   {

       printf("/t该边的权值:");

       scanf("%d",&h);

       G.h[k-1]=h;

   }

   else  G.h[k-1]=NULL;

   Adjl.Adjs[i].id++;

  }

}

 

void main()

{

 int quit=0,k;

 chushihuachuli();

 

 while(!quit)

 switch(menu())

 {

  case 1:CreatGraph(G);break;

  case 2:CreatList(G,Adjl);break;

  case 3:printf("请输入出发点编号:");

           scanf("%d",&k);

          CreatList(G,Adjl);

           printf("/n从第%d点出发深度优先搜索遍历序列:",k);

          DFS(k,Adjl);break;

  case 4:printf("请输入出发点编号:");

           scanf("%d",&k);

           CreatList( G,Adjl);

           printf("/n从第%d点出发广度优先搜索遍历序列:",k);  

          BFS( k,Adjl);

          break;

  case 5:if (G.kind==4)

              {Creat_4(G); Prim(G);}

          else{printf("/t不能构造最小生成树,请重新选择:/n");}

           break;

  case 6:if (G.kind==1||G.kind==3)

              {CreatList(G,Adjl); TopSort(Adjl);}

          else{printf("/t不能拓扑排序,请重新选择:/n");}

           break;

  case 7:if (G.kind==3)

              {CreatList(G,Adjl);

              CriticalPath( Adjl);

              }

          else{printf("/t没有关键路径,请重新选择:/n");}

           break;

  case 8:if (G.kind==3)

              {Creat_3(G); ShortPath_Dijkstra(G);}

          else{printf("/t没有最短路径,请重新选择:/n");}

           break;

  case 9:if (G.kind==3)

              {Creat_3(G); ShortPath_Floyd(G);}

          else{printf("/t没有最短路径,请重新选择:/n");}

           break;

  case 10:quit=1;

  default:{printf(" /n/t*** wronG ***/n");}

  }/*switch*//*while*/

}/*main()*/

这篇关于实验4 附加的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120183

相关文章

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

pta-2024年秋面向对象程序设计实验一-java

文章申明:作者也为初学者,解答仅供参考,不一定是最优解; 一:7-1 sdut-sel-2 汽车超速罚款(选择结构) 答案: import java.util.Scanner;         public class Main { public static void main(String[] arg){         Scanner sc=new Scanner(System

MATLAB控制USRP的附加功能安装包

请按照你手里的USRP型号选择对应的MATLAB附加功能包,安好后直接配置即可,这里包含了以下型号的USRP:X300,X310,X410(USRP x-eries)N300,N310, N320,N321, E312,E310,USRP- B200, B200mini, B200mini-i, B205mini-i或B210, SRP- N200, N210或USRP2™.基本涵盖了所有的USR

如何校准实验中振镜频率的漂移

在实验过程中,使用共振扫描振镜(如Cambridge Technology的8kHz振镜)时,频率漂移是一个常见问题,尤其是在温度变化或长期运行的情况下。为了确保实验的准确性和稳定性,我们需要采取有效的校准措施。本文将介绍如何监测、调节和校准振镜频率,以减少漂移对实验结果的影响。 1. 温度管理和稳定性控制 振镜的频率变化与温度密切相关,温度的升高会导致机械结构的变化,进而影响振镜的共

实验C语言“union”的最基础语法

目标 最近在看Rust的“菜鸟教程”,看到 Rust 枚举类 时我发现它所定义的“枚举类”虽然也能像C语言枚举类那样使用,但是多了些功能:对于某个枚举的成员,还可以附带独特的数据,这让我想起了C语言中的union。 而我事实上对union没有使用经验,我自己写程序的时候不用它,看其他的项目的程序时印象里也没见过它。所以我对union的设计意图理解不深(可能只是为了节省内存?)。本篇的目标是对其