从线性列表(C)中删除记录的问题

问题描述 投票:-2回答:1

起初,我会为我的英语说抱歉,但我希望您能理解我,我需要非常快速的回答...

我正在用C语言将项目编码上学,从线性列表中删除记录时遇到了一些麻烦。我正在从文本文件中读取记录,并将其写入线性链接列表。我不会在这里发布整个程序,只发布函数“ vstup_z”。

这些记录类似于房屋和公寓的数据库(它们的价格,城市,房屋等)。此功能正在扫描字符串,并且当扫描的字符串是表示城市名称的项的子字符串时,它应该删除整个特定记录。例如,当我在记录中有一些伦敦的公寓,并且我将在程序中调用此函数(例如“ z Lon”)时,此函数将删除该记录。

这是我函数的一些代码:

void vstup_z(REALITY **p_first)
{
    REALITY *p_act = NULL, *p_help = NULL;
    char s[51] = "", arr_city[51] = "", city[51] = "";
    int counter = 0, i = 0;

    getchar();
    gets(arr_city);

// this function is working even with upper or lower case, it doesnt matter
    for (i = 0; i < strlen(arr_city); i++)  
    {
        arr_city[i] = tolower(arr_city[i]);
    }

    p_act = *p_first;
    while (p_act != NULL)
    {
        strcpy(city, p_act->miesto_ponuky); //miesto_ponuky is item in my record in slovak language
        for (i = 0; i < strlen(city); i++)
        {
            city[i] = tolower(city[i]);
        }

        if ((strstr(city, arr_city)) != NULL)
        {
            if (p_act != *p_first)
            {
                p_help->p_next = p_act->p_next; //one of the items in my record (structure) is pointer on next record
                free(p_act);
                p_act = p_help;
            }
            else
            {
                *p_first = p_act->p_next;
                free(p_act);
                p_act = *p_first; 
            }

            counter++; // how many records did i deleted
        }   

        p_help = p_act;
        if (p_act != NULL)
        {
            p_act = p_act->p_next;  
        }

    }   
    printf("Vymazalo sa %d zaznamov\n", counter); // just some text in slovak language how many records i deleted... 
}

在我的下一个功能中(正在100%正常工作),我正在显示器上写此链接列表...

我有什么问题?

关于我的问题的一般信息:

  1. 我无法删除所有记录。
  2. 例如,当我在列表中有1条记录时,我可以将其删除-可以。
  3. 当我在列表中有5条记录时,我可以删除其中4条记录,但不能删除所有记录,这是一个问题...
  4. [当我有5条记录时,其中3条记录中有一个名称为城市的项目,例如伦敦,接下来的2条记录中有一个名称为城市华盛顿的项目,我在程序中将该函数称为“ zo” -它应该删除每条记录,其中记录城市名称的项目包含字符“ o”;这意味着它应该删除所有这些。但是它将始终保存最后一条(但是当我的列表仅包含一条记录时,它将被正确删除)。

对不起,我的英语不好。我希望你明白;如果没有,没关系...

任何解决方案?

c function linked-list structure record
1个回答
0
投票

关于:

 while (p_act != NULL)
 ...
 p_help = p_act;

 if (p_act != NULL)
 {
     p_act = p_act->p_next;  
 }

该语句:p_act = p_act->p_next;使p_act指向NULL,但是,列表中仍然有一个条目(由p_help指向)要检查(并且可能被删除)

© www.soinside.com 2019 - 2024. All rights reserved.