为什么我在这个链表中出现了界限错误? C

时间:2015-06-01 07:41:10

标签: c linked-list

所以我正在制作链表。打印出来。并扭转它。然后将其打印出来。我第一次制作并打印出来。一切正常。但当我扭转它。它成功逆转。但是当我打印它。即使我使用与之前相同的代码,我也会走出界限。

这是反向功能

void reverse_list(Node_ptr* head){

Node_ptr temp2;
Node_ptr temp3 = NULL;
temp2 = (Node_ptr)malloc(sizeof(Node));
temp3 = (Node_ptr)malloc(sizeof(Node));

if (temp2==NULL || temp3==NULL)
{
    printf("Failed to allocate node\n");
    exit(1);
}

while (*head!=NULL) {
     temp2 = (*head)->next;
    (*head)->next = temp3;
    temp3 = (*head);
    (*head) = temp2;
}
 *head = temp3;

}

这是打印功能

temp = head;
while (temp != NULL)
{
    printf("%d\n", temp->data);
    temp = temp->next;
}

reverse_list(&head);

temp = head;

while (temp != NULL)
{
    printf("%d\n", temp->data);
    temp = temp->next;
}

由于某种原因,它试图在最后一个元素

之后打印垃圾

2 个答案:

答案 0 :(得分:5)

这样做:

/* Function to reverse the linked list */
void reverse(struct node** head_ref)
{
    struct node* prev   = NULL;
    struct node* current = *head_ref;
    struct node* next;

    while (current != NULL)
    {
        next  = current->next;  
        current->next = prev;   
        prev = current;
        current = next;
    }

    *head_ref = prev;
}

实际上你的代码有几个固定装置,即:

1)你不需要分配空间,只需交换指针。

2)为临时容器使用有意义的名称。

答案 1 :(得分:1)

第一次进行循环

while (*head!=NULL) {
     temp2 = (*head)->next;
    (*head)->next = temp3;
    temp3 = (*head);
    (*head) = temp2;
}

(* head) - > next被分配一个新分配的节点。谁知道这个节点包含什么?它可能没有归零,并且会指向内存中的随机点。

您应该将temp3初始化为NULL以解决此问题。