удалить вхождения элемента, заданного после его k-го вхождения в связанном списке - PullRequest
0 голосов
/ 29 апреля 2020

Я хотел написать алгоритм, который начинает удалять вхождения элемента, заданного после его k-го вхождения, но тот, который я построил, удаляет все его вхождения! Могу ли я получить помощь, чтобы улучшить мой алгоритм? заранее спасибо.

typedef struct list
{
    int data;
    struct list *next;
}list;
list * delete_2(list *head,int element,int k)
{
    list *previous,*temp,*new_head=head;  previous=temp=NULL;
    bool stop=true; int i=0;
    if(head == NULL) return NULL;
    while(head != NULL)
    {
        if(new_head->data == element && stop)
        {
            if(i>=k)
            {
                temp=head;
                new_head=head->next;
                head=new_head;
                free(temp);
            }
            else i++;
        }
        else if(head->data==element)
        {
            if(i>=k)
            {
                if(head->next==NULL)
                {
                    temp=head;
                    previous->next=NULL;
                    head=head->next;
                    free(temp);
                }
                else
                {
                    temp=head;
                    previous->next=previous->next->next;
                    head=head->next;
                    free(temp);
                }
            }
            else i++;
        }
        else
            {
                previous=head;
                head=head->next;
                stop=false;
            }
    }
        return new_head;
} 

1 Ответ

0 голосов
/ 29 апреля 2020

Я бы не стал отличать guish в том случае, если у вас есть больше чем k элементов в начале от других. Только случай k == 0 и элемент находится в начале.

Что-то вроде:

#define MOVE_FORWARD do {
  previous = head;
  head = head->next;
} while (0)

list * new_head = head;
list * previous = NULL;
int i = 0;
while (head != NULL)
{
   if (head->data  == element)
   {
      if (i < k) {
         i++;
         MOVE_FORWARD;
      }
      else
      {
        if (previous == NULL)
           // we are on first element and k == 0
           // change new_head
           new_head = head->next;
        // Delete current element and move on
        list * tmp = head;
        MOVE_FORWARD;
        free(tmp);
      }
   }
   else
   {
      MOVE_FORWARD;;
   } 
}
return new_head;

Не уверен, что это работает, но мне кажется, что это проще.

...