我想创建一个链表并保留两个指针。一个用于头部,一个用于最后一个元素。我尝试了几种方法,刚刚找到了一个解决方案,但我不知道为什么我的第一个解决方案不起作用。head->next中的指针总是指向最后一个元素,而不是指向正确的元素。
int main(void){ // first solution
struct pointList *lastElement;
struct pointList *head;
struct pointList headHelp = {.next = NULL, .p.x = 5, .p.y = 5};
head = &headHelp;
int i = 0;
lastElement = &headHelp;
for( i = 8; i < 10; i++){
printf("LastElement: %d/%dn", lastElement->p.x, lastElement->p.y);
struct pointList *helpPoint;
helpPoint = ((struct pointList*) malloc(sizeof(struct pointList)));
struct pointList newElement = *helpPoint;
newElement.next = NULL;
newElement.p.x = i;
newElement.p.y = i;
lastElement->next = &newElement;
lastElement = &newElement;
}
//printList(head);
printf("LastElement: %d/%dn", lastElement->p.x, lastElement->p.y);
printf("head -> next: %d/%dn", head->next->p.x, head->next->p.y);
printf("finishn");
return 0;
}
输出:LastElement: 5/5
LastElement: 8/8
LastElement: 9/9
head -> next: 9/9
finish
,但应该是:head -> next: 8/8因此,head的"next"指针在每次循环执行中都会改变
解决方案是这样的:
int main(void){
struct pointList *lastElement;
struct pointList *head;
struct pointList headHelp = {.next = NULL, .p.x = 5, .p.y = 5};
head = &headHelp;
int i = 0;
lastElement = &headHelp;
for( i = 8; i < 10; i++){
printf("LastElement: %d/%dn", lastElement->p.x, lastElement->p.y);
lastElement->next = ((struct pointList*) malloc(sizeof(struct pointList)));
lastElement->next->next = NULL;
lastElement->next->p.x = i;
lastElement->next->p.y = i;
lastElement = lastElement->next;
}
//printList(head);
printf("LastElement: %d/%dn", lastElement->p.x, lastElement->p.y);
printf("head -> next: %d/%dn", head->next->p.x, head->next->p.y);
printf("finishn");
return 0;
}
使用结构体:
struct pointList {
struct point p;
struct pointList *prev;
};
第一个代码片段的问题是,您获取并使用了指向局部变量的指针。变量newElement
仅在循环内具有其作用域,因此当循环迭代时,当前的newElement
变量超出了作用域,并且您留下了一个偏离的指针。这会导致未定义行为。
您还为helpPoint
分配内存,但您实际上并不使用它(当您使用helpPoint
初始化newElement
时,您使用另一个未初始化的结构初始化一个未初始化的结构),并且您不会在任何地方释放它导致内存泄漏。