起初,我会为我的英语说抱歉,但我希望您能理解我,我需要非常快速的回答...
我正在用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%正常工作),我正在显示器上写此链接列表...
我有什么问题?
关于我的问题的一般信息:
对不起,我的英语不好。我希望你明白;如果没有,没关系...
任何解决方案?
关于:
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
指向)要检查(并且可能被删除)