Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Михаил Роганин
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 8
#1

Сделать двусвязный цикл из односвязного. Задача Джозевуза - C++

19.11.2012, 12:54. Просмотров 344. Ответов 1
Метки нет (Все метки)

Добрый день. Встала задача сделать программу для реализации считалки Джозефуза на С++ (движение по кругу и удаление каждого пятого элемента, пока не останется один). Сделал для односвязного цикла, а для двусвязного не могу. Прошу помощи.
Вот код с односвязным циклом

Кликните здесь для просмотра всего текста
#include <stdio.h>
#include <string.h>
#include <conio.h>
/*#include <windows.h>
::SetConsolePC(::GetAPC());
::SetConsoleOutputCP(::GetAPC()); */
struct slink
{
char* info ;
struct slink *next;
};

slink *lst1 = 0;

slink* insert( slink *lst, char* a )
{
slink *p = new slink;
p->info = a;
if (lst)
{
p->next = lst->next;
lst->next = p;
}
else { lst = p; lst->next = p; }
return lst;
}

slink* append( slink *lst, char* a )
{
lst = insert(lst,a);
lst = lst ->next;
return lst ;
}

char* peek( slink *lst, int* error )
{
*error = 0;
if (lst==0) {*error=1; return 0;}
return (lst->next)->info ;
}

slink* del( slink *lst, int* error )//удаление
{
slink *p;
*error = 0;
if (lst==0) {*error=1; return 0;}
p=lst->next;
if (p==lst) lst = 0;
else lst->next = p->next;
delete p;
return lst;
}

void show( slink *lst )//показ списка
{
slink* cur = lst->next;
if ( lst)
do
{
printf(" %s ", cur->info ) ;
cur=cur->next;
} while (cur!=lst->next);
else printf("\n список пуст");
}

main() {
char *names[]={"Sergey","Aleksandr","Yuriy","Andrey",
"Pavel","Nikolay","Aleksey"};
int n=7, i,j, err;
for(i=0;i<n;i++)
lst1=append(lst1,names[i]);

clrscr() ;
printf("\n nachalnoe sostoyanie "); show(lst1);
for(i=0; i<n-1;i++)
{
for (j=0;j<4;j++) lst1=lst1->next;
printf("\n udalyaem %s", peek(lst1,&err));
lst1=del(lst1,&err);
printf("\n sostoyanie "); show(lst1);
}
printf("\n posledniy element = %s", peek(lst1,&err));
getch();
lst1 = del(lst1,&err);
}


Буду очень благодарен. РГЗ скоро сдавать, а помочь никто не может.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2012, 12:54     Сделать двусвязный цикл из односвязного. Задача Джозевуза
Посмотрите здесь:

задача на цикл C++
Задача на цикл C++
C++ Из массива в цикл (задача)
задача на цикл for C++
двусвязный список, как сделать добавление элемента? C++
простая задача на цикл C++
двусвязный список как сделать объединение? C++
Из односвязного списка в двусвязный C++
C++ Задача по программированию. Цикл For
Задача на вложенный цикл C++
C++ Переделать программу с односвязного на двусвязный список
C++ Задача на цикл for

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Михаил Роганин
0 / 0 / 0
Регистрация: 11.01.2012
Сообщений: 8
20.11.2012, 15:20  [ТС]     Сделать двусвязный цикл из односвязного. Задача Джозевуза #2
Нашёл часть кода в интернете. помогите прикрутить, уже всё истыркал...не могу понять и всё тут.
Кликните здесь для просмотра всего текста
Language C/C++
Код:
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
char c;
struct node *next;
struct node *prev;
}List;
/*функция которая получает указатель на первый элемент двунаправленного списка(head), и возвращает указатель на последний элемент в списке(который не удалили).*/
List *func(List *head, int k)
{
List *move = head, *temp = NULL;
int counter = 0;

while(move != move->next)
{
for(counter = k-1; counter; counter--, move = move->next);
move->prev->next = move->next;
move->next->prev = move->prev;
temp = move;
move = move->next;
free(temp);
}


return move;

}
Yandex
Объявления
20.11.2012, 15:20     Сделать двусвязный цикл из односвязного. Задача Джозевуза
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru