从线性列表中删除记录时出现问题(C)

从线性列表中删除记录时出现问题(C),c,function,linked-list,structure,record,C,Function,Linked List,Structure,Record,首先,我会为我的英语说抱歉,但我希望你能理解我,我需要真正快速的答案 我正在用C语言编写我的项目,在从线性列表中删除记录时遇到了一些问题。 我从文本文件中读取记录,并将其写入线性链表。我不会在这里发布整个程序,只是函数vstup_z 这些记录类似于房屋和公寓的数据库,它们的价格、城市、费用等。此函数正在扫描字符串,当扫描的字符串是表示城市名称的项目的子字符串时,它应该删除整个特定记录。例如,当我的记录中有一些来自伦敦的公寓,我将在程序中调用此函数,例如z Lon,此函数将删除此记录 下面是我函数

首先,我会为我的英语说抱歉,但我希望你能理解我,我需要真正快速的答案

我正在用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%正常工作的函数中,我正在显示器上写这个链表

我有什么问题

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

我不能删除所有记录。 例如,当我在列表中有一条记录时,我可以删除它——它可以工作。 当我在列表中有5条记录时,我可以删除其中4条,但不能全部删除,这是一个问题。。。 当我有5条记录,其中3条记录有一个项目的名称为城市,例如伦敦,接下来的两条记录有一个项目的名称为城市华盛顿,我在程序中调用此函数,如z o-它应该删除每个记录,其中表示城市名称的项目包含字符o;这意味着它应该删除所有这些内容。但它总是会保存最后一条记录,但当我的列表只包含一条记录时,它会立即将其删除。 对不起,我的英语不好。我希望你能理解;如果没有,没关系

有什么解决办法吗

关于:

 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指向的列表中仍有一个条目需要检查并可能被删除

请阅读。StackOverflow不是一个“做我的作业”论坛,你的兴趣是学习如何自己做作业。调试技能对每个软件开发人员都是必不可少的。另见关于:getsarr_市;函数:get已经贬值了几年,并且从最新版本的C语言标准中完全删除。强烈建议使用具有不同参数列表的fgets,阅读手册页了解有关C编程的详细信息,也可以阅读,或者浏览一下。避免使用和过时的函数,如gets。考虑使用,相反,关于链表,读取。您可能希望使用调试动态内存问题如下:例如,z Lon,这似乎表明要删除的选定城市来自命令行参数,但实际代码期望用户键入该城市。请澄清。