2013-09-17 4 views
0

Я пытаюсь добавить три узла, каждый из которых содержит значение int 1 и ссылку на следующий узел. Я могу печатать на первых двух узлах, но когда я пытаюсь получить доступ к третьему узлу, я получаю ошибку сегментации. Я не понимаю, почему, я проследил код, но все еще потерял.Добавление узлов в массив указателей

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


add(struct node *arrayy[],int value) 
{ 
    struct node *nodey = (struct node *)malloc(sizeof(struct node)); 
    nodey->x=value; 

    if(arrayy[value]==NULL) 
    { 
     printf("I am not pointing to something...now I am hehehe\n"); 
     arrayy[value]=nodey; 
    } 
    else 
    { 
     printf("I already have a head..now my link is pointing at something\n"); 
     while(arrayy[value]) 
     { 
      if(arrayy[value]->link==NULL) 
      { 
       arrayy[value]->link=nodey; 
       break; 
      } 
      arrayy[value]=arrayy[value]->link; 
     } 

    } 
} 

print(struct node *arrayy[]) 
{ 
    int x= 0; 

    for(x; x<10; x++) 
    { 
     while(arrayy[x]) 
     { 
      printf("%d",arrayy[x]->x); 
      arrayy[x]=arrayy[x]->link; 
     } 
    } 

} 

main(void) 
{ 
    struct node *array[10]={NULL}; 
    add(array,1); 
    add(array,1); 
    add(array,1); 
    printf("%d",array[1]->link->link->x); 
} 
+3

В менее чем 60 строках кода, включая пробелы, наиболее полезной вещью, которую вы собираетесь услышать, является следующее: ** научиться отлаживать **. Вы потратите половину своей профессиональной карьеры, сделав именно это, и вы также можете начать сейчас. Вы не можете ожидать, что кто-то другой отладит его для вас. – WhozCraig

ответ

1

Программирование, это отношения с компьютером. Вы должны хотите, чтобы заставить его работать, или вы сдаетесь; вам нужно понять, как она думает, или вы не сможете общаться; и, прежде всего, вам должно быть ясно, что вы вы, wan't, иначе вы никогда не сможете попросить об этом, не говоря уже о том, что все будет в порядке.

Первое, что вы должны сделать, изучая новый алгоритм, - это попытаться его обработать на бумаге. Нарисуйте коробки, представляющие ваши структуры данных: те, которые расположены в массивах и свободно плавающие, возвращаемые malloc. выпишите значения всех переменных. затем следуйте своему алгоритму шаг за шагом, заполняя поля со значениями, рисуя стрелки для указателей и т. д. Это может показаться перетаскиванием, но делать это наоборот - намного, гораздо больнее, когда вы получаете действительно странные ошибки.

Я добавлю комментарии к вашему коду (у которого, похоже, есть несколько проблем с самим алгоритмом, а не только с одной ошибкой). Продолжайте редактировать код в своем вопросе, когда вы его отлаживаете и находите больше ошибок. Я помогу.

Две ошибки, которые я нашел: ваша функция добавления всегда сводит список к двум элементам. ваш код будет гарантирован segfault в какой-то момент, потому что вы не устанавливаете последний указатель на NULL, чтобы не знать, где находится конец списка.

Самая большая проблема с вашим кодом заключается в том, что он слишком много пытается. вы не знаете, как реализовать список ссылок, и вы вскочили на реализацию массива ссылок. самый быстрый путь к боливиллу. Техническим термином в разработке программного обеспечения для принятия его по одному шагу является «единичный тест». google, чтобы увидеть, насколько фанатичны люди. : P

удачи!

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


add(struct node *arrayy[],int value) //arrayy is a array of pointers. 
{ 
    struct node *nodey = (struct node *)malloc(sizeof(struct node)); 
    nodey->x=value;// nodey will be at the end of the list, but nodey->link contains some garbage value. how will you know that this is the last element the next time you traverse the list. 

    if(arrayy[value]==NULL) // do you actually want the "value'th" element of the array or something else? 
    //is value the position or the contents? 
    { 
     printf("I am not pointing to something...now I am hehehe\n"); 
     arrayy[value]=nodey; 
    } 
    else 
    { 
     printf("I already have a head..now my link is pointing at something\n"); 
     while(arrayy[value]) 
     { 
      if(arrayy[value]->link==NULL) 
      { 
       arrayy[value]->link=nodey; 
       break; 
      } 
      arrayy[value]=arrayy[value]->link;//you are replacing arrayy[value] with the next element in the array. the malloced structs that was originally pointed to by arrayy[value] now has no pointer pointing to it, so there is no way to access those nodes. maybe you want a separate variable current node that you can modify without affecting the original link list : current_node=current_node->link ? Also, since you are "deleting" all the elements bu the last one before adding the new node, your list will never be more than 2 elements long 
     } 

    } 
} 

print(struct node *arrayy[]) 
{ 
    int x= 0; 

    for(x; x<10; x++) 
    { 
     while(arrayy[x]) 
     { 
      printf("%d",arrayy[x]->x); 
      arrayy[x]=arrayy[x]->link; //again, you are modifying the array as you read it. 
     } 
    } 

} 

main(void) 
{ 
    struct node *array[10]={NULL}; //you will have array of 10 pointers, each pointing to address 0. does this mean that you wnt 10 seperate lists? 
    add(array,1); 
    add(array,1);//debug by putting different values in different nodes 
    add(array,1); 
    printf("%d",array[1]->link->link->x); 
} 
Смежные вопросы