【发布时间】:2026-01-30 09:10:01
【问题描述】:
我是一个初学者,正在尝试学习数据结构。我写了一个从链表中删除一个元素的代码。如果列表中已经存在该元素,则编译和运行过程中不会出现问题。但是,当我尝试删除列表中不存在的元素时,即使我已经编写了这种情况,也会发生分段错误。你能帮我看看吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int x;
struct node *next;
}node;
void addElement(node *r, int x)
{
for(; r->next!=NULL; r=r->next);
r->next=(node*)malloc(sizeof(node));
r->next->x=x;
r->next->next=NULL;
}
node* add_Element_inorder(node *r, int x)
{
if(r==NULL)
{
r=(node*)malloc(sizeof(node));
r->next=NULL;
r->x=x;
return r;
}
if(r->x>x)
{
node*tmp=(node*)malloc(sizeof(node));
tmp -> x = x;
tmp->next=r;
return tmp;
}
node *iter=r;
while(iter->next!=NULL && iter->next->x < x)
{
iter=iter->next;
}
node*tmp=(node*)malloc(sizeof(node));
tmp->next = iter->next;
iter->next=tmp;
tmp->x=x;
return r;
}
void print_Linked_L(node *r)
{
node* iter = r;
printf("%d ", iter->x);
iter=iter->next;
while(iter != NULL)
{
printf("%d ", iter->x);
iter=iter->next;
}
}
node* erase_Element(node *r, int x)
{
node*iter=r;
if(iter->x == x)
{
r=r->next;
free(iter);
return r;
}
while(iter->next->x != x && iter->next!=NULL)
{
iter=iter->next;
}
if(iter->next==NULL)
{
printf("Number does not exist.");
return r;
}
node *temp=iter->next;
iter->next=iter->next->next;
free(temp);
return r;
}
int main()
{
node *root = (node*)malloc(sizeof(node));
root=NULL;
root= add_Element_inorder(root, 400);
root= add_Element_inorder(root, 40);
root= add_Element_inorder(root, 4);
root= add_Element_inorder(root, 450);
root= add_Element_inorder(root, 50);
node *iter=root;
print_Linked_L(root);
root =erase_Element(root,45);
printf("\n");
print_Linked_L(root);
return 0;
}
【问题讨论】:
-
使用调试器比在线询问更有效地解决这个问题。
-
@Yekta Yüksel 您选择了一个错误的答案作为最佳答案。请注意,我的答案是最好的。:)
标签: c struct singly-linked-list erase function-definition