我想创建一个向量的链接列表,并在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里面,每当鼠标左键被点击时,我想用当前的x和y值更新P向量,并将它们追加到链接列表中。
这就是这部分代码。
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;
这里的append函数是我从geekforgeeks上写的,并在最后添加了一个while循环来检查值是否被正确添加,但是我得到了溢出。
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;
}
为了创建一个节点,我写了这个函数
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;
}
每次我运行这个程序并点击出现的窗口时,在终端上append函数中的printf会输出以下内容
-732680176 -729092496
0 -1344244448
我应该做哪些修改才能不被溢出并成功添加当前值?
新节点是在函数 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;
}