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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2010, 12:51   #1
art_stalker
Новичок
Джуниор
 
Регистрация: 08.04.2010
Сообщений: 2
По умолчанию Односвязные списки

Задача: есть 2 списка, найти во 2-ом списке слова которых нет в 1-ом и дополнить 1-вый список этими словами. (слова в список берем из текстовых файлов).

В общем не знаю как добавить слово из первого списка во второй.

Код написал, но он не работает, пожалуйста подскажите как его доработать что бы он начал работать и хотелось бы понять в чем моя ошибка.

Код:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct node
{
string word;
node *next;
};

int main()
{
setlocale(LC_CTYPE, "");
ifstream ifp("e:\\12345.txt" , ios::app | ios::out);//чтение из файла


node *first = NULL, *last, *k, *tmp;

// считываем из файла слова и записываем их в список
while(ifp.good())
{
node *tmp = new node;

if(!first)
first = tmp;
else
last->next = tmp;

string word;
ifp >> word;

tmp->word = word;
tmp->next = NULL;

last = tmp;
}

// выводим на экран список
cout << "Слова в файле:\n";
node *curr = first;
while(curr)
{
cout << curr->word << "\n";
curr = curr->next;
}
cout << endl;

//_____________________________чтение 2-го файла
node *first2 = NULL, *last2, *k2, tmp2;
ifstream ifp2("e:\\123456.txt");//чтение из файла

// считываем из файла слова и записываем их в список
while(ifp2.good())
{
node *tmp2 = new node;

if(!first2)
first2 = tmp2;
else
last2->next = tmp2;

string word;
ifp2 >> word;

tmp2->word = word;
tmp2->next = NULL;

last2 = tmp2;
}

// выводим на экран список
cout << "Слова в файле:\n";
node *curr2 = first2;
while(curr2)
{
cout << curr2->word << "\n";
curr2 = curr2->next;
}
cout << endl;

//__добовляем в первый список слова из второго которых нет в первом

//_цикл
	
	k=first;
	k2=first2;
	node *newnode;
	while(k!=NULL)//пока не будет указывать на NULL
	{
	int fl=0;

	
	while(k2!=NULL)//пока не будет указывать на NULL
	{
		if(k2->word == k->word)
		{
			fl++;
		}
		k2=k2->next;
	}

	if(fl==0)
	{
		//работа с 1 и 2 списками
		
		newnode = new node;
		newnode->next=k->next;
		k->next=newnode;
		if(k==last)
			last=newnode;

	}
	k=k->next;
	}
	cout<< "получим: ";
	first = tmp;
	while(first!=NULL)
	{
		cout<< first->word << "/n";
		curr = curr->next;
	}
	cout<< endl;
}
art_stalker вне форума Ответить с цитированием
Старый 08.04.2010, 13:09   #2
Amadeo
Новичок
Джуниор
 
Регистрация: 08.04.2010
Сообщений: 6
По умолчанию

В коде твоем сильно не разбирался, но задача добавления состоит из двух этапов:
1. Сравнение
2. Если такого слова нет, то добавить

Сравнение - самое сложное из этих задач.
1. Идешь по первому списку, сравнивая слова со словами из второго, при этом пока не пройдешь весь первый список, во втором на следующий элемент не перескакиваешь

Код:
struct struct1 *node1=head1;
struct struct2 *node2=head2;

while(node2)
{
while(node1)
{
 if(node1!=node2)
{
  //добавляем элемент из первого списка во второй
}
 else
{
  node1=node1->next;
}
}
node2=node2->next;
node1=head1;
}
From Stilet: Я поправил, а ты в следующий раз код оформляй как полагается. Для этого у нас предназначена кнопка #

Последний раз редактировалось Stilet; 08.04.2010 в 13:13.
Amadeo вне форума Ответить с цитированием
Старый 08.04.2010, 13:16   #3
Amadeo
Новичок
Джуниор
 
Регистрация: 08.04.2010
Сообщений: 6
По умолчанию

Добавление элемента включает в себя
1. Выделение памяти
2. Вставка элемента в список

Тут все не сложно

struct struct2 *newnode;
struct struct2 *dop;

newnode=(struct struct2*)calloc(1,newnode)sizeof(st ruct struct2);//если не ошибаюсь
dop=node2->next;
node2=newnode;
node2->next=dop;

По-моему так))
Amadeo вне форума Ответить с цитированием
Старый 08.04.2010, 13:47   #4
art_stalker
Новичок
Джуниор
 
Регистрация: 08.04.2010
Сообщений: 2
По умолчанию

Что означает dop?

У меня логика такая же, но код конечно не совсем такой.
Код:
        k=first; 
	k2=first2;
	node *newnode;
	while(k!=NULL)//пока не будет указывать на NULL (прохожу массив пока не закончится 1 список)
	{
	int fl=0; //флаг нужен если я встречу одинаковый элемент, то подниму его.

	
	while(k2!=NULL)//пока не будет указывать на NULL (пока не конец второго списка)
	{
		if(k2->word == k->word)//(если слово в обоих списках word - поле где хранится слово)
		{
			fl++;// поднемаю флаг т.к. встретил слово в обоих списках
		}
		k2=k2->next;// так как встретил слово то иду дальше
	}

	if(fl==0)//слово не встретилось
	{
		//работа с 1 и 2 списками (добовляю в 1 список слово из 2-го (вот тути не знаю как добавить правельно))
		
		newnode = new node;
		newnode->next=k->next;
		k->next=newnode;
		if(k==last)
			last=newnode;

	}
	k=k->next;//дальше по 1-му списку
	}
Вот какой код написал я, ну и собственно его объяснение и хотелось бы узнать правильно ли я мыслю, ну то есть можно ли так написать программу (Исходы на выше данные коды я бы сказал что написал тоже самое но немного по своему вот и встает вопрос почему тогда не работает)
Заранее спасибо за помощь=)
art_stalker вне форума Ответить с цитированием
Старый 21.04.2010, 22:41   #5
J-lo
 
Регистрация: 15.04.2010
Сообщений: 9
По умолчанию

Ребята,кто-нибудь может меня прошарить в этих линейных однонаправленых списках????Ничего не могу понять с ними......запуталась с указателями.....
Вобщем задача такая:
Дать возможность пользователю задать последовательность символов s1, s2,.......sn (n>=2 и наперед неизвестно). Получить те символы,которые входят в последовательность по одному разу.

Как решить эту задачу используя этот непонятный линейный однонапрвленый список???За ранее спасибо!!!
J-lo вне форума Ответить с цитированием
Старый 21.04.2010, 22:49   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

J-lo одна тема - один автор!
А по поводу вашего вопроса, то ввод символов должен выглядеть примерно так:
Код:
int main()
{
list_char mylist;
while((c = getch()) != 13)
 mylist.push_back(c);
}
Это насчет "как сделать с помощью". Как это самое "с помощью" реализовать - разбирайтесь сами, опять же на форуме на этот счет много всего есть.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Односвязные списки в моделировании колоды игральных карт. Nelson1992 Помощь студентам 1 06.04.2010 18:24
Односвязные линейные списки !!! salia Помощь студентам 1 12.10.2009 16:01
Списки Bremlin Microsoft Office Excel 10 04.11.2008 15:13