C语言 试图从特定位置删除节点.但是我只能在终端输入位置1时删除



运行代码后,程序询问要从哪个位置删除节点。我运行代码,但它只在我输入位置1时工作。对于其他位置,如2,3,4,它不工作。

这里我想在节点的末尾插入数字:

void Insert(int data)
{
struct node* temp1;
temp1=(struct node*)malloc(sizeof(struct node));
temp1->data=data;
temp1->next=NULL;
if (head==NULL){
temp1->next=head;
head=temp1;
}
else{
struct node* temp2;
temp2=head;
while(temp2->next!=NULL)
{
temp2=temp2->next;
}
temp2->next=temp1;
}
}

打印功能:

void Print()
{
struct node*temp99;
temp99=head;
while(temp99!=NULL){
printf(" %d",temp99->data);
temp99=temp99->next;
}
printf("n");
}

删除功能:

void Delete(int n)
{
struct node* temp33;
temp33=head;
if (n==1)
{
head=temp33->next;
free(temp33);
}
else{
int i;
for (i=0;i<n-2;i++)
{
temp33=temp33->next;
}
struct node* temp44;
temp44=temp33->next;
temp44->next=temp33->next;
free(temp44);
}
}

temp44->next=temp33->next;替换为temp33->next=temp44->next;

给你的变量起更好的名字。

对于初学者,索引从0开始。其次,函数参数必须为无符号整数类型,例如size_t

当n不等于1时,这些指针操作

struct node* temp44;
temp44=temp33->next;
temp44->next=temp33->next;
free(temp44);

没有意义。例如,指针temp33的数据成员next不改变。

还有这个for循环

for (i=0;i<n-2;i++)
{
temp33=temp33->next;
}

可以调用未定义行为,因为没有检查temp33是否不等于NULL

甚至这个代码片段

if (n==1)
{
head=temp33->next;
free(temp33);
}

可以在列表为空时调用未定义行为,即当head等于NULL时。

函数可按以下方式定义

int Delete( size_t n ) 
{
struct node **current = &head;
while ( *current != NULL && n )
{
current = &( *current )->next;
--n;
}
int success = *current != NULL;
if ( success )
{
struct node *node_to_delete = *current;
*current = ( *current )->next;
free( node_to_delete );
}
return success;
}

相关内容

  • 没有找到相关文章

最新更新