在给定列表开头的情况下删除线性单链表中的节点

时间:2013-09-08 12:44:58

标签: c algorithm

我有以下代码从线性单链表中删除给定节点。 我想知道我们是否仍然可以改进这个程序并随时打破

   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;
            }
      }

2 个答案:

答案 0 :(得分:1)

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

你的EDITH:删除应该返回新的头部,最好使它成为一个结构节点**第一个参数,如果第一个元素是删除的那个,它将改变第一个元素

BTW:永远不会施放malloc的结果。

BTW两个。为什么要使用for-loop?每个人都使用带链表的while循环

BTW三:链接列表的正常变量名称是“head”,“list”,“next”,“prev”,“last”具有良好的副作用,它们都是相同的长度,所以整齐地说对齐。

答案 1 :(得分: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);
  }

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