Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк в связанном списке? Ссылка на след. эл-т равна самому эл-ту? 
V
    Опции темы
BlHol
Дата 21.4.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



День добрый!
Колупаю я так, потихоньку Java, и вот добрался до темки "Связанный список".
Определение дано такое: связанный список является некоторой совокупностью объектов, где каждый объект в списке имеет ссылку на следующий объект. Вроде, все понятно. Но дальше предлагается код:


Код

public class myLinkedList
{

     public myLinkedList(){}


      public myLinkedList(Object item)
      {
         if (item!=null)
          start = end = current = new ListItem(item);
           
      }


      public myLinkedList(Object [] items)
      {
         if (items!=null)
         {
             for(int i = 0;i<items.length;i++ )
             addItem(items[i]);

             current = start;
         }
      }


      public void addItem(Object item)
    {

      ListItem newEnd = new ListItem(item);

      if(start==null)
         start=end=newEnd;
            else
        {
           end.next = newEnd;
             System.out.println("\n end.next (in addItem)= " + end.next); 
           end = newEnd;

           System.out.println(" \n end (in addItem)= " + end); 
        
        }
           
    }

    public Object getFirst()
    {
       current = start;
       return start == null ? null : start.item;

    }

    public Object getNext()
    {

     if(current!=null)
     {
         current = current.next;
     }
     
        return current == null ? null : current.item;
    }

    private ListItem start = null;
    private ListItem end = null;
    private ListItem current = null;

           private class ListItem
            {
               public ListItem(Object item) 
               {
              this.item  = item;
               next = null;
        }

         public String toString()
           {
             return "\n  item = (" + item + "),  next:  (" +  next + ") ";
           }
           private Object item;
           private ListItem next;
             } 
}

И этот класс используется для создания полилинии:


Код

import Geometry.*;

public class PolyLine
{
    public PolyLine(double [][] coords) 
    {

      myPoint [] points = new myPoint[coords.length];

      for(int i = 0;i<coords.length;i++ )
      {
          points[i]= new myPoint(coords[i][0],coords[i][1]);

          polyline = new myLinkedList(points);
      }

    }

      PolyLine(myPoint [] points) 
    {

        polyline = new myLinkedList(points);
    }


       public void addPoint(myPoint point)
    {
      polyline.addItem(point);
    
    }


       public void addPoint(double x, double y)
    {
      polyline.addItem(new myPoint(x,y));
    
    }

       public String toString()
    {

         StringBuffer str = new StringBuffer("Polyline");
         myPoint point = (myPoint) polyline.getFirst();

         while ( point != null)
         {
             str.append(" (" + point + ") ");
          point = (myPoint) polyline.getNext();
         }

         return str.toString();

    }
    
     private myLinkedList polyline;
}


Когда я создал класс для проверки всего этого, выплыла интересная деталь:
сначала ссылке на следующий элемент присваивается ссылка на след. эл-т (т.е. то, что и должно быть), но затем самому элементу присваивается след. эл-т(т.е. ссылка и сам элемент одно и то же) . Плюс ко всему, элемент списка start (т.е. начальный элемент) всегда имеет ссылку на след. эл-т равной null.
Вот и хочу понять это так и должно быть или это опечатки в книге?

Заранее благодарен.
С уважением.
PM MAIL   Вверх
LSD
Дата 21.4.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Если ты про этот:
Код
  public void addItem(Object item)
  {
    ListItem newEnd = new ListItem(item);
    if(start == null)
    {
      start = end = newEnd;
    }
    else
    {
      end.next = newEnd;
      System.out.println("\n end.next (in addItem)= " + end.next);
      end = newEnd;

      System.out.println(" \n end (in addItem)= " + end);
    }
  }

код, то тут все правильно.
Вначале создается новый элемент списка newEnd. Если список пустой, то он становится и первым и последним его элементом. Если же в списке уже есть элементы, то последний элемент становится предпоследним и поэтому у него указателю на предпоследний элемент присваивается newEnd. Далее указателю на последний элемент присваивается newEnd.
Указатель на следующий элемент у элемента start будет инициализирован при вставке второго элемента списка. Когда в списке один элемент start и end указывают на один и тот же ListItem, поэтому
Код
end.next = newEnd;

влияет не только на end, но и на start.

P.S. Просто пройдись по коду под дебагером, многое станет очевидно.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
BlHol
Дата 21.4.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Я дико извиняюсь, но там ведь end.next = newEnd - это, я так понимаю, указатель на последний элемент. И end= newEnd , т.е. получается, что и сам элемент и указатель на следующий элемент - это одно и то же?

Заранее спасибо.
PM MAIL   Вверх
Alexandr87
Дата 21.4.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



Цитата(BlHol @  21.4.2007,  19:03 Найти цитируемый пост)
Я дико извиняюсь, но там ведь end.next = newEnd - это, я так понимаю, указатель на последний элемент. И end= newEnd , т.е. получается, что и сам элемент и указатель на следующий элемент - это одно и то же?

