使用指针创建列表

时间:2015-05-20 08:31:57

标签: c pointers linked-list malloc

我想创建一个链表并保留两个指针。一个用于头部,一个用于最后一个元素。我尝试了几种方法,只是找到了解决方案,但我不知道为什么我的第一个解决方案不起作用。 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/%d\n", 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/%d\n", lastElement->p.x, lastElement->p.y);
    printf("head -> next: %d/%d\n", head->next->p.x, head->next->p.y);
    printf("finish\n");
    return 0;
}

输出:

LastElement: 5/5
LastElement: 8/8
LastElement: 9/9
head -> next: 9/9
finish

但它应该是:head - &gt;下一个: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/%d\n", 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/%d\n", lastElement->p.x, lastElement->p.y);
    printf("head -> next: %d/%d\n", head->next->p.x, head->next->p.y);
    printf("finish\n");
    return 0;
}

使用了struct:

struct pointList {
    struct point p;
    struct pointList *prev;
};

1 个答案:

答案 0 :(得分:1)

第一个代码片段的问题在于您获取并使用指向局部变量的指针。变量newElement的范围仅在循环内,因此当循环迭代时,当前newElement变量超出范围,并且您将留下一个迷路指针。这会导致未定义的行为

您还为helpPoint分配内存,但实际上并没有使用它(当您使用newElement初始化helpPoint时,使用另一个未初始化的结构初始化一个未初始化的结构),以及你不会在任何导致内存泄漏的地方释放它。