C tworzenie listy - nadpisywanie zmiennej

0

Napisałem kod, który tworzy główną listę w której jest m. in. wskaźnik do drugiej listy. Chodzi mniej więcej o to, że potrzebuję sczytywać wierzchołki (główna lista) i wierzchołki sąsiadujące (druga lista, tworzona oddzielnie dla każdego wierzchołka z listy głównej). Program działa gdy nazwą może być zmienna typy char, natomiast jeśli chcę by była to tablica np na 15 elementów nie działa. Ostatecznie podczas tworzenia wszystko działa, ale podczas wyświetlania wygląda na to, że skoro ładuję do listy wskaźnik do cNeighbour[15], to on jest taki sam i w efekcie zmieniam cały czas jedną zmienną :/ chciałem dodać alokacją pamięci, jednak coś nie śmiga...

typedef struct stPart2 stPart2;
struct stPart2 
{
	void *pvContent;
	stPart2 *pNext, *pPrev;  
};

 typedef struct stVert stVert;
  struct stVert
  {
	char cVertexName;
	stPart2 *pBeginReach;  
  };

  char *cNeighbour=(char*)malloc(15*sizeof(char));

  stVert *stVertex=(stVert*)malloc(sizeof(stVert));
  while((cLetter=fgetc(fFile))!=EOF)
  {
    if (bCommand==1)
    {
      if (cTmpLetter==87)                                                       //jeśli znak po # to W, wtedy następny znak to nazwa wierzchołka
        { 
          iVertexAmount++;
          stVert *stVertex=(stVert*)malloc(sizeof(stVert));
          stVertex->cVertexName=cLetter;
          bCommand=0;
          if (0==pElement)
          { 
            pElement=fnAddInOrder(stVertex);
            pBeginElement=pElement;
            printf("^ %p\n",pElement);
          }
          else
          {
            fnAddInOrder(stVertex);
            pElement=pElement->pNext;
          }
        }
      if ((cTmpLetter==83) || (bNeighbours==1))                                 //jeśli znak po # to S, wtedy następne znaki aż do napotkania # to wierzchołki dostępne z aktualnego [i-l-1]
        {
           bNeighbours=1;

           if (!bOneNeighbour)
           {
             char *cNeighbour=(char*)malloc(15*sizeof(char));
           }  
           bOneNeighbour=1;
           
           if (cLetter==44)
           {
             bOneNeighbour=0;
           }
           if (bOneNeighbour)
           {
             if (cLetter!=35)
             {                
               cNeighbour[i]=cLetter;
               i++;
             }
           }  
           else
           {
              cNeighbour[i]=0;                    
              if (0==pNeighbour)
              {
                pNeighbour=fnAddInOrder2(cNeighbour, pNeighbour);
                ((stVert*)pElement->pvContent)->pBeginReach=pNeighbour;
                printf("%p %s\n", pNeighbour, pNeighbour->pvContent);
              }
              else
              {
                fnAddInOrder2(cNeighbour, ((stVert*)pElement->pvContent)->pBeginReach);
                pNeighbour=pNeighbour->pNext;
              }
              
              printf("- %s\n", pNeighbour->pvContent);
              i=0;
              //bOneNeighbour=1;
              //free(cNeighbour);
           }
              
           if (cLetter==35)
           {
             bCommand=0;
             bNeighbours=0;
             pNeighbour=0;
           }
            
        } 
    }
    
    if (cTmpLetter==35)
    {
      bCommand=1;
    }
    cTmpLetter=cLetter;
}
pNeighbour=0;


pElement=pBeginElement;
while(pElement)
{  
  pNeighbour=((stVert*)pElement->pvContent)->pBeginReach;
  while(pNeighbour)
  {
    printf("%p %p %s\n", pElement, pNeighbour, pNeighbour->pvContent);
    pNeighbour=pNeighbour->pNext; ;
  } 
  pElement=pElement->pNext; 
}
1
fnAddInOrder2(strdup(cNeighbour),...

przy zwolnieniu nie zapomnij zrobić free( )

1 użytkowników online, w tym zalogowanych: 0, gości: 1