起初,我会对我的英语说抱歉,但我希望你能理解我,我需要快速的答案......
我正在用 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 条记录时,我可以删除它 - 它可以工作。
- 当我在列表中有 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
指向(需要检查(并可能删除(