有人能结束这个算法吗?
void trinti_pasikartojancius(struct el * *prad, struct el * *pab, struct el * elem){
struct el *g, *elemk;
int i =1;
g = *prad;
elem= elem->kitas;
if(g->duom == elem->duom){
elem->kitas->pries = elem->pries;
elem->pries->kitas = elem->kitas;
free(elem);
if( g->kitas != NULL){
g = g->kitas;
g->pries = NULL;
free( *prad );
*prad = g;
}
else{
free ( *prad );
*prad = NULL;
*pab = NULL;
}
}
}
(通过谷歌翻译将变量名翻译成英文)我相信这个问题应该是"有人能完成这个算法吗?")
void delete_duplicate (struct e ** start, struct ** e end, struct elem * e) {
struct e * g * elemk;
int i = 1;
g = * start;
elem = elem-> next;
if (g-> conn == elem-> data) {
elem-> next-> v = elem-> before;
elem-> v-> next = elem-> next;
free (items);
if (g-> next! = NULL) {
g = g-> next;
g-> before = NULL;
free (* start);
* start = g;
}
else {
free (* start);
* start = NULL;
* end = NULL;
}
}
}
假设(正如Google告诉我的)pries和kitas是立陶宛语的"上一个"one_answers"下一个",那么我们有一个双链表,我想我们正在删除一个元素。
问题似乎是你的if
/else
周围没有一个循环。在编写程序时,如果没有循环,g->duom == elem->duom
不可能为真,除非prad
(start)为elem
。
但是既然你已经知道要删除的节点(elem
),为什么要寻找它?从下面开始:
elem->kitas->pries = elem->pries;
elem->pries->kitas = elem->kitas;
free(elem);
这将从它所在的列表中删除elem
。
但是,您可能还需要注意两个条件。elem
可以是列表的开始(prad
),也可以是列表的结束(pab
),或者两者兼而有之。因此,如果这些是重要的(有时它们不是),请单独检查它们。
如果你想要/需要偏执,你也应该循环遍历列表(完全像一个搜索例程,我假设你已经写了),以确保prad
, pab
和elem
都是同一个列表的一部分。
如果您需要更完整的过程指南,这里有一个完整的示例程序,其中实现了每个列表操作。它可能不适用于您的应用程序,但至少在您迷路时为您指明了前进的方向。
编辑:在进行了更深入的翻译尝试之后,我现在看到了发生了什么。删除重复的elem
参数更有意义。
while (g != NULL) {
/* Your existing, indented code here */
g = g->kitas;
}