循环链表删除中的垃圾值

Junk values in deletion of circular linked list

循环链表删除节点的结构和函数如下:

    struct node
    {
        int data;
        struct node *next;
    };

    struct node *head = NULL;

void add(int n)
{
    struct node *temp=NULL,*trav=head;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data = n;
    if(head == NULL)
    {
        temp->next = temp;
        head = temp;
        return;
    }
    while(trav->next!=head)
        trav = trav->next;
    trav->next = temp;
    temp->next = head;
}

void delete(int x)
{
    struct node *temp=head,*rem=NULL;
    if(head!=NULL)
    {
        if(head->data==x)
        {
            while(temp->next!=head)
                temp = temp->next;
            rem=head;
            head = head->next;
            temp->next = head;
            free(rem);
        }
        else
        {
            while(temp->data!=x)
            {
                rem = temp;
                temp = temp->next;
            }
            rem->next = temp->next;
            free(temp);
        }
    }
    else
        printf("List is empty");
}

void print()
{
    struct node *temp=head;
    if(head==NULL)
    {
        printf("List is empty");
        return;
    }
    printf("\n The List is: ");
    do
    {
        printf(" %d ",temp->data);
        temp = temp->next;
    }while(temp!=head);
}

主要函数调用如下:

int main(void)
{
    add(1);
    add(2);
    add(3);
    add(4);
    add(5);
    print();
    delete(1);
    delete(2);
    delete(3);
    delete(4);
    delete(5);
    print();
}

输出:

所有节点都被删除,但最后打印出一个垃圾值。我的功能有什么问题?

当你的列表变空时,即你删除了列表中的最后一个元素,你需要设置head = NULL;

一个简单的解决方法可能是替换:

void delete(int x)
{
    struct node *temp=head,*rem=NULL;
    if(head!=NULL)
    {
        if(head->data==x)

与:

void delete(int x)
{
    struct node *temp=head,*rem=NULL;
    if(head!=NULL)
    {
        if(head==head->next && head->data==x)
        {
            free(head);
            head=NULL;
        }
        else if(head->data==x)

我实际上没有 运行 这个,所以我可能没有涵盖所有情况。