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

标签 c function linked-list structure record

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

我正在用 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 条有一个带有城市名称的项目,例如伦敦,接下来的两条记录有一个带有城市名称华盛顿的项目,我在程序中调用这个函数,如“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)进行检查(并可能删除)

关于c - 从线性列表中删除记录的问题 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118455/

相关文章:

javascript - 用户将学生成绩输入到文本框输出中,然后计算最终的字母成绩

c - 如何在c中动态分配结构数组?

java - 在链表中打印反向

c - C 中的链表,链表构造正确吗?

c - 从文件中读取c

c - 链表附加函数在开头添加一个额外的空节点

c# - 可选参数无法正常工作

c - 指针数组中不兼容类型的赋值 (c)

c - 通过多个 IP 摄像机捕获视频数据包

linux - 位置参数上 ls 命令的退出状态