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



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

我正在用 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 zaznamovn", 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指向(需要检查(并可能删除(

相关内容

  • 没有找到相关文章

最新更新