参数个数可变的函数-C

参数个数可变的函数-C,c,C,更新: 我有一个具有可变参数数的函数,它返回一个(有向无权)图的地址,该图在n图中的度数最大。函数的一个参数是输入的图形数,n。可选参数是指向这些图的n指针 注意:有向图的最大阶数是具有最大边数的顶点的入阶边和出阶边的总数,循环数为两次 以下程序没有响应: #include <stdio.h> #include <stdlib.h> #include<stdarg.h> #define MAX 10 typedef struct { int n;//

更新:

我有一个具有可变参数数的函数,它返回一个(有向无权)图的地址,该图在
n
图中的度数最大。函数的一个参数是输入的图形数,
n
。可选参数是指向这些图的
n
指针

注意:有向图的最大阶数是具有最大边数的顶点的入阶边和出阶边的总数,循环数为两次

以下程序没有响应:

#include <stdio.h>
#include <stdlib.h>
#include<stdarg.h>
#define MAX 10

typedef struct
{
    int n;//number of vertices in a graph
    void* info[MAX];//information in a vertex
    int am[MAX][MAX];//adjacency matrix
}GH;

int degree(GH *g)
{
    int i,j;
    int deg_row[MAX]={0},deg_column[MAX]={0};
    int count_row[MAX]={0},count_column[MAX]={0};
    int max=0,maxDeg,temp,count_total[MAX]={0};
    int transpose[MAX][MAX];

    for(i=0;i<g->n;i++)
    {
        for(j=0;j<g->n;j++)
        {
            transpose[i][j]=g->am[j][i];
        }
    }

    for(i=0;i<g->n;i++)
    {
        for(j=0;j<g->n;j++)
        {
            if(transpose[i][j]!=0)
                deg_column[i]++;
            if(i==j)
            {
                if(transpose[i][j]!=0)
                    deg_column[i]=deg_column[j];
            }
        }

        count_column[i]=deg_column[i];
    }

        for(i=0;i<g->n;i++)
    {
        for(j=0;j<g->n;j++)
        {
            if(g->am[i][j]!=0)
                deg_row[i]++;
        }

        count_row[i]=deg_row[i];
    }

    for(i=0;i<g->n;i++)
    {
        count_total[i]=count_row[i]+count_column[i];
    }

    for(i=0;i<g->n;i++)
    {
        if(count_total[i]>count_total[max])
            max=i;
    }

    maxDeg=count_total[max];
    return maxDeg;
}

GH *f(int n,...)
{
    GH *deg;
    int i,j,maxDeg[MAX]={0},max=0;

    va_list args;
    va_start(args,n);

    for(i=0;i<n;i++)
    {
       maxDeg[i]=degree(va_arg(args,GH*));
       if(maxDeg[i]>maxDeg[max])
       {
            max=i;
            break;
       }
    }
    deg=va_arg(args,GH*);

    va_end(args);
    return deg;
}

void printGraph(GH *g)
{
    int i,j;
    printf("%d",g->n);
    printf("%s",g->info);
    for(i=0;i<g->n;i++,printf("\n"))
       for(j=0;j<g->n;j++)
          printf(" %2d",g->am[i][j]);
}

int main()
{
    GH gh1 = {4,{'1','2','3','4'},{{0,1,1,0},{0,0,0,0},{0,0,0,0},{0,1,0,0}}};
    GH gh2 = {4,{'1','2','3','4'},{{1,1,1,0},{0,1,0,0},{0,0,1,0},{0,1,0,1}}};

    GH* res=f(2,gh1,gh2);
    printGraph(res);

    return 0;
}
#包括
#包括
#包括
#定义最大值10
类型定义结构
{
int n;//图中的顶点数
void*info[MAX];//顶点中的信息
int am[MAX][MAX];//邻接矩阵
}生长激素;
整数度(GH*g)
{
int i,j;
int deg_行[MAX]={0},deg_列[MAX]={0};
int count_行[MAX]={0},count_列[MAX]={0};
int max=0,maxDeg,temp,count_total[max]={0};
int转置[MAX][MAX];
对于(i=0;in;i++)
{
对于(j=0;jn;j++)
{
转置[i][j]=g->am[j][i];
}
}
对于(i=0;in;i++)
{
对于(j=0;jn;j++)
{
if(转置[i][j]!=0)
deg_列[i]++;
如果(i==j)
{
if(转置[i][j]!=0)
deg_柱[i]=deg_柱[j];
}
}
计数列[i]=度数列[i];
}
对于(i=0;in;i++)
{
对于(j=0;jn;j++)
{
如果(g->am[i][j]!=0)
deg_行[i]++;
}
计数行[i]=度数行[i];
}
对于(i=0;in;i++)
{
计数总计[i]=计数行[i]+计数列[i];
}
对于(i=0;in;i++)
{
如果(计数总数[i]>计数总数[max])
max=i;
}
maxDeg=总计数[max];
返回maxDeg;
}
GH*f(整数n,…)
{
GH*deg;
int i,j,maxDeg[MAX]={0},MAX=0;
va_列表参数;
va_启动(args,n);
对于(i=0;imaxDeg[max])
{
max=i;
打破
}
}
deg=va_arg(args,GH*);
va_端(args);
返回度;
}
空打印图(GH*g)
{
int i,j;
printf(“%d”,g->n);
printf(“%s”,g->info);
对于(i=0;in;i++,printf(“\n”))
对于(j=0;jn;j++)
printf(“%2d”,g->am[i][j]);
}
int main()
{
GH gh1={4,{'1','2','3','4'},{{0,1,1,0},{0,0,0},{0,0,0},{0,1,0,0}};
GH gh2={4,{'1','2','3','4',{{1,1,1,0},{0,1,0,0},{0,0,1,0},{0,1,0},{0,1,0};
GH*res=f(2,gh1,gh2);
印刷图形(res);
返回0;
}

如何打印具有最大度数的图形的数据?

我有一些空闲时间

考虑这一主要问题:

int main()
{
    char info[] = {'1','2','3','4'};
   GH gh1 = { .n = 4, 
              .info = (void*)info, 
              .am = {{0,1,1,0},{0,0,0,0},{0,0,0,0},{0,1,0,0}}};
   GH gh2 = { .n = 4, 
              .info = (void*)info,
              .am = {{1,1,1,0},{0,1,0,0},{0,0,1,0},{0,1,0,1}}};

    printGraph(&gh1);

   return 0;
}
此打印功能:

void printGraph(GH *g)
{
    int i,j;
    printf("n = %d\n",g->n);
    printf("info = ");
    for(i=0;i<g->n;i++)
    {
        printf("%c ", *((char*)*g->info)+i);
    }
    printf("\n");

    for(i=0;i<g->n;i++,printf("\n"))
       for(j=0;j<g->n;j++)
          printf(" %2d",g->am[i][j]);
}
但是,在使用f函数时

GH* res=f(2,gh1,gh2);
你有错

我不知道你想计算什么,但问题不在于打印功能


希望我能帮上忙。

那么,你是在问如何使用printf?@2501我不知道如何传递具有最大度数的图的地址并打印它的数据。你第二次使用
va_arg()
是错误的。。。您已经遍历了for循环中的所有参数。我认为您需要重置
args
(再次调用
va_start()
),然后逐步执行
max
调用
va_args()
,以获取要返回的值(或者——可能更好——不要让函数具有可变数量的参数,而是接受一个
GH*
数组并返回最大值的索引)。@dhke
(GH)
更有可能。问题太多了。。您的代码示例给出了一个错误“在“{”标记之前的预期表达式”。
GH* res=f(2,gh1,gh2);