【问题标题】:Getting error in deleting a node in a linked list using "while loop" but not with "for loop"使用“while循环”而不是“for循环”删除链表中的节点时出错
【发布时间】:2014-05-15 17:56:41
【问题描述】:

我写了一个程序来创建、删除、插入一个链表,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node
{
    int value;
    struct node *link;

};
struct node *head;

int menu();
int create_insert();
int delete();
int print();


int main()
{
    head = malloc(sizeof(struct node));
    menu();
    return 0;
}

int menu()
{
    int n;
    while(1)
    {
        printf("\nMENU\n");
        printf(" 1.Create & Insert\n 2.Search\n 3.Display\n 4.Delete \n 5.Exit\n");
        printf("?: ");
        scanf("%d",&n);

        switch(n)
        {
            case 1:create_insert();print();break;
            case 4:delete();print();break; 
            default : printf("Enter correct choice.");
        }
    }


    return 0;
}
int delete()
{
    struct node *temp,*temp1;
    temp1 = NULL ;
    int val;
    temp = head ;

    printf("\nEnter the value to be deleted: ");
    scanf("%d", &val);
    while ( temp->link != NULL || temp -> value == val  )
    {
        //printf("%d->", temp->value) ;
        temp1 = temp;
        temp = temp->link ;
        //printf("I am in while \n");
    }
    //printf("I am outside while \n");
    if ( temp == NULL )
    {
        printf("%d is not found.\n",val);
    }
    else
    {
        if ( temp1 == NULL )
        {
            head = head -> link ;
        }
        else
        {
            temp1->link = temp -> link ;
        }

    }
    //printf("NULL\n");
    return 0;
}

int create_insert()
{
    int val,check;

    printf("Enter the first value to be inserted: ");
    scanf("%d",&head->value);

    head->link = NULL ;

    printf("Want to insert more? ( 0 to break ): ");
    scanf("%d",&check);

    while( check != 0 )
    {
        printf("Enter the value to be inserted: ");
        scanf("%d", &val);
        struct node *new_node = malloc(sizeof(struct node));

        new_node -> value = val ;
        new_node -> link = head ;

        head = new_node ;

        printf("Want to insert more? ( 0 to break ): ");
        scanf("%d",&check);

    }
    return 0;

}

int print()
{
    struct node *temp;

    temp = head ;

    printf("\nLinked list is: ");
    while ( temp != NULL )
    {
        printf("%d->", temp->value) ;
        temp = temp->link ;
    }
    printf("NULL\n");
    return 0;
}

抱歉,代码有点长。在这里,我在删除函数中有一个while循环,如下所示:

while ( temp->link != NULL || temp -> value == val  )
{
    //printf("%d->", temp->value) ;
    temp1 = temp;
    temp = temp->link ;
    //printf("I am in while \n");
}
//printf("I am outside while \n");
if ( temp == NULL )
{
    printf("%d is not found.\n",val);
}
else
{
    if ( temp1 == NULL )
    {
        head = head -> link ;
    }
    else
    {
        temp1->link = temp -> link ;
    }

}

这个循环在这里不起作用,只有最后一个元素被删除。现在,我将其替换为 for 循环,如下所示:

for ( temp = head , temp1 = NULL ; temp != NULL && temp->value != val ; temp1 = temp , temp = temp->link)
    {}

    if ( temp1 == NULL )
    {
        head = head -> link ;
    }
    else
    {
        temp1 -> link = temp -> link ;
        free(temp);
    }

它运行良好。请告诉我在while循环中哪里错了。

【问题讨论】:

  • 嗯,你在第一个循环中有||,在第二个循环中有&amp;&amp;,你期待什么???
  • 您有两种不同的情况。在 while 循环中使用 temp != NULL &amp;&amp; temp-&gt;value != val,而不是 temp-&gt;link != NULL || temp -&gt; value == val

标签: c for-loop while-loop


【解决方案1】:

循环不一样!!!

while 循环中的条件:

temp->link != NULL || temp->value == val

for循环中的条件:

temp->link != NULL && temp->value != val

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多