C: Создание заказанного списка путем проверки 2 значений

Я плохо знаком с C также - быть терпеливым со мной, если Вы видите некоторых действительно ошибка новичка в моем коде!

Как часть домашней работы, я должен создать заказанный список, чтобы хранить некоторые данные. То, что я сделал, до сих пор должен создать структуру, которая представит каждый узел списка (firstNode является глобальной переменной, которая указывает на первый узел списка):

typedef struct Node {
    struct Node *next;
    int id;
    int value;
}Node;

Node *firstNode = NULL;

После этого я создал функцию, которая вставляет новый узел в список путем проверки значений узлов. Узлы с меньшими значениями должны быть перед другими. Таким образом, то, что я сделал, было этим:

void addNewNode(int nodeId, int nodeValue) {
    Node *newNode = (Node*) malloc(sizeof(Node));
    Node *temp, *tempPrev;
    newNode->id = nodeId;
    newNode->value = nodeValue;

    if(firstNode == NULL) {
        newNode->next = firstNode;
        firstNode = newNode;
    }
    temp = firstNode;
    tempPrev = NULL;
    while(temp->value < newNode->value) {
        tempPrev = temp;
        temp = temp->next;
    }
    if(tempPrev == NULL) {
        newNode->next = firstNode;
        firstNode = newNode;
    } 
    else {
        tempPrev->next = newNode;
        newNode->next = temp;
    }
}

Проблема с кодом выше состоит в том, что иногда катастрофические отказы программы, но я не могу найти ошибку!

Кроме того, что я пытаюсь сделать, затем, если некоторые узлы имеют то же значение, то им заказывают согласно их идентификатору (узлы с меньшими идентификаторами на первом месте). Как я могу сделать это? Я действительно смущен!

5
задан csgillespie 25 September 2012 в 13:48
поделиться

5 ответов

Программа аварийно завершает работу, потому что в состоянии "while loop" не проверяется, равна ли временная температура NULL. Другими словами, если вы пытаетесь вставить новую вершину с большим значением, чем все остальные, уже находящиеся в списке, то temp достигает конца списка (поэтому temp равен NULL), и вы пытаетесь получить значение этой вершины! Так что исправление было бы:

while(temp!=NULL && temp->value>newNode->value)
{
    ....
}

Что касается id узлов, то можно было бы продлить условие цикла так:

while(temp!=NULL && (temp->value<newNode->value || (temp->value==newNode->value && temp->id<newNode->id))
{
    ....
}

Кроме того, первое if-состояние, при котором вы проверяете, NULL ли это первый узел, в вашем случае не нужно. Если это NULL, то программа не попадет в while-loop и перейдет непосредственно к первой if-состоянию после while-loop.

Кстати, неплохой код для нового программиста на C :-)

.
3
ответ дан 15 December 2019 в 01:02
поделиться

Сбой программы связан с тем, что в режиме цикла while не проверяется, равно ли значение temp NULL. Другими словами, если вы пытаетесь вставить новый узел с большим значением, чем все остальные, уже находящиеся в списке, temp доходит до конца списка (поэтому temp равно NULL) и вы пытаетесь получить значение этого узла! Таким образом, исправление будет:

while(temp!=NULL && temp->value>newNode->value)
{
    ....
}

Что касается идентификатора узлов, вы можете расширить условие while loop так:

while(temp!=NULL && (temp->value<newNode->value || (temp->value==newNode->value && temp->id<newNode->id))
{
    ....
}

Также, первый оператор if, где вы проверяете, является ли firstNode NULL, не является необходимым в вашем случае. Если значение равно NULL, программа не попадет в цикл while и перейдет непосредственно к первому оператору if после цикла while.

Кстати, хороший код для нового программиста в C: -)

-121--5044851-

Создать новые поля/приемники/установщики в классе? Для этого во время выполнения необходимо создать совершенно новый класс с полями и методами и загрузить его в JVM. Для создания нового класса можно использовать библиотеку, например ASM или CGLib, но если вы новичок в Java, это не то, с чего вы хотите начать.

-121--3348464-

для одной вещи, у вас есть neyID - > значение. Идентификатор узла - это int, поэтому это не сработает.

0
ответ дан 15 December 2019 в 01:02
поделиться

Я бы предложил построить пару тестовых случаев, которые проверяют ваши граничные условия (например, добавить элемент в пустой список; добавить элемент, который должен быть в конечном итоге в передней части существующего списка; добавить элемент, который заканчивается конец существующего списка; добавить элемент, который должен заканчиваться где-то в середине существующего списка). Сделайте функцию «Печать», которая распечатает элементы в списке к консоли для отладки. Это, по крайней мере, поможет вам сузить, какой контекст вашей аварии. Одной из возможностей (я не знаю, сколько добавляет вас), заключается в том, что программа выходит из памяти, а Malloc не удается. Вы можете проверить это, потому что я думаю, что Malloc возвращает NULL, если не выделить необходимую память.

Node *newNode = (Node*) malloc(sizeof(Node)); 
if(newNode == NULL)
{
  printf("Out of Memory!");
  return;
}
0
ответ дан 15 December 2019 в 01:02
поделиться

Создать новые поля/getters/setters в классе? Для этого во время выполнения необходимо создать совершенно новый класс с полями и методами и загрузить его в JVM. Для создания нового класса можно использовать библиотеку, например ASM или CGLib, но если вы новичок в Java, это не то, с чего вы хотите начать.

-121--3348464-

для одной вещи, у вас есть neyID - > значение. Идентификатор узла - это int, поэтому это не сработает.

-121--5044853-

В качестве метода отладки я бы создал простой тестовый жгут. Другими словами, программа тестирования, которую вы пишете, проходит через все общие сценарии, которые вы можете придумать (или модульное тестирование). Каждый модульный тест проверяет правильность выполнения и генерирует ожидаемый результат. Таким образом, вы можете быть уверены, что если все будет в порядке, вы будете готовы пойти. Если единичный тест не пройден, вы точно знаете, что сломано.

0
ответ дан 15 December 2019 в 01:02
поделиться

1.

if(firstNode == NULL) {
        newNode->next = firstNode;
        firstNode = newNode;
        return; // done with inserting the first node...need not continue.
    }

2.

// ensure temp is not null only then access its value.
while(temp && (temp->value < nodeId->value)) {
        tempPrev = temp;
        temp = temp->next;
    }
1
ответ дан 15 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: