2014-11-09 3 views
1

Мне нужно разработать алгоритм с использованием связанного списка и структуры в C, но у меня возникла проблема с обнулением элементов массива. Для уточнения:Nullifying struct in array в 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; 
    } 

Ситуация: Допустим, например, пользователь хочет поставить второй «BLOCO» после четвертого (например, на img). Очевидно, что я хотел бы сделать:

blocos[4].prox = &blocos[2]; 

Но как я должен приступить к обнулить на blocos [2]? Я имею в виду, что-то вроде blocos [2] = NULL

Надеюсь, что это достаточно ясно! Благодаря

EDIT ---

Я получил две новые функции: теперь

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 , или в этом случае блоки [2] равны нулю, не делая origem-> pos = -1 ?? Я имею в виду, что они указатели, поэтому, если я устанавливаю origem = null, это не сбрасывает bloco [2] (это тот же адрес, я думаю) ??

+0

Есть ли проблема с использованием NULL? – Nit

+0

@ Нить на то, что не указатель, возможно :) – Quentin

+0

Установите 'pos' в -1? – indiv

ответ

2

Ваш звонок, действительно. У вас есть тип struct с int и указателем. Для этого вам нужно решить нулевое состояние: возможно, int будет -1, может быть, указатель будет NULL, что бы вы ни использовали, чтобы распознать экземпляр «null» этой структуры.

Если все остальное не работает, добавьте логическое значение (char будет делать, если у вас нет встроенного булева типа), который указывает, находится ли блок в нулевом состоянии или нет.

+0

Да, это отстой, но я думаю, что это единственный способ сделать это.Я думал, что с самого начала, но я надеялся, что кто-то придет с лучшим решением ... В любом случае спасибо за помощь. – Leonardo

+1

Как указано в другом ответе, единственным универсальным нулевым объектом в C является указатель «NULL». Но это заставляет вас использовать динамическую память, которая будет стоить вам времени для выделения ваших объектов, места для указателей и времени, теряемого CPU, прыгающего через указатели, перебора вашего кеша. Не очень хорошая сделка по сравнению с просто резервированием нулевого состояния. – Quentin

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; 
} 
+0

Это было бы довольно расточительно. Примечание: '* (b [i]). P' неверно, оно должно быть' (* b [i]) .p', или еще лучше 'b [i] -> p'. – Quentin