РЕДАКТИРОВАТЬ: выяснил проблему. Также, если вы нашли это через Google или другую поисковую систему, здесь я ошибся и как это исправить.
Мой метод deleteNode () перемещался по списку должным образом с правильной температурой и держал голову нетронутой. То, что я делал не так, было в том, что я возвращал в результате метода. Я возвращал либо temp, либо newNode, что неверно, поскольку он проходит по списку, пока не найдет определенную позицию. Как только он находит эту определенную позицию, он переназначает указатель -> next, чтобы указывать на указатель next-> next>, что правильно, но опять же я возвращал неправильную вещь. Поскольку мы перемещались по списку, используя temp / NewNode, мы потеряли заголовок, и мы возвращали найденную позицию и все, что оставалось в следующих позициях списка.
Как мы это исправим - это вернуть голову (что и передается в метод). Причина, по которой это работает, заключается в том, что мы должны понимать, как работают LinkedLists. Указатели каждого узла указывают на следующий узел. Ex. у нас есть связанный список | A | | - | B | | - | C | | - | D | | - | E | | - | F | |
Если мы хотим удалить узел C, мы перемещаемся к узлу B, используя указатель temp, а затем назначаем B-> рядом с temp-> next-> next. Таким образом, пропуская узел C и назначая узел D.
ПРИМЕЧАНИЕ: (Из того, что я знаю, это на самом деле не освобождает память узла C, так что это не лучшая практика, потому что вы можете вызвать утечки памяти таким образом). Вы должны использовать метод free () на узле C. 1017 *
Вот код, который я в итоге использовал
struct node* DeleteNode(struct node* head, int pos) {
struct node* temp = head;
int length = LinkedListLength(temp);
int i;
if(pos <= 0 || pos > length){
printf("ERROR: Node does not exist!\n");
}else{
if(pos == 1){
head = head->next; //move from head (1st node) to second node
}else{
for(i = 1; i < pos-1; ++i){ //move through list
temp = temp->next;
}
temp->next = temp->next->next;
}
}
return head;
}
Надеюсь, это поможет понять, как я решил исправить это.
/////////////////////////////////////////////// ////////////////////////////////////////////////// /
////////////////////////////////////////////////// ////////////////////////////////////////////////
ОРИГИНАЛЬНАЯ ПОЧТА
////////////////////////////////////////////////// ////////////////////////////////////////////////
////////////////////////////////////////////////// ////////////////////////////////////////////////////
РЕДАКТИРОВАТЬ: Примечание. Это домашнее задание. Я потратил несколько дней (примерно 4 часа) на программирование. Я просто застрял в этой части. Вы можете посмотреть мою попытку ниже
Мне удалось вставить и удалить с начала / конца, однако я не могу заставить свой узел удаления в позиции N в списке ссылок работать.
Мой псевдокод выглядит так:
- LinkedList: 1,3,5,7,9,23
- Grab LinkedList
- Создать новый структурный узел A = head
- Перемещаться по связанному списку до
положение
- Назначить узел на узел-> следующий
- вернуть связанный список
ПРИМЕР ВХОДА
Node structure
int data;
struct node* next;
int values[] = {1,3,5,7,9,23};
struct node* llist = CreateList(values,6);
llist = DeleteNode(llist, 1);
llist = DeleteNode(llist, 5);
llist = DeleteNode(llist, 3);
Что должно оставить список со значениями 3, 5, 9 после запуска кода. Однако, он заменяет первый узел на 0
Фактический код:
struct node* DeleteNode(struct node* head, int pos) {
struct node* temp = head;
struct node* newNode = head;
int length;
int i;
printf("DeleteNode: position = %d \nBefore: ", pos);
PrintList(temp);
if(pos <= 0){ //node does NOT exist
printf("ERROR: Node does not exist!\n");
}else{ //node DOES exist
length = LinkedListLength(temp);
if(length < pos){ //if length < position Node does not exist
printf("ERROR: Node does not exist!\n");
}else{
if(pos == 0){
newNode = temp->next;
}else if(pos == 1){
newNode = temp->next;
}else{
for(i = 1; i < pos; i++){
printf("i = %d\n", i);
temp = temp->next;
newNode->next;
}
if(temp->next == NULL){
newNode = NULL;
}else{
newNode = temp->next;
}
}
printf("After: ");
PrintList(newNode);
printf("\n");
}
}
return newNode;
}
РЕДАКТИРОВАТЬ # 2: опечатка кода
Спасибо за любую помощь заранее. Из того, что я пришел к выводу, моя проблема в том, что я не перемещаюсь по списку должным образом, но я не уверен, почему я не.