我正在尝试编写一个简单的程序来在链表中插入节点。以下是它的外观:
#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;
}
答案 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;