Копирование, а затем сортировка связанного списка - PullRequest
1 голос
/ 25 апреля 2011

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

struct Node {
  char name[14];
  int counts[130];
  char gender;
  Node *nextPtr;
};

Я копирую этот связанный список со следующим кодом:

// Create a copy of the current list
  Node *tempPtr;
  while (headPtr != NULL) {
    tempPtr = new Node;
    tempPtr = headPtr;

    // Advance the list
    headPtr = headPtr->nextPtr;
  } // End while loop

Мне нужно скопироватьсписок, чтобы я мог его отсортировать, я не хочу сортировать оригинальный список.Сортировка будет происходить по убыванию по значению в определенной позиции массива counts [].Мне интересно, может кто-нибудь сказать мне, правильно ли я копирую список?И если я могу иметь некоторое представление о том, как идти и сортировать этот список.Я написал это на Java без проблем, извиняюсь за то, что слишком мало знал о языке программирования c.Любой вклад будет принят с благодарностью.Спасибо.

Мои извинения, я должен написать это на языке программирования C ++.Однако я не могу использовать классы C ++.Я могу использовать только поток ввода-вывода C ++, опорные параметры и динамическое выделение памяти.

Моя главная цель здесь - составить список указателей на существующие узлы, а затем отсортировать его, не копируя узлы и не нарушаяОригинальный список.

1 Ответ

3 голосов
/ 25 апреля 2011

В C. нет такой вещи, как new. Вы используете компилятор c ++?

Игнорируя это, проблема в том, что вы ничего не копируете и фактически создаете утечку памяти:

tempPtr = new Node;
tempPtr = headPtr;

Вы создаете новый узел в куче, назначая указатель на tempPtr ..., а затем переназначаете tempPtr на headPtr. Вы только что потеряли недавно выделенный Node (утечка памяти).

Чтобы сделать копию списка, вам нужно перебрать существующий список, копируя данные в новые узлы, которые вы добавляете в новый список.

Node *oldNode = headPtr;
Node *newHead = malloc(sizeof(struct Node));
Node *tail = newHead;

while(oldNode != NULL)
{
    memcpy(tail, oldNode, sizeof(struct Node));
    oldNode = oldNode->nextPtr;
    if (oldNode != NULL)
    {
        tail->nextPtr = malloc(sizeof(struct Node));
        tail = tail->nextPtr;
    }
}

(не проверено, и я некоторое время не делал C, но это должно быть сделано)

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