2010-10-29 2 views
0

Следующий код C не работает (это просто очищает список):Вставка рода отлаживать помощь

/* Takes linkedlist of strings */ 
static int insertSort (linkedlist *list) { 
    linkedlist sorted; 
    void *data; 
    node *one, *two, *newnode; 
    unsigned int comp, x; 

    removeHeadLL (list, &data); 
    initLL (&sorted); 
    addHeadLL (&sorted, data); 

    while (list->count) { 
    removeHeadLL (list, &data); 
    two = sorted.head; 

    x = 0; 
    for (comp = strcomp (data, two->data) ; comp > 1 && x < sorted.count ; x++) { 
     one = two; 
     two = two->next; 
    } 

    if (x) { 
     newnode = malloc (sizeof(node)); 
     newnode->next = two; 
     newnode->data = data; 
     one->next = newnode; 
    } 
    else { 
     addHeadLL(&sorted, data); 
    } 

    (sorted.count)++; 
    } 

    destroythis (list); 
    list = &sorted; 
    return 0; 
} 

Полный контекст: http://buu700.res.cmu.edu/CMU/15123/6/

+2

«Следующий код C не работает:« - гм! Что не работает? –

+0

Извините, я был немного расплывчатым, потому что я немного спешил. В результате я получаю пустой список ссылок - не знаю, что происходит с этим. –

ответ

2

Если ваше намерение действительно изменить входной указатель list, чтобы указать на память, выделенную внутри этой функции, то вам необходимо объявить функцию, как

static int insertSort (linkedlist **list) 

, а затем вернуться вновь построенный список из sorted так:

*list = &sorted; 

Как она стоит, вызов destroylist высвобождает то, что находится в list на въезде, б ut присваивание только изменяет локальную копию указателя ввода.

Другими словами, в исходном коде эта строка:

list = &sorted; 

имеет точно нулевой эффект вне функции, но эта строка:

destroythis (list); 

действительно освободить память, которая принадлежала по list при входе. Поэтому после возврата ваш указатель ввода теперь обращается к пустым спискам.

1

Опасность, Уилл Робинсон: непроверенный код.

struct list { char *datum; struct list *next; }; 
typedef struct list *listptr; 

listptr insert(char *x, listptr xs) { 

    listptr result = xs; 
    listptr *from = &result; 
    listptr new = (listptr) malloc(sizeof(struct list)); 

    while (xs != null && strcmp(xs.datum, x) < 0) { 
    from = &xs; 
    xs = xs->next; 
    } 

    new.datum = x; 
    new.next = xs; 
    *from = new; 

    return result; 
} 

listptr isort(listptr xs) { 
    listptr result = null; 
    for(; xs != null; xs = xs->next) { 
    insert(xs.datum, result); 
    } 
    return result; 
} 
Смежные вопросы