Заранее спасибо. 


newEnd - это вновь созданный элемент, который пока еще не в списке.
Код

ListItem newEnd = new ListItem(item);

следовательно он не равен newEnd. После того, как этот элемент будет внесен в список (в его конец)
Код

      end.next = newEnd;


его пометят последним 
Код

end=newEnd;



Это сообщение отредактировал(а) Alexandr87 - 21.4.2007, 17:35
PM Jabber   Вверх
BlHol
Дата 21.4.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Спасибо.
Только я, видимо, чего-то недопонимаю.
Т.е., если на словах алгоритм таков:
1. Создается элемент типа связанного списка (но пока не в списке)
2. Он (ссылка на него) присваивается ссылке на следующий элемент у того элемента, который является в списке последним
3. Он присваивается самому последнему элементу.
Так?

Заранее спасибо.
PM MAIL   Вверх
Alexandr87
Дата 21.4.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



так толку не будет, почитайте литературу по теме "связанные списки"
PM Jabber   Вверх
BlHol
Дата 21.4.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Так, собственно, из литературы и взято. Там и определение и схемы. Все понятно, пока до кода не доходит....
PM MAIL   Вверх
LSD
Дата 21.4.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(BlHol @  21.4.2007,  18:41 Найти цитируемый пост)
1. Создается элемент типа связанного списка (но пока не в списке)
2. Он (ссылка на него) присваивается ссылке на следующий элемент у того элемента, который является в списке последним
3. Он присваивается самому последнему элементу.
Так?

В Java работа идет только по ссылкам. Т.е. start, end, end.next и т.д. это все ссылки.
1. Создается элемент типа связанного списка (но пока не в списке)
2. Ссылка на него присваивается ссылке на следующий элемент у того элемента, который являлся в списке последним
3. Ссылка на него присваивается ссылке на последний элемент списка


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
nornad
Дата 21.4.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Так понятнее?
user posted image

Добавлено через 1 минуту
Размер картинки (в байтах) позволяет использовать её даже в качестве аватара. ;)


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
BlHol
Дата 24.4.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Спасибо большое! Примерно, понятно. Примерно, такую же схему я видел. Она, абсолютно, понятна. Проблема в том, что, в моем понимании, код (вышеприведенный) расходится с этой схемой. Потому как было бы понятно, если бы next было бы = nextElem, а  Elem оставался бы самим собой, а то получается, что ссылки Elem и next равны.
Т.е. если, грубо говоря, мы превращаем переданный массив в связанный список, то, в моем понимании,  Elem должен быть равен array[0], а next быть равен array[1], а получается что сначала Elem1.next = array[0], а затем, сразу за ним Elem1 становится равным array[0].
Так?
Заранее благодарен...
PM MAIL   Вверх
LSD
Дата 24.4.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(BlHol @  24.4.2007,  11:21 Найти цитируемый пост)
Т.е. если, грубо говоря, мы превращаем переданный массив в связанный список, то, в моем понимании,  Elem должен быть равен array[0], а next быть равен array[1], а получается что сначала Elem1.next = array[0], а затем, сразу за ним Elem1 становится равным array[0].Так?

Нет не так. В качестве звений связанного списка испольузются специальные объекты ListItem-ы, которые содержат указатель на следующий элемент (next) и указатель на данные (item). Поэтому elem0.item будет равен array[0], а не сам elem0.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
BlHol
Дата 24.4.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Цитата(LSD @  24.4.2007,  10:48 Найти цитируемый пост)
Поэтому elem0.item будет равен array[0], а не сам elem0. 

И при этом elem0.next, также равен array[0]. Я про это... Ссылка-то им присваивается одна и таже...
PM MAIL   Вверх
LSD
Дата 24.4.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(BlHol @  24.4.2007,  11:53 Найти цитируемый пост)
И при этом elem0.next, также равен array[0]. Я про это... Ссылка-то им присваивается одна и таже... 

Где ты это увидел?
elem0.next НЕЛЬЗЯ присвоить array[0] без явного приведения типов, да и то скорее всего получим ошибку времени исполнения.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
BlHol
Дата 24.4.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Смотрим.
Предположим, присвоение идет в цикле

Код

 newEnd = new ListItem(item); //где item = array[0]


В итоге имеем:
Код

newEnd.item = array[0];
newEnd.next = null;


теперь присваиваем:

Код

end.next = newEnd;// т.е. фактически след. элемент elem1 - array[0]

end = newEnd;// т.е. теперь end.item также = array[0];



Где я ошибаюсь, тогда?
Заранее спасибо.
с уважением.

PM MAIL   Вверх
LSD
Дата 24.4.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(BlHol @  24.4.2007,  12:39 Найти цитируемый пост)
end.next = newEnd;// т.е. фактически след. элемент elem1 - array[0]

С какого следующий элемент array[0]?
newEnd - это ListItem, но никак не array[0].


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.