-3

我有以下代码从线性单链表中删除给定节点。我想知道我们是否还能改进这个程序,它是否随时中断

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


   typedef struct node s;

    void delete(struct node *first)
     {
            int flag = 0;
            s *ptr, *lastNodePtr = NULL, *deleteNode;
            deleteNode = (s*) malloc(sizeof(s));
            printf("enter the node value to delete");
            scanf_s("%d",&deleteNode->num);
            deleteNode->next = NULL;

            for (ptr=first;ptr!=NULL;ptr=ptr->next) //at least one element exist
            {
              if(deleteNode->num == ptr->num)
              {
                flag=1;
                if(ptr==first) //need to delete at first place
                {
                  free(ptr);
                  first = null; //i dont think we need to do this as it points to ptr and ptr is already null.
                }
                else // need to delete some where middle.it can be last as well.
                {
                  lastNodePtr->next=ptr->next;
                  free(ptr);
                }

                printf("successfully deleted..");
                break;
              }

              lastNodePtr=ptr; // taking note of last node visited..
            }

            if (flag==0)
            {
              printf("\n Couldn't find the node");
              return;
            }
      }
4

2 回答 2

1

如果 ptr 是列表中要删除的第一个元素,则将 first 设置为 null,而不是 ptr 的下一个元素。(副作用:您无法释放列表的其余部分)

您的 EDITH: delete 应该返回新的 Head,最好将其设为 struct node **first 参数,如果第一个元素是已删除的元素,则该参数会更改第一个元素

顺便说一句:永远不要转换 malloc 的结果。

顺便说一句,两个。为什么使用for循环?每个人都使用带有链表的 while 循环

顺便说一句:链表的正常变量名称是“head”、“list”、“next”、“prev”、“last”,它们的长度都一样,因此可以整齐地对齐。

于 2013-09-08T12:53:21.977 回答
0
struct node
{
  struct node *next;
  int num;
} ;

void delete(struct node **pp, int num) {
    struct node *del;

    for (   ;*pp; pp= &(*pp)->next) {
        if((*pp)->num == num) break;
        }

    if (!*pp) { printf("Couldn't find the node(%d)\n", num); return; }

    del = *pp;
    *pp = del->next;
    free(del);
  }

for()顺便说一句:循环没有错;它们允许您将所有循环逻辑放在一行上。

于 2013-09-08T18:15:58.423 回答