Я плохо знаком с 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;
}
}
Проблема с кодом выше состоит в том, что иногда катастрофические отказы программы, но я не могу найти ошибку!
Кроме того, что я пытаюсь сделать, затем, если некоторые узлы имеют то же значение, то им заказывают согласно их идентификатору (узлы с меньшими идентификаторами на первом месте). Как я могу сделать это? Я действительно смущен!
Программа аварийно завершает работу, потому что в состоянии "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 :-)
.Сбой программы связан с тем, что в режиме цикла 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, поэтому это не сработает.
Я бы предложил построить пару тестовых случаев, которые проверяют ваши граничные условия (например, добавить элемент в пустой список; добавить элемент, который должен быть в конечном итоге в передней части существующего списка; добавить элемент, который заканчивается конец существующего списка; добавить элемент, который должен заканчиваться где-то в середине существующего списка). Сделайте функцию «Печать», которая распечатает элементы в списке к консоли для отладки. Это, по крайней мере, поможет вам сузить, какой контекст вашей аварии. Одной из возможностей (я не знаю, сколько добавляет вас), заключается в том, что программа выходит из памяти, а Malloc не удается. Вы можете проверить это, потому что я думаю, что Malloc возвращает NULL, если не выделить необходимую память.
Node *newNode = (Node*) malloc(sizeof(Node));
if(newNode == NULL)
{
printf("Out of Memory!");
return;
}
Создать новые поля/getters/setters в классе? Для этого во время выполнения необходимо создать совершенно новый класс с полями и методами и загрузить его в JVM. Для создания нового класса можно использовать библиотеку, например ASM или CGLib, но если вы новичок в Java, это не то, с чего вы хотите начать.
-121--3348464-для одной вещи, у вас есть neyID - > значение. Идентификатор узла - это int, поэтому это не сработает.
-121--5044853-В качестве метода отладки я бы создал простой тестовый жгут. Другими словами, программа тестирования, которую вы пишете, проходит через все общие сценарии, которые вы можете придумать (или модульное тестирование). Каждый модульный тест проверяет правильность выполнения и генерирует ожидаемый результат. Таким образом, вы можете быть уверены, что если все будет в порядке, вы будете готовы пойти. Если единичный тест не пройден, вы точно знаете, что сломано.
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;
}