Справка по отладке при вставке - PullRequest
0 голосов
/ 29 октября 2010

Следующий код 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 ]

2 голосов
/ 29 октября 2010

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

static int insertSort (linkedlist **list)

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

*list = &sorted;

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

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

list = &sorted;

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

  destroythis (list);

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

1 голос
/ 29 октября 2010

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

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...