Программирование, это отношения с компьютером. Вы должны хотите, чтобы заставить его работать, или вы сдаетесь; вам нужно понять, как она думает, или вы не сможете общаться; и, прежде всего, вам должно быть ясно, что вы вы, 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);
}
В менее чем 60 строках кода, включая пробелы, наиболее полезной вещью, которую вы собираетесь услышать, является следующее: ** научиться отлаживать **. Вы потратите половину своей профессиональной карьеры, сделав именно это, и вы также можете начать сейчас. Вы не можете ожидать, что кто-то другой отладит его для вас. – WhozCraig