0

仲間のオタク、私は単一のリンクされたリストアルゴリズムを作成しましたが、それが適切に機能するのを見ませんでした:

#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

4 に答える 4

1

関数内 data_del 置換

b = tmp;
tmp = tmp->next;

b = *data;
*data = (*data)->next;

状況の写真は次のとおりです。

*data -> +---+           +---+
  tmp -> | | | -> ... -> | | |
    b -> +---+           +---+

ステートメント tmp = tmp->next はポインター *data を更新しません。

于 2011-05-20T16:22:26.050 に答える
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;
    }
}

公正な警告、私は実際にこれをテストしていません。

于 2011-05-20T16:17:24.223 に答える
0

data_del関数がリストのヘッドノードを削除する必要がある場合、ヘッドは次の要素に設定されないため、解放されたノードへのポインターが残ります。その場合、あなたがすべきことは*data新しい頭に設定されます。

空のリストを操作しないという問題もあり data_delます。その場合、nullポインタにアクセスしようとします。

于 2011-05-20T16:20:22.703 に答える
0

冒頭のこのビットはdata_del正しくありません:

if(!strcmp(tmp->id,id))
{
    b = tmp;
    tmp = tmp->next;
    data_destroy(&b);              
    return;
}

このブロックに入ると、リストの最初の項目が削除されますが、ヘッドポインターは更新されません。

コードに他の問題があることに驚かないでしょう。

于 2011-05-20T16:21:38.907 に答える