C Linked List - 理解,如何删除列表中的相同元素
C Linked List - understending, how to delete the same element on list
有人可以告诉我,这个功能怎么可能起作用吗?
这是我的结构:
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;
}
}
}
如果有人能说明,那就太棒了。
我没试过,但我很乐意帮助你。让我们来看看。正如其他用户所建议的那样,double typedef 真的很烦人;代码根本不清楚,理解这段代码的作用更加复杂。结构组合是关于键、标签和指向下一个结构的指针。函数 delete()
正在将他的 int zm
作为参数与链表的任何节点进行比较。第二个参数是链表根指针,也就是起始指针。
关于功能:
换句话说,该函数正在读取链表的任何值(键)并将其与 int zm 进行比较。如果 key 不同,(*k) 将是下一个指针。此方法允许从起始节点参数读取每个节点。注意最后一行 n
应该是 next
.
如果key和zm相等,函数用free()
函数释放链表的节点(因为链表节点通常是用malloc或calloc函数构建的)并设置k的值 -这是一个双指针,第一个指针的值 (*k) 也是一个指针 - 指向下一个指针,以便检查下一个节点并在需要时将其删除。
特别是,如果 zm 等于键,函数:
将指针的值保存在p变量中;
设置k指向下一个struct,因为while条件是配置在k值上的,有可能找到2个或更多具有相同key的节点;
释放 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);
}
}
}
有人可以告诉我,这个功能怎么可能起作用吗? 这是我的结构:
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;
}
}
}
如果有人能说明,那就太棒了。
我没试过,但我很乐意帮助你。让我们来看看。正如其他用户所建议的那样,double typedef 真的很烦人;代码根本不清楚,理解这段代码的作用更加复杂。结构组合是关于键、标签和指向下一个结构的指针。函数 delete()
正在将他的 int zm
作为参数与链表的任何节点进行比较。第二个参数是链表根指针,也就是起始指针。
关于功能:
换句话说,该函数正在读取链表的任何值(键)并将其与 int zm 进行比较。如果 key 不同,(*k) 将是下一个指针。此方法允许从起始节点参数读取每个节点。注意最后一行 n
应该是 next
.
如果key和zm相等,函数用free()
函数释放链表的节点(因为链表节点通常是用malloc或calloc函数构建的)并设置k的值 -这是一个双指针,第一个指针的值 (*k) 也是一个指针 - 指向下一个指针,以便检查下一个节点并在需要时将其删除。
特别是,如果 zm 等于键,函数:
将指针的值保存在p变量中;
设置k指向下一个struct,因为while条件是配置在k值上的,有可能找到2个或更多具有相同key的节点;
释放 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);
}
}
}