首先,我会对我的英语说抱歉,但我希望你能理解我,我需要真正快速的答案......
我正在用 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 条记录时,我可以将其删除 - 它有效。
- 当列表中有 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
)进行检查(并可能删除)
关于c - 从线性列表中删除记录的问题 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118455/