ing 发表于 2020-1-18 19:53

int i= 0 在循环体外,首次循环结束后输出 ++i 是 1,然后输出 i 是0??

本帖最后由 ing 于 2020-1-18 20:18 编辑


这个 i 的值的输出??




```
#include<stdarg.h>
#include<malloc.h>
#include<stdio.h>

//顶点的最大个数
#define MAX_VERTEX_NUM 40
//存储弧或者边额外信息的指针变量类型
#define InfoType char
//图中顶点的数据类型
#define VertexType int

typedef enum
{
    //枚举图的 4 种类型
    DG,DN,UDG,UDN
}GraphKind;

//存储各顶点之间的关系
typedef struct
{
    //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值
    int adj;
    //弧或边额外含有的信息指针
    InfoType * info;
}ArcCell,AdjMatrix;

//二维矩阵
typedef struct
{
    //存储图中顶点数据
    VertexType vertex;
    //二维数组,记录顶点之间的关系
    AdjMatrix arcs;
    //记录图的顶点数和弧(边)数
    int vertexNum,arcNum;
    //记录图的种类
    GraphKind kind;
}MGraph;

//找到顶点本身数据,判断出顶点在二维数组中的位置
int locateVertex(MGraph * g,VertexType v)
{
    int i = 0;
    for (; i < g->vertexNum; ++i)
    {
      if (g->vertex == v)break;
    }

    printf("---------i:%d \n",i);

    if (i > g->vertexNum)
    {
      printf("no such vertex.\n");
      return -1;
    }
    return i;
}

//构造有向网,和有向图不同的是二阶矩阵中存储的是权值
void createUDG(MGraph * g)
{
    printf("输入含有的顶点数和弧的个数 \n");
    scanf("%d,%d",&(g->vertexNum),&(g->arcNum));
    for (int i = 0; i < g->vertexNum; ++i) {
      printf("依次输入顶点本身的数据 \n");
      scanf("%d",&(g->vertex));
    }
    for (int j = 0; j < g->vertexNum; ++j) {
      for (int k = 0; k < g->vertexNum; ++k) {
            g->arcs.adj = 0;
            g->arcs.info = NULL;
      }
    }
    for (int k = 0; k < g->arcNum; ++k) {
      int v1,v2,weight;
      weight = -1;
      printf("输入弧头、弧尾和权值 \n");
      scanf("%d,%d,%d",&v1,&v2,&weight);
      int h = locateVertex(g,v1);
      int t = locateVertex(g,v2);
      if (h == -1 || t == -1)
      {
            printf("no this vertex\n");
            return;
      }
      g->arcs.adj = weight;
    }
}

void createGraph(MGraph * g)
{
    printf("请输入图的类型 \n");
    printf("0 创建有向图(DG)\t"
         "1 创建无向图(DN)\t"
         "2 创建有向网(UDG)\t"
         "2 创建无向网(UDN) \n");
    scanf("%d",&(g->kind));
    switch(g->kind) {
      case DG:
            return createDG(g);
            break;
      case DN:
            return createDN(g);
            break;
      case UDG:
            return createUDG(g);
            break;
      case UDN:
            return createUDN(g);
            break;
      default:
            break;
    }
}

void printGraph(MGraph * g)
{
    for (int i = 0; i < g->vertexNum; ++i) {
      for (int j = 0; j < g->vertexNum; ++j) {
            printf("%d",g->arcs.adj);
      }
      printf("\n");
    }
}

int main()
{
    MGraph g;
    createGraph(&g);
    printGraph(&g);

    return 0;
}

```
请输入图的类型
0 创建有向图(DG)      1 创建无向图(DN)      2 创建有向网(UDG)       3 创建无向网(UDN)
2
输入含有的顶点数和弧的个数
6,10
依次输入顶点本身的数据
1
依次输入顶点本身的数据
2
依次输入顶点本身的数据
3
依次输入顶点本身的数据
4
依次输入顶点本身的数据
5
依次输入顶点本身的数据
6
输入弧头、弧尾和权值
2,1,5
---------i:1
---------i:0
输入弧头、弧尾和权值
3,2,4
---------i:2
---------i:1
输入弧头、弧尾和权值
1,3,8
---------i:0
---------i:2
输入弧头、弧尾和权值
4,1,7
---------i:3
---------i:0
输入弧头、弧尾和权值
3,4,5
---------i:2
---------i:3
输入弧头、弧尾和权值
6,3,9
---------i:5
---------i:2
输入弧头、弧尾和权值
1,6,3
---------i:0
---------i:5
输入弧头、弧尾和权值
6,4,6
---------i:5
---------i:3
输入弧头、弧尾和权值
5,6,1
---------i:4
---------i:5
输入弧头、弧尾和权值
4,5,5
---------i:3
---------i:4
050700
004000
800009
005006
000500
300010

渣渣奶 发表于 2020-1-18 19:56

for的参数呢

庞晓晓 发表于 2020-1-18 20:03

阿狸主题曲 发表于 2020-1-18 20:07

iokeyz 发表于 2020-1-18 20:09

需要看下这个函数咋调用的
页: [1]
查看完整版本: int i= 0 在循环体外,首次循环结束后输出 ++i 是 1,然后输出 i 是0??