C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Указатели, с++builder6
Sergej Filenko
Отправлено: 23.05.2006, 22:20


Ученик-кочегар

Группа: Участник
Сообщений: 5



Помогите решить следущую задачу. Имеется программа работа со списком элементов через указатели. Нужно продолжить программу написав функцию, которая бы выводила список элементов с конца, т.е. в обратном порядке. В структуру нужно добавить указатель last.
Например listenelement* last. Я постарался закомментировать почти все строки. К сожалению сам пока не могу додуматься как решить. Спасибо, тем кто поможет. Можно и на мыло если что sgerm1@bk.ru
CODE
#include <iostream.h>
struct listenelement           //Создаем структуру
     {char daten[30];
      listenelement* next;
     };

listenelement* listenanfang;  //описываем  указатель на нач. списка
listenelement* hilfszeiger;     // описываем  указатель для перемещения по списку

void einfuegen(char datenneu[30])  // функция вставки элементов в список
    {
     hilfszeiger=listenanfang;         // указатель на начало списка

       while (hilfszeiger->next != NULL)  //проходим список до последнего элемента
            {
              hilfszeiger = hilfszeiger->next;  
            }
     hilfszeiger->next = new(listenelement); // вносим в список новый элемент
     hilfszeiger = hilfszeiger->next;               // указатель на новый элемент

     strcpy(hilfszeiger->daten,datenneu);      //данные в новый элемент вносим
     hilfszeiger->next = NULL;
    }
void ausgeben()       // функция  вывода элементов списка(Liste)
    {
     hilfszeiger = listenanfang;      // указатель на начало списка
     cout << hilfszeiger->daten << "\n";   // выводим на экран элементы списка

       while (hilfszeiger->next != NULL) // проходим список до конца
             {
              hilfszeiger=hilfszeiger->next;  // идем на след. элемент
              cout << hilfszeiger->daten << "\n";  // на экран
             }
    }

void init() // инициализация списка
     {
      listenanfang = new(listenelement);  // первый элемент производим
      listenanfang->next = NULL;
      strcpy(listenanfang->daten ,"Element 0"); // записываем данные в первый элемент
     }

void ende ()  // функция опустошения списка и высвобождение памяти
     {

         while (listenanfang != NULL) // пробегаем по всем елементам
               {
                hilfszeiger = listenanfang; //указатель на первый элемент
                listenanfang = listenanfang->next; // указатель на след элемент
                delete(hilfszeiger); // удаляем
               }
       }

void main()
    {
     init(); // инициализируем
     einfuegen("Element 1"); // вводим елемент
     einfuegen("Element 2"); // еще элемент вводим
     ausgeben(); // выводим на экран
     ende();  // удаляем и очищаем память

     char p[50];
     cin.getline(p,50);
    }


Отредактировано Konstantine — 23/05/2006, 22:37
Konstantine
Отправлено: 23.05.2006, 22:47


Мастер участка

Группа: Модератор
Сообщений: 545



чистые алгоритмы smile.gif
для вывода в обратном порядке — вариантов 2:
1) реализовать двусвязный список (немного усложнив добавление и удаление элементов)
2) использовать рекурсивную функцию, которая по прямому проходу ничего не делает, а при обратном — записывает все строки в массив строк (или куда там надо)
примерно код такой функции (которая будет выводить на экран):
CODE
void func(listenelement* cur)
{
//код прямого прохода по рекурсии — ничего не делаем

if(cur->next) // условие окончания углубления по рекурсии
func(cur->next) // организация рекурсии

// обратный проход
cout << cur->daten << "\n";
};


Отредактировано Konstantine — 25/05/2006, 15:01
Sergej Filenko
Отправлено: 25.05.2006, 13:36


Ученик-кочегар

Группа: Участник
Сообщений: 5



А как эту функцию в main() написать. Параметр в скобках как написать?
Konstantine
Отправлено: 25.05.2006, 15:01


Мастер участка

Группа: Модератор
Сообщений: 545



а из main (или откуда вы вызываете) нужно вызывать, указав в качастве параметра первый элемент списка...
P.S.: в коде была опечатка

Вернуться в Вопросы программирования в C++Builder