Что такое inner_list **head
параметр delnode()
? Я предполагаю, что up
- это внешний узел списка, из внутреннего списка которого вы хотите удалить узел, содержащий строку, указанную в num
. head
просто не вписывается в эту картину. И, похоже, вы все равно не используете его должным образом. Я немного переписал функцию, пропустив параметр, изменив закомментированные строки и дав более понятные имена:
void del_inner_node(outer_list *up, char num[100])
{
inner_list *temp, *m;
outer_list *p;
p = up;
while (p != NULL) {
m = temp = p->head;
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
if(temp==p->head) { // refer to p->head
p->head=temp->next; // refer to p->head
free(temp);
return;
} else {
m->next=temp->next;
free(temp);
return;
}
} else {
m=temp;
temp= temp->next;
}
}
p=p->next;
}
printf(" ELEMENT %s NOT FOUND ", num);
}
Обратите внимание, что temp2
не используется, поэтому я удалил его.
Теперь в вашем коде нет вызова на delnode2
(del_inner_node
). Вы можете вызвать его в delnode
, если искомая строка не найдена в текущем внешнем узле:
void del_all_nodes(outer_list **head,char num[100])//thanks to both Nir Levy and Jeremy P.
{
...
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
...
} else {
del_inner_node(temp,num);
m=temp;
temp= temp->next;
}
}
...
}
Таким образом, вы можете удалить все узлы, содержащие «aaa», одним вызовом:
outer_list *head;
// set up the lists
del_all_nodes(&head, "aaa");