2015-05-19 4 views
1

Я изучаю связанные списки, и они вызывают у меня много неприятностей. Я вызываю функцию с этим вызовом:C - popping последний элемент из связанных списков

pop(&list); 

А вот код:

void pop(NODE** first) { 
if(*first != NULL && first!= NULL){ 
    NODE* ptr = *first; 
    while(ptr->next->next != NULL){ 
     ptr = ptr->next; 
    } 
    free(ptr->next); 
    ptr->next = NULL; 
} 

Это также вызывает ошибка утечки памяти, даже если я называю это единственный раз ..

При вызове эта функция несколько раз, есть больше ошибок утечки памяти.

Заранее спасибо, Mimpopo.

EDIT: Определение NODE

typedef struct node { 
    int data; 
    struct node *next; 
} NODE; 

Полный код:

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

typedef struct node { 
    int data; 
    struct node *next; 
} NODE; 



NODE* insert(NODE *first, int n){ 
    // create new node 
    NODE* new = (NODE*)malloc(sizeof(NODE)); 
    new->data = n; 
    new->next = NULL; 

    // if first is NULL, this will be the first 
    if(first == NULL) 
     return new; 

    // otherwise, place it correctly 
    NODE* ptr = first; 

    // check inserting at the begining 
    if(ptr->data > new->data){ 
     new->next = ptr; 
     return new; 
    } 

    // insert in the middle 
    while(ptr->next != NULL){ 
     if(ptr->next->data > n && ptr->data < n){ 
      new->next = ptr->next; 
      ptr->next = new; 
      break; 
     } 
     ptr = ptr->next; 
    } 

    // insert at the end of list 
    if(ptr->next == NULL){ 
     ptr->next = new; 
    } 

    return first; 
} 

void traverse(NODE *first){ 
    NODE* ptr = first; 
    while(ptr != NULL){ 
     printf("%d\n", ptr->data); 
     ptr = ptr->next; 
    } 
} 

NODE* search(NODE *first, int n){ 
    NODE* ptr = first; 
    while(ptr != NULL){ 
     if(ptr->data == n){ 
      printf("FOUND %d\n!", n); 
      return ptr; 
     } 
    ptr = ptr->next; 
    } 
} 

int main(){ 
    NODE* first = NULL; 
    NODE* this = NULL; 
    first = insert(first, 7); 
    first = insert(first, 10); 
    first = insert(first, 11); 
    first = insert(first, 1); 
    first = insert(first, 3); 
    first = insert(first, 5); 
    first = insert(first, 22); 
    first = insert(first, 23); 
    first = insert(first, 24); 
    first = insert(first, 125); 

    pop(&first); 




} 
+0

Пожалуйста, добавьте к вашему вопросу декларацию 'NODE', и код, вызывающий 'pop'. –

+0

Что именно вы подразумеваете под «ошибкой утечки памяти»? – rohit89

+1

Одна из проблем, которые я вижу, состоит в том, что если 'first' содержит только одну запись,' while (ptr-> next-> next! = NULL) 'приведет к сбою seg. –

ответ

1

Я не просмотрел весь ваш код, но, как и для функции, то она может быть записана следующим образом

void pop(NODE ** first) 
{ 
    if (*first != NULL) 
    { 
     NODE *prev = NULL; 
     NODE *current = *first; 

     while (current->next) 
     { 
      prev = current; 
      current = current->next; 
     } 

     if (prev != NULL) prev->next = current->next; 
     else (*first = NULL); 

     free(current); 
    } 
} 

Что касается реализации вашей функции, то она содержит много ошибок. Например, в этом заявлении

if(*first != NULL && first!= NULL){ 

вы должны поменять первое и второе сравнения. Это условие должно выглядеть

if(first != NULL && *first!= NULL){ 

В этом заявлении

while(ptr->next->next != NULL){ 

Вы должны быть уверены, что ptr->next не равен NULL.

Также вы не проверяете, является ли удаленный узел первым узлом списка.

Учитывайте, что вставка функции также неверна. Вы считаете, что только одно условие в этом фрагменте кода

while(ptr->next != NULL){ 
    if(ptr->next->data > n && ptr->data < n){ 
     new->next = ptr->next; 
     ptr->next = new; 
     break; 
    } 
    ptr = ptr->next; 
} 

Однако это может быть, например,

ptr->next->data >= n && ptr->data < n 

или

ptr->next->data > n && ptr->data <= n 
+0

На самом деле это не работает для меня. – Mestralx

+0

В моем коде: == 3377 == LEAK SUMMARY: == 3377 == определенно потеряно: 8 байт в 1 блоке == 3377 == косвенно потеряно: 64 байта в 8 блоках == 3377 == возможно потеряно: 0 байтов в 0 блоках == 3377 == все еще достижимо: 0 байтов в 0 блоках == 3377 == подавлено: 0 байт в 0 блоках – Mestralx

+0

Если я могу спросить, что мне делать, если обработанный узел будет первым узел списка? – Mestralx

Смежные вопросы