Удаление связанного списка в начале

Моя функция способна удалять узлы в начале списка, если список содержит более одного узла. Если только один узел остается в списке, удаление не происходит.

#include<stdio.h>
#include<stdlib.h>

//Circular linked list node structure
typedef struct circularLinkedListNode{
 int data;
 struct circularLinkedListNode *next;
}circularLinkedListNode;

circularLinkedListNode *head = NULL;

//Traversal of circular linked list
void traversal()
{
 circularLinkedListNode *current = head;

 if(current == NULL)
 {
 printf("\nThe list is empty!!");
 }
 else
 {
 do {
 printf("%d--", current->data);
 current = current->next;
 } while (current != head);
 }
}

//Insertion at the beginning of the list
void insertAtBeginning(int data)
{
 circularLinkedListNode *newNode = (circularLinkedListNode *)malloc(sizeof(circularLinkedListNode));

 //Create a new node and point it to itself
 newNode->data = data;
 newNode->next = newNode;

 if(head == NULL)
 {
 head = newNode;
 }
 else
 {
 circularLinkedListNode *current = head;
 while (current->next != head) {
 current = current->next;
 }
 current->next = newNode;
 newNode->next = head;
 head = newNode;
 }
}

//Insertion at the end of the list
void insertAtEnd(int data)
{
 circularLinkedListNode *newNode = (circularLinkedListNode *)malloc(sizeof(circularLinkedListNode));
 newNode->data = data;
 newNode->next = newNode;

 if(head == NULL)
 {
 head = newNode;
 }
 else
 {
 circularLinkedListNode *current = head;
 while(current->next != head)
 {
 current = current->next;
 }
 newNode->next = head;
 current->next = newNode;
 }
}
</stdlib.h></stdio.h>

ОСНОВНАЯ ПРОБЛЕМА НА ЭТОЙ ФУНКЦИИ :::

//Deletion of node at the beginning
void deleteATBeginning()
{
 if(head == NULL)
 {
 printf("\nEmpty list!!");
 }
 else
 {
 circularLinkedListNode *nodeToDelete = head;
 circularLinkedListNode *current = head;
 while(current->next != head)
 {
 current = current->next;
 }
 current->next = head->next;
 head = head->next;
 free(nodeToDelete);
 }
}

int main()
{
 int data, choice;

 while (1)
 {
 printf("\n***CIRCULAR LINKED LIST***\n1.Traversal\n2.Insertion at the beginning\n3.Insertion at the end\n4.Deletion of front node\n5.Deletion of end node\n6.Exit\nEnter your choice: ");
 scanf("%d", &choice);

 switch (choice)
 {
 case 1:
 traversal();
 break;

 case 2:
 printf("Enter the data: ");
 scanf("%d", &data);
 insertAtBeginning(data);
 break;

 case 3:
 printf("Enter the data: ");
 scanf("%d", &data);
 insertAtEnd(data);
 break;

 case 4:
 deleteATBeginning();
 break;

 case 6:
 return 0;
 break;

 default:
 printf("Wrong choice!! Please try again...");
 break;
 }
 }
}
1 ответ

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

Вы хотите, чтобы голова стала null чтобы подтвердить, что удаление произошло:

if(head == NULL)
{
 printf("\nEmpty list!!");

но вы никогда не учитываете специальный случай удаления единственного узла в списке, поэтому голова никогда не станет null (это не происходит само по себе).

Это может быть просто:

if(head->next == head) // if the head next node is itself
{
 head->next = null;
 free(nodeToDelete);
 head = null;
} 
else
{
 while(current->next != head)
 {
 current = current->next;
 // ...rest of your code as is

В настоящий момент ваш код free от памяти, на которую указывает head но не освобождает (null) память, поэтому ваш указатель на head все еще указывает на память, но эта память больше не принадлежит вашей программе. Это свисающий указатель. Вероятно, вы все еще видите содержимое узла как "действительное", но это только случайно, поскольку в этот момент ничего не появилось и не переназначало память.

licensed under cc by-sa 3.0 with attribution.