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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2012, 20:52   #1
mazzahaker
Пользователь
 
Регистрация: 04.12.2011
Сообщений: 23
По умолчанию Объединение списков

Здравствуйте! Не получается объединить два списка, помогите пожалуйста это сделать, вот код, где моя ошибка, подскажите пожалуйста
Код:
#include "iostream"
#include "fstream"
using namespace std;
 
struct node{
    char d;
    node *p;
};
node *first(char d);
void push(node **top, char d);
char pop(node **top);
node *concatenate(node **top, node **top2);

ifstream fin ("in.txt");
ifstream fins ("in2.txt");
ifstream fout ("out.txt");

int main(){
    cout << "Введите 1й список" << endl;
    char t;
    fin >> t;
    node *top=first(t);
    fin >> t;
    while (fin.good()){
        push(&top,t);
        fin >> t;
    }
    cout << "Введите 2й список" << endl;
    fins >> t;
    node *top2=first(t);
    fins >> t;
    while (t!='0'){
        push(&top2,t);
        fins >> t;
    }
    node *res=concatenate(&top,&top2);
    while (res)
        cout << pop(&res) << ' ';
	int a=0;
	cin >> a;
	return 0;
}
node *first(char d){
    node *pv=new node;
    pv->d=d;
    pv->p=0;
    return pv;
}
void push(node **top, char d){
    node *pv=new node;
    pv->d=d;
    pv->p=*top;
    *top=pv;
}
char pop(node **top){
    char temp=(*top)->d;
    node *pv=*top;
    *top=(*top)->p;
    delete pv;
    return temp;
}
node *concatenate(node **top, node **top2){
    char temp;
    temp=pop(top2);
    node *pv=first(temp);
    while (*top2!=NULL){
        char temp2=pop(top2);
        push(&pv,temp2);
    }
    while (*top!=NULL){
        char temp2=pop(top);
        push(&pv,temp2);
    }
    return pv;
}
mazzahaker вне форума Ответить с цитированием
Старый 08.04.2012, 21:04   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А зачем ты в цикле их перевыводишь?
Тебе нужно хранить в некой переменной указатель на конец списков, тогда просто к хвосту первого цепляй голову второго:
Код:
node *concatenate(node **top, node **top2){
 node* lasttop=*top;
 // Находим конец первого списка
 for(;lasttop->node;lasttop=lasttop->node);
 //Цепляем к нему указатель на начало второго спискаж
 lasttop->node=*top2;
}
Реализация кривовата, но идея надеюсь понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.04.2012, 21:07   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Ох, "много буков"
Посмотрите на такой вариант слияния двух упорядоченных списков (они у вас упорядочены?):
Код:
typedef struct _list
{
    int a;
    struct _list *next;
} list;

list
*sortlists(list *a,list *b)
{
    list *result,*tmp;
    if (a->a<=b->a)
    {
        result=a;
        a=a->next;
    }
    else
    {
        result=b;
        b=b->next;
    }
    tmp=result;
    while (a!=NULL && b!=NULL)
    {
        if (a->a<=b->a)
        {
            tmp->next=a;
            tmp=a;
            a=a->next;
        }
        else
        {
            tmp->next=b;
            tmp=b;
            b=b->next;
        }
    }
    if (a!=NULL)
        tmp->next=a;
    else
    if (b!=NULL)
        tmp->next=b;
    return result;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.04.2012, 21:10   #4
mazzahaker
Пользователь
 
Регистрация: 04.12.2011
Сообщений: 23
По умолчанию

Я сделал вот так:
Код:
#include "iostream"
#include "fstream"
using namespace std;
 
struct node
{
    char d;
    node *p;
};
node *first(char d);
void push(node **top, char d);
char pop(node **top);
node *concatenate(node **top, node **top2);

ifstream fin ("in.txt");
ifstream fins ("in2.txt");

int main()
{
    char t;
    fin >> t;
    node *top=first(t);
    fin >> t;
    while (fin.good())
	{
        push(&top,t);
        fin >> t;
    }
    fins >> t;
    node *top2=first(t);
    fins >> t;
	int i=0, n=0;
	cout << "Enter N";
	cin >> n; n--;
    while (fins.good() && (i<n))
	{
        push(&top2,t);
        fins >> t;
		i++;
    }
    node *res=concatenate(&top,&top2);
    while (res)
        cout << pop(&res) << ' ';
	int a=0;
	cin >> a;
	return 0;
}
node *first(char d)
{
    node *pv=new node;
    pv->d=d;
    pv->p=0;
    return pv;
}
void push(node **top, char d)
{
    node *pv=new node;
    pv->d=d;
    pv->p=*top;
    *top=pv;
}
char pop(node **top)
{
    char temp=(*top)->d;
    node *pv=*top;
    *top=(*top)->p;
    delete pv;
    return temp;
}
node *concatenate(node **top, node **top2)
{
    char temp;
    temp=pop(top2);
    node *pv=first(temp);
    while (*top2!=NULL)
	{
        char temp2=pop(top2);
        push(&pv,temp2);
    }
    while (*top!=NULL)
	{
        char temp2=pop(top);
        push(&pv,temp2);
    }
    return pv;
}
вот так верно получается же? как теперь удалить список,освободив тем самым память?
mazzahaker вне форума Ответить с цитированием
Старый 09.04.2012, 01:30   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Если top указывает на голову списка, то:
Код:
node *tmp=top;
top=top->p;
while (top!=0)
{
	delete tmp;
	tmp=top;
	top=top->p;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.01.2013, 01:30   #6
R'nhbyV
Пользователь
 
Регистрация: 25.01.2013
Сообщений: 17
По умолчанию

Помогите)
похожая задача с маленьким дополнениемvisual c++)
ОДНОСВЯЗНЫЙ СПИСОК.
5. Проверка списка на упорядоченность его элементов. Функция должна возвращать одно из трех значений: 0 — если элементы не упорядочены, 1 — если элементы упорядочены по возрастанию, 2 — если элементы упорядочены по убыванию.
6. Объединение двух списков. В результате должен получиться третий список, в котором элементы списков чередуются до тех пор, пока один из списков не будет исчерпан. Оставшийся «хвост» более длинного списка помещается в конец нового списка.

Последний раз редактировалось R'nhbyV; 25.01.2013 в 18:30.
R'nhbyV вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив списков в C stas135642 Общие вопросы C/C++ 4 16.10.2011 15:54
сведение списков Юло Microsoft Office Excel 7 26.05.2011 13:34
Формирование списков BrenD Microsoft Office Excel 1 06.04.2009 08:28
слияние списков counter Общие вопросы C/C++ 4 02.01.2009 22:47
Объединение списков. life_burns Microsoft Office Excel 5 05.04.2008 16:13