实际上,这是另一个问题,但是它改变了,所以我决定打开一个新问题。
我的代码是
typedef struct inner_list
{
int count;
char word[100];
inner_list*next;
} inner_list;
typedef struct outer_list
{
char word [100];
inner_list * head;
int count;
outer_list * next;
} outer_list;
void delnode(outer_list **head,char num[100])//thanks to both Nir Levy and Jeremy P.
{
outer_list *temp, *m;
m=temp=*head; /*FIX #1*/
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
if(temp==*head) {
delinner(temp->head); /* FIX#2 */
*head=temp->next;
free(temp);
return;
} else {
delinner(temp->head); /* FIX#2 */
m->next=temp->next;
free(temp);
return;
}
} else {
m=temp;
temp= temp->next;
}
}
printf(" ELEMENT %s NOT FOUND ", num);
}
void delinner(inner_list *head) { /* FIX#2 */
inner_list *temp;
temp=head;
while(temp!=NULL) {
head=temp->next;
free(temp);
temp=head;
}
}
void delnode2(outer_list *up,inner_list **head,char num[100])
{
inner_list *temp2,*temp, *m;
outer_list *p;
p = up;
while(p!=NULL){m=temp=temp2=p->head;
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
if(temp==(*head)) {
*head=temp->next;
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);
}
void print_node(outer_list *parent_node)
{
while(parent_node!=NULL){
printf("%s\t%d\t", parent_node->word, parent_node->count);
inner_list *child_node = parent_node->head;
printf("list: ");
if(child_node ==NULL){printf("BUARADA");}
while (child_node != NULL) {
printf("%s-%d", child_node->word,child_node->count);
child_node = child_node->next;
if (child_node != NULL) {
printf("->");
}
}
printf("\n");
parent_node = parent_node->next;
}
}
从外部列表中删除元素时,我也尝试从inner_list中删除同一元素。
例如:-假设aaa是external_list链表的一个元素,并用external_list * p指向它-这个aaa也可以在inner_list链表中。 (它可以在p-> head或其他内部列表中。)现在,再次介绍棘手的部分。我尝试对outer_list删除应用相同的规则,但是每当删除inner_list的head元素时,都会出现错误。在print_node或delnode2中哪里出错了?
编辑:
实际上,如果它是一个external_list节点已删除,则也应删除其中的inner_list链接列表。这就是为什么使用delinner方法。
例如:
outer inner
aaa bb->cc
bb aaa->cc
when i wanted to delete "aaa" The result should be:
outer inner
bb cc
最佳答案
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");
关于c - 删除后在C中的链接列表中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850517/