【发布时间】:2011-02-20 08:31:22
【问题描述】:
我的问题是从链表中删除一个节点。
我有两个结构:
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;
我的问题是从 outer_list 链表中删除一个节点。例如当用户entered aaa要删除时,delete function should find the node with outer_list->word = aaa and delete this node and reconnect the list again。我尝试了下面的代码来做到这一点。但是在找到并删除之后,我丢失了列表。我不知道怎么了。请注意outer_list里面还有一个inner_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;
}
}
现在我的问题得到了更新。在从内部列表中删除一个元素时,我也在尝试从 inner_list 中删除相同的元素。
例如: - 假设 aaa 是 outer_list 链表的一个元素,让我们用 outer_list *p 指向它 - 这个aaa 也可以在inner_list 链表中。 (它可以在 p->head 或其他内部列表中。)现在,棘手的部分又来了。我尝试对 outer_list 删除应用相同的规则,但是每当我删除 inner_list 的 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);
}
我在这里尝试发送节点并检查outer_list 元素的所有inner_lists 并执行删除,但是当第一个元素被删除时它会崩溃。请询问更多信息。我可能会用很不整洁的词。
【问题讨论】:
-
您的第二个代码 sn-p 缩进很尴尬。你能解决这个问题吗?
-
很抱歉。我会解决的。
标签: c list linked-list