gpt4 book ai didi

c - 删除链表中给定位置的节点

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:52 24 4
gpt4 key购买 nike

给定一个单向链表和一个位置,我试图删除特定位置的链表节点。代码:

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

struct node
{
int data;
struct node* next;
};

void printList(struct node* head_ref)
{
//struct node* head_ref = (struct node*)malloc(sizeof(struct node));

if(head_ref == NULL)
printf("The list is empty");

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

void insert_beg(struct node **head_ref,int new_data)
{
struct node* new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = new_data;
new_node->next = *head_ref;
*head_ref = new_node;
}

void delete(struct node **head_ref,int position)
{
int i=1;
if(*head_ref == NULL)
return;

struct node *tails,*temp = *head_ref;
if(position == 0)
{

*head_ref = temp->next;
free(temp);
return;
}

while(temp->next!=NULL)
{
tails = temp->next;
temp = temp->next;

if(i == position)
{
tails->next = temp->next;
free(temp);
return;
}

i++;
}

}

int main()
{
struct node *head = NULL;
insert_beg(&head,36);
insert_beg(&head,35);
insert_beg(&head,34);
insert_beg(&head,33);

printList(head);
int position;
printf("Enter the position of the node u wanna delete\n");
scanf("%d",&position);

delete(&head,position);
printf("\n");
printList(head);
}

每当我尝试删除位置 0 以上的节点时,我在该特定位置得到的是 0,而不是什么都没有。我能知道我哪里出错了吗?例如我的名单是:33 34 35 36我的输出:33 0 35 36(尝试删除节点 1 时)有效输出:33 35 36

最佳答案

问题是因为这个错误的语句导致的

while(temp->next!=NULL)
{
tails = temp->next;
^^^^^^^^^^^^^^^^^^^
temp = temp->next;

在这种情况下,tails 和 temp 是相同的节点。如果删除了 temp,则将已删除节点的数据成员 next 设置为 temp->next

    if(i == position)
{
tails->next = temp->next;
^^^^^^^^^^^^^^^^^^^^^^^^^

这里tails是要删除的节点。

您应该更改被删除节点之前的节点的下一个数据成员。所以错误的语句应该像这样更新

while(temp->next!=NULL)
{
tails = temp;
^^^^^^^^^^^^^
temp = temp->next;

至于我,那么我会按照下面的方式编写函数

int delete( struct node **head, size_t position )
{
struct node *prev = NULL;

size_t i = 0;

while ( i != position && *head != NULL )
{
prev = *head;
head = &( *head )->next;
++i;
}

int success = *head != NULL;

if ( success )
{
struct node *tmp = *head;

if ( prev == NULL )
{
*head = ( *head )->next;
}
else
{
prev->next = ( *head )->next;
}

free( tmp );
}

return success;
}

关于c - 删除链表中给定位置的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38659066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com