c - 从线性列表中删除记录的问题 (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 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
)要检查(并可能删除)
推荐阅读
- python - 如何为每个地区的每一年做一个堆积条形图来计算 Quantity_Sold 的总和(或平均值)?Python
- c++ - 与条件变量相比,队列应用程序中的 C++20 信号量似乎很慢
- html - 如何在行内块 div 之间强制中断
- bootstrap-4 - 引导图像覆盖背景图像
- r - R 上的双向 ANOVA 中没有 P 或 F 值
- javascript - 更改每第二个 TR 的 Table TR 背景颜色,但如果 CCS / Javascript 中没有显示则忽略
- python - PYOMO:使用集合和参数定义数据集以解决优化问题
- python - 使用 OpenCV 绘制带有大轴的椭圆
- python - 在 Python pandas 中转置数据帧
- docker - 使用 Docker 映像作为 azure 管道构建代理时出现“找不到模块”