2013-09-16 1 views
0

Так что в моем коде у меня две структуры. Первый - это узел, который содержит значение int и указатель на другой узел. Вторая структура используется для создания массива из 10 указателей каждой точки на другой узел. И он также содержит link2, который будет использоваться для перемещения массива и всех узлов, на которые он указывает. Я пытаюсь добавить 3 узла, каждый из которых содержит значение 3 в третьем индексе массива. Указатель в третьем индексе должен указывать на первые 3, а затем указывать на второй и т. Д. Когда я добавляю add (a, 3) три раза, а затем печатаю, я получаю ошибку сегментации. Я пробовал отслеживать код, но это все еще не имело для меня никакого смысла, потому что я всегда получаю три узла. Может кто-то указать мне в каком-то направлении? Спасибо!) />Структуры и указатели

#include <stdio.h> 
#include<stdlib.h> 
#include<string.h> 

struct node 
{ 
    int x; 
    struct node *link; 
}; 

struct listofnodes 
{ 
    struct node *alist[10]; 
    struct node *link2; 
}; 

addFirst(struct listofnodes *a, int num) 
{ 
    struct node *nodeone = (struct node *)malloc(sizeof(struct node)); 
    nodeone->x = num; 
    a->alist[num] = nodeone; 
    // printf("IT WENT THROUGH\n"); 
} 

add(struct listofnodes *a, int num) 
{ 
    struct node *current; 
    current = a->alist[3]; 
    struct node *nodeone = (struct node *)malloc(sizeof(struct node)); 
    nodeone->x = num; 
    current->x = 5; 
    { 
     while (a->alist[3] != NULL) 
     { 

      if (a->alist[3]->link == NULL) 
      { 
       a->alist[3]->link = nodeone; 
       printf("IT WENT THROUGH\n"); 
       break; 
      } 
      a->alist[3] = a->alist[3]->link; 
     } 
    } 
} 


main(void) 
{ 
    struct listofnodes *a = 
     (struct listofnodes *)malloc(sizeof(struct listofnodes)); 
    // a->alist[3]=NULL; 
    addFirst(a, 3); 
    add(a, 3); 
    add(a, 3); 
    add(a, 5); 
} 
+0

WTB тип возврата. – WhozCraig

+0

Я не понимаю ... зачем мне что-то возвращать? – user68212

+0

Каждый раз, когда вы создаете «узел», вы не инициализируете значение «link» в созданной вами структуре. Так что это скорее всего случайный, а не «NULL». – lurker

ответ

0

в основной() функции вы имеете:

struct listofnodes *a = 
    (struct listofnodes *)malloc(sizeof(struct listofnodes)); 

"а" теперь указатель на listofnodes размера блока памяти, содержащего случайные места. Вы, вероятно, хотите сделать что-то вроде

a->link2 = NULL; 

Кроме того, в надстройке() функции, то есть ...

add(struct listofnodes *a, int num) 
{ 
    struct node *current; 
    current = a->alist[3]; 
    struct node *nodeone = (struct node *)malloc(sizeof(struct node)); 
    nodeone->x = num; 

Вы таНос() d оперативной памяти и положить «Num» в й , но вам нужно поставить нуль в где «ссылка» идет, т.е.

nodeone->link = NULL; 

При создании блока памяти с помощью таНос(), вы должны вручную убедиться, что член «ссылка» установлено значение NULL - в противном случае число, оставшееся от последнего u se будет указывать, кто знает, где ...

+0

вы сказали, что «а» теперь два указателя? Разве это еще не один указатель, указывающий на огромный блок памяти, содержащий массив указателей на узел и link2? – user68212

+0

Я стою исправлено, вы совершенно правы. Это указатель на структуру, которая представляет собой блок случайных данных, пока вы не напишите на него. –