#include <stdio.h>
#include <stdlib.h>
/*
*
*/
typedef struct _data_konfirm
{
char *id;
char *buff;
int v;
struct _data_konfirm *next;
}data_konfirm;
void data_add(data_konfirm **data,char *id,char *buff,int v)
{
data_konfirm *tmp = (data_konfirm*)malloc(sizeof(data_konfirm));
tmp->id = strdup(id);
tmp->buff = strdup(buff);
tmp->v = v;
tmp->next = *data;
*data = tmp;
}
void data_destroy(data_konfirm **data)
{
data_konfirm *b = *data;
free(b->id);
free(b->buff);
free(b);
}
void data_del(data_konfirm **data,char *id)
{
data_konfirm *tmp = *data, *b = NULL;
if(!strcmp(tmp->id,id))
{
b = tmp;
tmp = tmp->next;
data_destroy(&b);
return;
}
while(tmp->next->next != NULL)
{
if(!strcmp(tmp->next->id,id))
{
b = tmp->next;
tmp->next = b->next;
data_destroy(&b);
return;
}
tmp = tmp->next;
}
if(!strcmp(tmp->next->id,id))
{
b = tmp->next;
data_destroy(&b);
tmp->next = NULL;
return;
}
}
void inform_show_all(data_konfirm **data)
{
data_konfirm *tmp = *data;
int i = 0;
while(tmp)
{
printf("id -> %s\n",tmp->id);
printf("buff -> %s\n",tmp->buff);
i++;
tmp = tmp->next;
}
printf("jumlah data : %d\n",i);
}
int main(int argc, char** argv) {
data_konfirm *a = NULL;
data_add(&a,"1","silit",2);
data_del(&a,"1");
data_add(&a,"2","wwww",1);
data_add(&a,"3","zzz",2);
data_add(&a,"4","huaaa",2);
data_del(&a,"3");
inform_show_all(&a);
return (EXIT_SUCCESS);
}
如果我运行这些代码,循环将永远不会结束,那么错误呢?
提前谢谢......
答案 0 :(得分:1)
我不喜欢只提供代码,但data_del
函数是一团糟。试试这个:
void data_del(data_konfirm **data,char *id)
{
while( *data != NULL )
{
data_konfirm* tmp = *data;
if( strcmp( tmp->id, id ) == 0 )
{
*data = tmp->next; /* remove tmp from list */
data_destroy( &tmp );
break;
}
data = &tmp->next;
}
}
公平警告,我实际上没有测试过这个。
答案 1 :(得分:1)
在函数data_del中替换
b = tmp;
tmp = tmp->next;
与
b = *data;
*data = (*data)->next;
以下是情况图:
*data -> +---+ +---+
tmp -> | | | -> ... -> | | |
b -> +---+ +---+
语句tmp = tmp-&gt; next不会更新指针* data。
答案 2 :(得分:0)
如果您的data_del
函数需要删除列表的头节点,它将不会将头设置为下一个元素,因此您将留下指向已释放节点的指针。在这种情况下,你应该做的是将*data
设置为新的头部。
你也遇到data_del
无法处理空列表的问题:在这种情况下,它会尝试访问空指针。
答案 3 :(得分:0)
data_del
开头的这个位不能正确:
if(!strcmp(tmp->id,id))
{
b = tmp;
tmp = tmp->next;
data_destroy(&b);
return;
}
当您输入此块时,您删除列表中的第一项但不更新头指针。
我不会对代码中存在其他问题感到惊讶。