为什么不能删除最后一个元素?

时间:2017-04-30 09:52:53

标签: c linked-list

以下程序在c。我想删除列表的最后一个元素。我无法理解它为什么不被删除。我在delete函数中将最后一个元素设置为null,稍后可以在del变量中看到它。但是具有最后一个元素的列表并没有将其设置为null。请任何人解释。

#include <stdio.h>
typedef struct node 
{
    int info;
    struct node *next;
}mynode;

void add(int val,mynode **head,mynode **tail);
void print(mynode *head);
void delete(mynode **head);

//mynode *head,*tail,*temp;
mynode *del;
int main(void) {
    // your code goes here
    mynode *root,*head,*tail,*temp;
    head=(mynode*)0;
    add(2,&head,&tail);
    add(3,&head,&tail);
    add(4,&head,&tail);
    add(5,&head,&tail);
    add(6,&head,&tail);
    print(head);
    del=tail;
    delete(&head);
    print(head);
    return 0;
}
void add(int val,mynode **head,mynode **tail)
{
    mynode *temp;
    temp=(mynode*)malloc(sizeof(struct node));
    temp->next=(mynode*)0;
    temp->info=val;
    if(*head==(mynode*)0)
    {
        *head=temp;
        *tail=temp;
    }
    else
    {
        (*tail)->next=temp;
        *tail=temp;
    }
}

void print(mynode *head)
{
   mynode *temp;
   if(head==(mynode*)0)
   {
        return;
   }
   printf("\n\n");
   for(temp=head;temp!=(mynode*)0;temp=temp->next)
   {
       printf("[%d]->",temp->info);
   }
   printf("NULL\n\n");
}
//deletes elements from linked list
void delete(mynode **head)
{
    if(del==head) 
    {
        *head=del->next;
        del=(mynode*)0;
    }
    else if(del->next==(mynode*)0)
    {
        del=(mynode*)0;
    }
    else 
    {
        del->info=del->next->info;
        del->next=del->next->next;
        del=(mynode*)0;
    }
}

输出:

[2] - &GT; [3] - &GT; [4] - &GT; [5] - &GT; [6] - &GT; NULL

[2] - &GT; [3] - &GT; [4] - &GT; [5] - &GT; [6] - &GT; NULL

2 个答案:

答案 0 :(得分:0)

您似乎误解了删除链接列表中的元素所需的内容。这样做的:

del=(mynode*)0;

从列表中删除任何内容。它只会更改del

的值

要从链接列表中删除元素,您需要更改上一个元素的next指针(即元素之前您想要的元素删除)。

删除B的示例:

List:
A --> B --> C --> NULL

// Do:
A->next = C

New list:
A --> C --> NULL

由于您使用的是动态内存,因此您还需要释放内存(也称为免费(B))。

顺便说一句:

1)将del作为全局变量是不好的。将其作为参数传递。

2)此代码:if(del==head)正在比较mynode*mynode**这可能不是您想要的。而是使用if(del==*head)

所以你的删除功能更像是:

void delete(mynode **head, mynode *d)
{
    if (*head == NULL) return;

    if(d==*head) 
    {
        *head=d->next;
        free(d);
        return;
    }

    mynode *p = *head;
    mynode *t = p->next;
    while(t)
    {
        if(t==d) 
        {
            p->next=d->next;
            free(d);
            return;
        }
        p = p->next;
        t = p->next;
    }
}

答案 1 :(得分:0)

你需要遍历到del的前一个节点,我们称之为'prev'

prev->next = del->next // assuming del is not null
free(del);