Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2013, 22:39   #1
LifeWind
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 10
По умолчанию Списки. Вхождение списка в другой

Помогите пожалуйста решить задачу: даны три целочисленных списка L1, L2 и L3. Заменить каждое вхождение списка L2 в список L1 на список L3. Вот код, но работает только если один элемент из L2 и L1 равны, если 2 и более, то выводит неправильно. Помогите найти ошибку.
Код:
#include <iostream>
#include <iomanip>
using namespace std;
 
struct list
{
int info;
list *next, *pred;
};
 
//makelist формирует двухсвязный список с двумя сторожами
void makelist(list *&head, list *&tail)
{
head=new list;
tail=new list;
head->next=tail;
tail->pred=head;
int k,n;
cin>>n;
cout<<"Вводите числа: "<<endl;
for(int i=0;i<n;i++)
{
    cin>>k;
    list*p=new list;
    p->info=k;
    p->next=tail;
    p->pred=tail->pred;
    tail->pred=p;
    p->pred->next=p;
}
return;
}
 
void printlist(list *head, list *tail) //вывод списка на экран
{
list *a=head;
while(a!=tail->pred)
{
cout<<a->next->info<<" ";
a=a->next;
}
cout << endl;
return;
}
 
void func(list *head1, list *tail1, list *head2, list *tail2, list *head3, list *tail3)//заменяет вхождения списка L2 в список L1 на список L3
{
	list *a1=head1->next;
	list *b1=tail1->pred;
	list *a2=head2->next;
	list *b2=tail2->pred;
	list *a3=head3->next;
	list *b3=tail3->pred;
	while(a1!=tail1)
	{
		a2=head2->next;
		while(a2!=tail2)
		{
		    if(a1->info==a2->info)
			{
				b3->next=a1->next;	
				a1->pred->next=head3->next;
				a1->next->pred=tail3->pred;
				
			}
				a2=a2->next;
			
		}
	
		a1=a1->next;
		
		
	}
	return;
}

void main()
{  
    setlocale(LC_ALL, "Russian" );
    list * head1, * tail1, * head2, * tail2, * head3, * tail3;
	cout<<"Введите количество элементов в списке1: "<<endl;
    makelist(head1,tail1);
	cout<<"Введите количество элементов в списке2: "<<endl;
	makelist(head2,tail2);
	cout<<"Введите количество элементов в списке3: "<<endl;
	makelist(head3,tail3);
	func(head1,tail1,head2,tail2,head3,tail3);
	cout<<endl;
    printlist(head1,tail1);
    return;
}
LifeWind вне форума Ответить с цитированием
Старый 16.06.2013, 14:47   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
void func(list *head1, list *tail1, list *head2, list *tail2, list *head3, list *tail3)//заменяет вхождения списка L2 в список L1 на список L3
{
	list *a1=head1->next;
	list *b1=tail1->pred;
	list *a2=head2->next;
	list *b2=tail2->pred;
	list *a3=head3->next;
	list *b3=tail3->pred;

	while(a1!=tail1)
	{
		a2=head2->next;
		list *tmp=a1;
		list *finish=a1;
		bool flag=true;
		while((a2!=tail2)&&(tmp!=tail1))//учитываем границы обоих списков
		{
			if(tmp->info!=a2->info)//если нет совпадения, то дальше не пойдём
			{
				flag=false;
				break;
			}
			a2=a2->next;
			tmp=tmp->next;
			finish=tmp;
		}
		if (flag)//если список 2 в списке 1 найден
		{
			tmp = a1->pred;
			while (a1 != finish)//удаляем найденный подсписок
			{
				a1=a1->next;
				delete a1->pred;
			}
			tmp->next=finish;
			finish->pred=tmp;
			a1=finish->pred;

			list *tmp_a3 = head3->next;
			while (tmp_a3!=tail3)//вставка списка 3
			{
				cout << "tmp_a3="<<tmp_a3->info<<endl;
				list*p=new list;
				p->info=tmp_a3->info;
				p->next=finish;
				p->pred=tmp;
				finish->pred=p;
				tmp->next=p;
				tmp=p;
				tmp_a3=tmp_a3->next;
			}
		}
		a1=a1->next;
	}

	return;
}
Если, например, сделать список списков, то третий список можно будет не копировать, а просто работать с указателями. Это сильно экономит память и повышает быстродействие при частых и больших вставках.
P.S. Много не тестил, так что возможно где-то не доглядел
eoln вне форума Ответить с цитированием
Старый 16.06.2013, 15:21   #3
LifeWind
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 10
По умолчанию

почему то ваш код не работает, даже для одного элемента
UPD: нет, всё в порядке, это я криво сделал спасибо, работает

Последний раз редактировалось LifeWind; 16.06.2013 в 15:25.
LifeWind вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки TList. Инвертирование списка. Человек_Борща Общие вопросы Delphi 3 12.05.2013 06:07
Иерархические списки.Удаление атомарного списка. Sonic58 Общие вопросы C/C++ 1 30.11.2011 13:37
СИ. Списки. Описание структуры односвязного списка Jane-sad Помощь студентам 9 17.05.2010 14:40
Списки. Удаление элемента из списка. thexqn Помощь студентам 0 11.05.2010 09:04
Списки из другой книги tae1980 Microsoft Office Excel 4 06.05.2009 22:02