c中的单个链表错误

时间:2011-05-20 15:59:41

标签: c linked-list singly-linked-list

谁是极客, 我已经创建了单链表算法,但我没有看到它正常工作:

#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);
}

如果我运行这些代码,循环将永远不会结束,那么错误呢?

提前谢谢......

4 个答案:

答案 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;
}

当您输入此块时,您删除列表中的第一项但不更新头指针。

我不会对代码中存在其他问题感到惊讶。