void del(struct node *l,int n) {
struct node *temp1=(struct node*)malloc(sizeof(struct node));
temp1=l;
if (l==NULL) {
printf("list already empty");
}
else if (n==1) {
l=l->next;
free(temp1);
}
else {
struct node *temp2=(struct node*)malloc(sizeof(struct node));
temp2=l;
int i,j=1;
while (i<(n-1)) {
temp1=temp1->next;
i++;
}
while (j<n) {
temp2=temp2->next;
j++;
}
temp1->next=temp2->next;
free(temp2);
}
}
所以这是我写的一个函数,用于从单链表中删除一个元素,但它没有给出所需的输出。有人能帮帮我吗?
您的函数不正确。至少,由于这些没有意义的内存分配,它会产生内存泄漏
struct node *temp1=(struct node*)malloc(sizeof(struct node));
struct node *temp2=(struct node*)malloc(sizeof(struct node));
第二个形参应该是无符号整数类型,并且列表中的位置应该从0开始。
函数不应该发出任何消息。函数的调用方决定是否在调用函数后发出消息。
函数可按以下方式定义
int del( struct node **head, size_t n )
{
while ( *head != NULL && n-- )
{
head = &( *head )->next;
}
int success = *head != NULL;
if ( success )
{
struct node *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
return success;
}
如果在main中声明了指向头节点的指针例如
struct node *head = NULL;
// filling the list
则可以像
这样调用函数size_t n = some_position;
del( &head, n );
或
if ( del( &head, n ) )
{
printf( "The node at position &zu is successfully deleted.n", n );
}
,其中n是列表中的某个位置。