Добавление координат кликов с в связанный список - PullRequest
1 голос
/ 30 апреля 2020

Я хочу создать связанный список векторов и с помощью библиотеки GLUT получить позиции кликов и добавить их в связанный список.

Это структуры, которые я написал.

typedef struct vector{int x;int y;}Vector;
typedef struct VectorList{Vector X; struct VectorList*next; }node_v;

Я глобально определил вектор P и связанный список векторов prev.

Vector P;
node_v * prev=NULL;

Внутри функции обратного вызова мыши _mouse_CB каждый раз, когда нажимается левая кнопка мыши, я хочу обновить вектор P текущими значениями x и y и добавить их в связанный список.

Это та часть кода.

static void _mouse_CB(int button, int state, int x, int y)
{
    if(state==GLUT_DOWN)
    {
        switch(button)
        {
        case GLUT_LEFT_BUTTON :
            px=x;py=y;
            P.x=x;
            P.y=y;
            prev=VL_new1(P);

            append(&prev,P);
            break;

функция добавления здесь, которую я написал от geeksforgeeks и добавил некоторое время l oop в конце, чтобы проверить, правильно ли добавлены значения, но я получаю переполнение.

void append(node_v** head_ref, Vector A)
{ 
    node_v* new_node = (node_v*) malloc(sizeof(node_v)); 

    node_v *last = *head_ref;  

    new_node->X.x  = A.x; 
      new_node->X.y  = A.y; 
    new_node->next = NULL; 

    if (*head_ref == NULL) 
    { 
       *head_ref = new_node; 
       return; 
    }   
    while (last->next != NULL) 
        last = last->next; 
    last->next = new_node; 
    last = *head_ref;
    while(last){
      printf("%d %d\n", last->X.x,last->X.y);
      last = last->next;
    }
    return;     
} 

Чтобы создать узел i написал эту функцию

node_v* VL_new1(Vector A){
        node_v *new = (node_v*)malloc(sizeof(node_v));
        if(new==NULL){exit(1);}
        else{
            new->X.x  = A.x; 
            new->X.y  = A.y; 
            new->next = NULL;
        }
        return new;
}

Каждый раз, когда я запускаю эту программу и нажимаю на появившееся окно, на терминале функция printf внутри приложения выводит это

-732680176 -729092496
0 -1344244448

Какие изменения я должен внести в не получить переполнение и успешно добавить текущие значения?

1 Ответ

2 голосов
/ 30 апреля 2020

Новый узел создается в функции append:

node_v* new_node = (node_v*) malloc(sizeof(node_v));

Инструкция prev=VL_new1(P); создает новый заголовок списка. Каждый раз, когда выполняется код, устанавливается prev, а предыдущее содержимое prev теряется.

Удалить, если:

case GLUT_LEFT_BUTTON :
    px=x;py=y;
    P.x=x;
    P.y=y;
    append(&prev,P);

Обратите внимание, что функцию VL_new1 можно вызвать в append вместо:

void append(node_v** head_ref, Vector A)
{ 
    node_v *last = *head_ref;
    node_v* new_node = VL_new1(A); 

    if (*head_ref == NULL) 
    { 
       *head_ref = new_node; 
       return; 
    }

    while (last->next != NULL) 
        last = last->next; 
    last->next = new_node;
}
...