Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > [c++]двунаправленный список


Автор: 666lynx666 2.7.2007, 15:04
странно,не понимаю.В голову списка добавляет,а вот в конец и серидину это проблемно.Помогите найти ошибку,ооочень прошу!!!!

Код


void insert_head(int x,dlistPtr &Hd)  //добавление в голову(работает!!)
 {dlistPtr tmp;
  tmp=new dlist;
  tmp->data =x;
  tmp->next=Hd;
  Hd=tmp;
  Hd->pred=tmp;
  tmp->pred=NULL;


  }

void Add(int x, dlistPtr &Hd) //х-это число кот надо добавить,Hd-голова списка
{dlistPtr p,tmp=Hd;
 if (x<Hd->data) insert_head(x,Hd); //здесь проблем нет,добавляет
 while (tmp->data>x &&tmp) 
 tmp=tmp->next;
 p=new dlist;                                      //вот здесь это и проблема
 p->data=x;
 if(!tmp)
 { tmp->next=p;
   p->pred=tmp;
   p->next=NULL;

 }
else {
   p->pred=tmp->pred;
   p->next=tmp;
   tmp->pred->next=p;
   tmp->pred=p;


 ! 
MAKCim
Пользуйтесь тегом код!

Автор: AndrRus 2.7.2007, 17:27
Сразу извиняюсь, что привожу пример не относительно твоей программы. Вот как выглядит добавление элемента в конец двунаправленного списка, код скопировал из когда-то написанной мной подобной работы:

Код

void FunFirst (ELEM *&start, ELEM *&end, ELEM *&rsp) {
    // start - Указатель на начало линейного списка.
    // end - Указатель на конец линейного спсика.
    // rsp - Указатель для перемещения по списку.

    int ret;    
    double var;    // Переменная, которая считывает значение, которое затем будет передано dat.
    ELEM *nel;    // Указатель на новый элемент.
    
    FunFourth (start);

    printf ("   Введите значение, которые вы хотите хранить в новом элементе: ");
    
    ret = scanf ("%lf", &var);    
    if (ret != 1) {                // Проверка типа введенных пользователем данных.
        printf (" Ошибка №3: Не верный тип введенных вами данных.\n");
        return;
    }

    nel = new ELEM;            // new ELEM [.] - в квадратных скобках записывается колличество элементов. 
    if (nel == NULL) {
        printf (" Ошибка №2: Программа не смогла выполнить процедуру создания нового элемента.\n");
    }
    
    nel -> dat = var;        // Заносим данные.
    nel -> next = NULL;        // Сообщаем, что новый элемент является последним.

    if (start == NULL) {
        start = nel;            // Указатель начала на новый элемент.
        end = nel;            // Указатель конца на новый элемент.
        rsp = nel;                // Указатель перемещения на новый элемент.
        nel -> prev = NULL;        
    }
    else {    
        nel -> prev = rsp;            
        rsp -> next = nel;
        rsp = nel;
        end = rsp;
        end -> next = NULL;
    }

    printf ("   Элемент cо значением '%lf' успешно добавлен.\n", var);
    FunFourth (start);
}


Аналогично и в середину списка. И когда работаешь со списками, то рекомендую смотреть процесс работы программы через "Watch", сразу увидишь, где и что неправильно связалось.

Автор: 666lynx666 2.7.2007, 19:24
Спасибо большое,но я уже сделала.Тут видишь в чем недостаток,то что мы используем дополнительно 2 указателя:на начало и конец списка(start,end).Препод наш ругается по этому поводу( smile ) поэтому пришлось попарится но получилось неплохо у меня.
Но еще раз спасибо за помощь smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)