C++ 正如在c中解释的那样

C++ 正如在c中解释的那样,c++,c,algorithm,visual-c++,C++,C,Algorithm,Visual C++,我有一个问题,这是为什么,我只看到了实现 for(i=0;nlist[i].nid!=0;i++) {} nlist[i].nid=n_id; nlist[i].add=temp; nlist是类型结构的数组 结构 struct node { int id; struct node *l[MAX_CONN+1]; int cost[MAX_CONN+1]; struct node **next; in

我有一个问题,这是为什么,我只看到了实现

for(i=0;nlist[i].nid!=0;i++)
        {}
        nlist[i].nid=n_id;
        nlist[i].add=temp;
nlist是类型结构的数组

结构

struct node
{
    int id; 
    struct node *l[MAX_CONN+1];
    int cost[MAX_CONN+1];  
    struct node **next;
    int *mincost;

};
typedef struct node nodes; 
struct record 

{
    int nid;
    struct node *add;
};
typedef struct record records;
records nlist[MAX_NODES+1]={0};
全功能

文件*f;
int d;
int i=0,j=0,n_id,n_成本;
节点*temp=0,*temp1=0;
if((f=fopen(“graph.txt”,“r”))==NULL)
{
printf(“打开文件时出错。\n”);
出口(1);
}
memset(nlist,0,sizeof(结构记录)*MAX_节点);
计数=0;
do/*首先获取所有节点的id和地址*/
{
fscanf(f、%d、&n_id);
for(i=0;nlist[i].nid!=0;i++)
{
if(n_id==nlist[i].nid)
{
printf(“Id已经存在”);
返回;
}
}
temp=(nodes*)malloc(sizeof(nodes));
如果(温度==0)
{
printf(“错误:内存不足\n”);
返回;
}
memset(temp,0,sizeof(struct node));
temp->id=n\u id;
温度->l[最大连接+1]=0;
温度->成本[最大连接+1]=0;
for(i=0;nlist[i].nid!=0;i++)
{}
nlist[i].nid=n_id;
nlist[i].add=temp;
计数++;
而((d=fgetc(f)!=';'))
{}
}而((d=fgetc(f))!=EOF);
倒带(f);
对于(i=0;icost[j]!=0;j++)
{}
临时->成本[j]=n_成本;
温度->l[j]=温度1;
}
}
fclose(f);

缩进有误导性。它应该像这样缩进:

for(i=0;nlist[i].nid!=0;i++) {
    /* empty loop */
}
nlist[i].nid=n_id;
nlist[i].add=temp;
我认为它应该做的事情如下:
for
循环从0向前推进
I
,直到找到
nlist
的元素,该元素的
nid
字段为空值。然后将该索引处的
nid
add
字段分别设置为
n\u id
temp


我应该补充一点,这是非常危险的代码。如果
i
前进到
nlist
的末尾,但没有找到合适的插槽,则程序很可能崩溃或出现其他错误。它肯定不会正常工作。

呃,什么?……什么是nlist?结构?联合?更可能的是这些语句应该在循环中!!但是考虑到使用i的循环终止条件,无论如何它都没有什么意义。@MitchWheat-这或一些注释将大大提高可读性。我的首选方法是将的
移动到一个具有有意义名称的函数中(例如,
findFirstAvailableSlot()
,该函数返回一个索引(如果没有索引,则返回-1)。我的首选方法是挖一个大洞并将代码放入其中!:@MitchWheat-Heh。是的,我同意。此外,OP中提供的代码将正确地前进到第一个未使用的项,前提是它不会超过数组的末尾。
for(i=0;nlist[i].nid!=0;i++) {
    /* empty loop */
}
nlist[i].nid=n_id;
nlist[i].add=temp;