中断导致运行时错误

时间:2017-02-24 02:18:11

标签: c linked-list break

我正在尝试编写一个简单的程序来在链表中插入节点。以下是它的外观:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int data;
    struct Node *next;
}Node;

void insert (Node **head, int data, int pos)
{
    Node *left, *right, *newNode;
    newNode = (Node *)malloc(sizeof(Node));
    int i;

    newNode->data = data;
    right = *head;
    if (pos == 0)
    {
        newNode->next = right;
        *head = newNode;
    }
    else
    {
        for (i = 0; i<pos; i++)
        {
            left = right;
            right = right->next;
            if (right->next == NULL)
            {
               //break; 
            }
        }
        if (i == pos)
        {
            left->next = newNode;
            newNode->next = right;
        }
        else
        {
            printf("Cannot insert at the given position");
        }
    }
}

void printLinkedList (Node *head)
{
    while(head != NULL)
    {
        printf("%d\t", head->data);
        head = head->next;
    }
    printf("\n");
}

int main(void) {
    Node *head = NULL;
    insert(&head, 1, 0);
    printLinkedList(head);
    //insert(&head, 2, 5);
    //printLinkedList(head);
    insert(&head, 2, 1);
    printLinkedList(head);
    insert(&head, 3, 1);
    printLinkedList(head);
    insert(&head, 4, 3);
    printLinkedList(head);
    return 0;
}

除了if(right-&gt; next == NULL)循环中的break语句外,其他一切都正常。我想添加这个,所以如果输入位置是一个大于链表长度的值,那么我只是打破并打印我们无法在该给定位置插入一个节点。 但不知何故,这个break语句给我一个运行时错误。

我在这里做错了什么?

编辑:感谢输入 这修好了它:

for (i = 0; i<pos; i++)
{
    if (right == NULL)
    {
        break; 
    }
    left = right;
    right = right->next;
}

2 个答案:

答案 0 :(得分:1)

这不是崩溃的突破。这是if (right->next == NULL)崩溃的原因。删除中断使其不崩溃的唯一原因是编译器然后删除空的if块。 if语句崩溃的原因是right是NULL,因此取消引用它是不合法的。

问题的根本原因是您在执行right = right-&gt; next后立即检查右键 - >接下来,因此您基本上跳过了其他所有元素。

答案 1 :(得分:1)

If(right==NULL)

相反

If(right->next==NULL)

这应该有效。由于您已将右指针移动到下一个指针,因此右指针可能为NULL。

或更好

left = right;
If(right->next == NULL)
    break;
right = right->next;