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
|
чистые алгоритмы
для вывода в обратном порядке — вариантов 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.: в коде была опечатка
|
|