有人能告诉我这个函数是如何工作的吗?这是我的结构:
struct el{
int key;
struct el *next;
};
typedef struct el elListy;
typedef elListy *list;
这就是功能:
void delete(list *l, int zm)
{
list p, *k;
k = l;
while ((*k))
{
if ((*k)->key == zm) {
p = *k;
*k = (*k)->next;
free(p);
}
else
{
k = &(*k)->n;
}
}
}
如果有人能举例说明,那就太棒了。
我没有试过,但我很乐意帮助你。让我们来看看。正如其他用户所建议的那样,双重typedef真的很烦人;代码一点也不清楚,理解这段代码的作用更为复杂。结构的组成是关于一个键、一个标签和一个指向下一个结构的指针。函数delete()
将其作为参数的int zm
与链表的任何节点进行比较。第二个参数是链表根指针或起始指针。
关于功能:换句话说,函数是读取链表的任何值(key),并将其与int zm进行比较。如果key不同,(*k)将是下一个指针。此方法允许从起始节点参数读取每个节点。注意最后一行n
应为next
。
如果key和zm相等,函数会用free()
函数释放列表的节点(因为链表节点通常是用malloc或calloc函数构建的),并设置k的值(它是一个双指针,(*k)是第一个指针的值)也是指向下一个指针的指针,以便检查下一个节点并在需要时删除它。
特别是,如果zm等于密钥,则函数:
-
将指针的值保存在p变量中;
-
设置k指向下一个结构,因为while条件是在k值上配置的,并且可以找到2个或多个具有相同键的节点;
-
释放p所指向的正确内存;
重点关注两件事很重要:1) 设置k个值指向下一个结构很重要,因为它可以防止代码不停在它找到的第一个值。2) while条件(*k)表示您正在检查k的值,这是一个指针,直到它为NULL,这意味着结束。
希望它足够清楚,我在这里寻求其他帮助。
风险自负!!!
// sory i have chaged the names, this will make it litle bit clearer
typedef struct elment elment, *p_elment;
typedef p_elment *list;
struct elment{
int key;
p_elment next;
p_elment prev; // you will need it;
};
void delete(list *l, int zm) {
p_elment k,p;
k = (p_elment) *l; // cast to avoid warnings
while (k){
p = k;
k=k->next;
if (p->key == zm) {
if (*l == p)
*l=p->next;
if(p->prev)
p->prev->next = p->next;
if(p->next)
p->next->prev = p->prev;
free(p);
}
}
}