Удаление узла из связанного списка по индексу - PullRequest
1 голос
/ 07 декабря 2009

Это мой код для удаления узла из связанного списка.

vec_store содержит seq и size. Переменная seq содержит векторы и указатель.

По какой-то причине else if(i<s->size-1) не работает, что является последним условием.

Может кто-нибудь решить проблему? Кстати, это C код.

void delete_vec(vec_store s, int i)
{
    if (i<0 || s->size-1<i)
    {
        printf("Cannot delete vector because index %d is out of bounds\n",i);
    }
    else if (i==0)
    {
        node temp;
        temp = s->seq;
        s->seq = s->seq->next;
        s->size--;
        free(temp);
    }
    else if(i==s->size-1)
    {
        node temp1, temp2;
        //temp1 = malloc(sizeof (node));
        temp2 = malloc(sizeof (node));
        temp1=s->seq;
        if(temp1->next==NULL) 
        {
            free(temp1);
            s->seq=NULL;
            s->size--;
            printf("s->size-1\n");
        }
        else
        {
            while (temp1->next!=NULL)
            {
                temp2 = temp1;
                temp1 = temp1->next;    
            }
            free(temp1);
            temp2->next=NULL;
            s->size--;
            printf("s->size-1 2\n");
        }
    }
    else if(i<s->size-1)
    {
        node temp1,temp2;
        int j;
        temp1=s->seq;
        temp2 = malloc(sizeof (struct node_record));

        for(j=0;j<=i-1;j++)
        {
            temp2=temp1;
            temp1 = temp1->next;
        }

        free(temp1);
        temp2->next=NULL;
        s->size--;
    }
}

Ответы [ 2 ]

3 голосов
/ 07 декабря 2009

Этот код недоступен:

if(temp1->next==NULL){
free(temp1);
s->seq=NULL;
s->size--;
printf("s->size-1\n");
}

... потому что temp1 является первым элементом в списке, и поэтому это произойдет только в том случае, если первый элемент будет также последним элементом - что означает, что s->size равно 1, так что это было бы обнаружено ранее if (i==0) дело.

Это выделение для temp2 (которое происходит в двух местах) является поддельным - значение temp2 в любом случае перезаписывается, что приводит к утечке памяти, выделенной вами:

temp2 = malloc(sizeof (node));

Наконец, в чем проблема, о которой вы спрашиваете, лежит здесь (в случае if(i<s->size-1)):

free(temp1);
temp2->next=NULL;

Это удаляет весь конец списка. Вы хотите держать хвост списка вокруг - как это:

temp2->next = temp1->next;
free(temp1);

Кстати, temp2 и temp1 - довольно скучные имена переменных - как насчет previous и current или что-то еще? Кроме того, особый случай для if(i==s->size-1) является полностью ненужным - он должен прекрасно обрабатываться кодом, который вы используете для случая if(i<s->size-1).

0 голосов
/ 07 декабря 2009

Теперь, когда ваш отступ исправлен, я укажу на проблему. Когда вы удаляете узел в последнем условии, вы устанавливаете поле next для предыдущего узла на NULL, а не на следующий за ним узел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...