我必须在C中使用链表和结构来开发一个算法,但是我在使数组上的元素无效时遇到了问题。澄清:
左侧是问题的初始设置。在右侧可能是输出。
到目前为止我做了什么:
struct cel {
int pos;
struct cel *prox;
};
typedef struct cel bloco;
...
bloco *blocos;
scanf("%d",&numBlocos);
blocos = malloc(sizeof(bloco) * numBlocos);
for(i = 0; i < numBlocos; i++) {
blocos[i].pos = i;
blocos[i].prox = NULL;
}
情况: 比方说,例如,用户想要放置第二个&#39; bloco&#39;第四次之后(就像在img上)。 我显然是这样做的:
blocos[4].prox = &blocos[2];
但是我应该如何在blocos [2]中取消?我的意思是,像blocos [2] = NULL
希望它足够清楚! 感谢
编辑---
我现在有两个新功能:
bloco* busca(bloco *blocos,int pos, int numblocos)
{
int i;
for(i = 0; i < numblocos; i++) {
bloco *temp = &blocos[i];
while(temp != NULL && temp->pos != -1) {
if(temp->pos == pos) {
return temp;
}
//se nao vai pro proximo item linkado
temp = temp->prox;
}
}
return NULL;
}
然后:
void moveOnto(bloco *blocos, int ori,int dest,int numblocos)
{
if(ori == dest)
return;
bloco *origem = busca(blocos,ori,numblocos);
retornaOrigem(blocos,origem);
bloco *destino = busca(blocos,dest,numblocos);
retornaOrigem(blocos,destino);
bloco *temp = malloc(sizeof(bloco));
*temp = *origem;
destino->prox = temp;
origem->pos = -1;
}
是否仍然无法使origem指针无效,或者就此而言blocos [2]为null,而不是origem-&gt; pos = -1 ??我的意思是,它们是指针,所以,为什么如果我设置origem = null它不会使bloco [2]无效(我想这是相同的地址)??
答案 0 :(得分:2)
你的电话,真的。你有一个带有int和指针的struct
类型。你需要为它确定一个空状态:也许int
将是-1
,也许指针将是NULL
,无论你用什么来识别&#34; null&# 34;这个结构的实例。
如果所有其他方法都失败了,添加一个布尔值(如果您没有内置布尔类型,则会char
执行),标记该块是否处于空状态。
答案 1 :(得分:1)
从您向我们展示的图片中,我觉得您应该使用一个指针数组,以便您可以为数组中的任何元素设置NULL
blocos = malloc(sizeof(bloco *) * numBlocos);
for(i = 0; i < numBlocos; i++) {
blocos[i] = malloc( sizeof(bloco ) );
*(blocos[i]).pos = i;
*(blocos[i]).prox = NULL;
}