Можем ли мы удалить последний узел списка из одной ссылки, если мы знаем только адрес последнего узла - PullRequest
0 голосов
/ 15 февраля 2012

// Переменные

typedef struct node 
 { 
    int value; 
    struct node *next; 
 }mynode;

// Глобальные переменные (не обязательно).

mynode *head, *tail, *temp; 

// Функции

void add(int value);

// Функция добавления новых узлов в связанный список

 void add(int value)
 {
    temp = (mynode *) malloc(sizeof(struct node));
    temp->next=(mynode *)0;
    temp->value=value;

    if(head==(mynode *)0)
    {
       head=temp;
       tail=temp;
    }
    else
    {
      tail->next=temp;
      tail=temp;
    }
 }

// Функция main ()

int main()
 {
     head=(mynode *)0;

     // Construct the linked list.
     add(1);
     add(2);
     add(3);

     return(0);
 }

Если у меня есть только указатель на узел, значение которого равно 3 (последний узел, как видно из вышеупомянутого кода), можем ли мы удалить его и сделать узел, значение которого равно 2 (вышеупомянутый код), в качестве последнего узла.

Ответы [ 5 ]

2 голосов
/ 15 февраля 2012

Нет, вы не можете. Если у вас нет ссылки на предыдущий узел. как указатель головы. Если у вас есть другие ссылки, чем это гораздо проще. Фактически, если у вас нет указателей, вы потеряете сам список

0 голосов
/ 02 июня 2012

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

0 голосов
/ 15 февраля 2012

Ответ - нет.

Вы можете вызвать free для этого указателя на последний узел, но это просто означает, что память, занимаемая этим узлом, больше не используется.Данные, скорее всего, останутся там без изменений некоторое время.А это означает, что указатель ближайшего к нему узла все еще действителен, даже если он не должен быть.

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

0 голосов
/ 15 февраля 2012

Да, вы можете .. Попробуйте следующий код:

void deleteNode()
{
    mynode *temp1;
    for(temp1 = head; temp->next!= tail; temp1 = temp1->next);
    tail = temp1;
    free(tail->next);
}

Это удалит последний узел.

0 голосов
/ 15 февраля 2012

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

...