从用C链表中删除一个节点 [英] Deleting a node from linked list in C
问题描述
我的问题是从删除链表中的一个节点。
My problem is deleting a node from linked list.
我有两个结构:
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链表中的一个节点。例如,当用户进入AAA
删除,删除功能应该找到outer_list-&GT的节点;字= AAA并删除此节点,并重新连接列表再次
。我想下面的code做到这一点。但要找到并删除后,我失去了名单。我不知道什么是错。请注意,outer_list有也链表inner_list内
My problem is in deleting a node from outer_list linked list. For example when user entered aaa
to delete, delete function should find the node with outer_list->word = aaa and delete this node and reconnect the list again
. I tried the below code to do this. but After finding and deleting I'm losing the list. I don't know what's wrong. Please notice that outer_list have also a linked list of inner_list inside.
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太删除相同的元素。
Now my problem is updated. While deleting an element from inner list I am also trying the delete the same element from inner_list too.
例如: - 比方说,AAA是outer_list链表中的一个元素,让我们点它与outer_list * P
- 此AAA也可以是在一个inner_list链表太。 (也可以是在p->头或其他innerlist。)现在,棘手的部分一次。我试图用outer_list删除,但每当我删除inner_list它给出了一个错误的头元素的运用相同的规则。
这里是我的尝试:
For example: - Let's say aaa is an element of outer_list linked list and let's point it with outer_list *p - This aaa can also be in an inner_list linked list too. (it can be in p->head or another innerlist.) Now, the tricky part again. I tried to apply the same rules with outer_list deletion but whenever i delete the head element of inner_list it gives an error. Here is what I tried:
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,当第一个元素被删除崩溃但是执行删除。请询问进一步的信息。我可能会使用非常邋遢的话。
Here i'm trying to send the node and checking all the inner_lists of outer_list elements and perform deletion however when the first element is deleted it crashes. Please ask for further information. I might use very untidy words.
推荐答案
FIX#1(可选) - 这是一个很好的做法来初始化所有变量。请注意,在这种特殊情况下,因为你必须处理头secanrio然后监守m设定为临时以后,你应该不会有问题,但仍..
FIX#1 (optional) - it is a good practice to initialize all variables. note that in this specific case since you have handles the head secanrio then you should not have a problem becuase m is set to temp later on, but still..
FIX#2 - 请务必在释放一个节点之前完全删除内部列表
FIX#2 - make sure you delete the inner list completely before you free a node.
下面是code(未经测试,对不起)
Here is the code (untested, sorry)
void delnode(outer_list *head,char num[100])
{
outer_list *temp, *m;
m=temp=head; /*FIX #1*/
while(temp!=NULL) {
if(strcmp(temp->word,num)==0) {
if(temp==head) {
head=temp->next;
delinner(temp->inner_list); /* FIX#2 */
free(temp);
return;
} else {
m->next=temp->next;
delinner(temp->inner_list); /* FIX#2 */
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;
}
}
这篇关于从用C链表中删除一个节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!