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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2016, 17:54   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
Смех Объединить два списка

Помогите пожалуйста объединить два списка в результирующий третий с такой структурой

Код:
struct Point
{
	int value;
	Point *next;
	Point *next2;
	Point *next3;
};

Point *start, *start2, *start3, *current, *current2, *current3, *head,*head2,*head3;
value значение
next указатель на следующий элемент
start указатель на первый элемент
current указатель на текущий элемент
head* указатель на последний элемент
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 21.09.2016, 17:14   #2
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

В чем может быть проблема, при повторном запуске функции зацикливается во втором вайле

Код:
void Merger()
{
 	if (start==NULL || start2==NULL)
	{
		printf("Не все списки созданы!!!");
		return;
	}

	Point *tmp =(Point*)malloc(sizeof(Point));
	tmp = start;
	start3 = start;
	current3 = start3;
	while(tmp!=NULL)
	{
		if(tmp->next != NULL)
		{
			tmp = tmp->next;
			current3= tmp;
		}
		else
		{
			tmp->next=start2;
			tmp = tmp->next;
			current3 = tmp;
			while(tmp!=NULL)
			{
				tmp = tmp->next;
				current3= tmp;
			}

		}
	}
	printf("Объединили два списка\n");
	tmp = start3;
	while (tmp!=NULL)
	{
		printf("%i ", tmp->value);
		tmp = tmp->next;
	}
}
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 21.09.2016, 17:35   #3
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Откуда здесь это знают. Мы что ясновидящие?
Выложи весь код здесь....

Хотя нет!

Поставь точку, проверь чтобы было "DEBUG" и запускай. Желтая стрелка должна быть на Точке останова.

1.jpg

2.jpg

Скажи мне значения параметров: tmp->value, tmp, mp->next
Просмотр параметров - просто на них наведи мышкой, для примера:

3.jpg

Уточню: смотреть значения переменных надо не абы когда, а в "проблемный момент" (когда зацикливается)... Наверно надо пояснять проще - нажимай зеленую стрелку "Продолжить" (в разных версиях среды разработки она называется по разному, см. рис. выше) ровно 15 раз, а потом только смотри значения интересующих меня параметров.

Внимание! Всё выше описанное справедливо только для Visual Studio 6(7, 8, 2008- 2015. Я же работаю в Visual Studio 2013 версией). Если же ты программируешь в чем-то другом - вылажуй весь код сюда, а то я не знаю как смотреть значение переменных в других средах разработки.

Последний раз редактировалось ura_111; 21.09.2016 в 17:46.
ura_111 вне форума Ответить с цитированием
Старый 21.09.2016, 17:49   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Сей код весьма загадочен:
Код:
Point *tmp =(Point*)malloc(sizeof(Point));
tmp = start;
waleri вне форума Ответить с цитированием
Старый 21.09.2016, 18:32   #5
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Воу ребят, да кто то живой есть)) думал что не заглянут, мой косяк что весь не выложил. Короче я в указателях запутался жестко, распутать бы)) Мне цель ввести список 1, ввести список 2, объеденить их, тупо к первому второй дописать и отсортировать. Но блин до ума никак довести не могу, если подскажите что, буду благодарен)

А именно в функции Merger косяк, один проход норм проходит, второй раз зайду все уже) в бесконеченом вайле втором вишу

Код:
// 1231.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>

struct Point
{
	int value;
	Point *next;
};

Point *start, *start2, *start3, *current, *current2, *current3;


void CreateList(int Value)
{
	if (start!=NULL)
	{
		printf("Список 1 уже был создан!!!");
		return;
	}
	current =(Point*)malloc(sizeof(Point));
	current->value = Value;
	current->next = NULL;
	start = current;
	printf("Список 1 создан.");
}

void CreateList2(int Value)
{
	if (start2!=NULL)
	{
		printf("Список 2 уже был создан!!!");
		return;
	}
	current2 =(Point*)malloc(sizeof(Point));
	current2->value = Value;
	current2->next = NULL;
	start2 = current2;
	printf("Список 2 создан.");
}


void AddElement(int Value)
{
	if (start==NULL)
	{
		printf("Список 1 не создан!!!");
		return;
	}
	Point *tmp =(Point*)malloc(sizeof(Point));
	tmp->value = Value;
	tmp->next = NULL;
	current->next = tmp;
	current = current->next;
	printf("Элемент добавлен.");
}

void AddElement2(int Value)
{
	if (start==NULL)
	{
		printf("Список 2 не создан!!!");
		return;
	}
	Point *tmp =(Point*)malloc(sizeof(Point));
	tmp->value = Value;
	tmp->next = NULL;
	current2->next = tmp;
	current2 = current2->next;
	printf("Элемент добавлен.");
}

void PrintList()
{
	if (start==NULL)
	{
		printf("Список 1 не создан!!!");
		return;
	}
	Point *tmp = start;
	while (tmp!=NULL)
	{
		printf("%i ", tmp->value);
		tmp = tmp->next;
	}
}

void PrintList2()
{
	if (start2==NULL)
	{
		printf("Список 2 не создан!!!");
		return;
	}
	Point *tmp = start2;
	while (tmp!=NULL)
	{
		printf("%i ", tmp->value);
		tmp = tmp->next;
	}
}

void Merger()
{
	//printf("%i ", Length());
	//getch();
 	if (start==NULL || start2==NULL)
	{
		printf("Не все списки созданы!!!");
		return;
	}

	Point *tmp =(Point*)malloc(sizeof(Point));
	tmp = start;
	start3 = start;
	//current3 = start3;
	//current3->next = NULL;
	while(tmp!=NULL)
	{
		if(tmp->next != NULL)
		{
			tmp = tmp->next;
			//current3= tmp;
		}
		else
		{
			tmp->next=start2;
			//tmp = tmp->next;
			//current3 = tmp;
			while(tmp!=NULL)
			{
				tmp = tmp->next;
				//current3= tmp;
			}
		}
	}
	printf("Объединили два списка\n");
	tmp = start3;
	while (tmp!=NULL)
	{
		printf("%i ", tmp->value);
		tmp = tmp->next;
	}
}


void Sort()
{
	if (start3==NULL)
	{
		printf("Список не создан!!!");
		return;
	}
    Point* ptr, *tmp = NULL;
    bool flag = false;  
    do
    {
	  	ptr = start3;
        flag = false;
        while(ptr->next)
        {
            if(ptr->value > ptr->next->value)
            {
                if(ptr == start3)
                {
                    tmp = ptr;
                    ptr = tmp->next;
                    tmp->next = ptr->next;
                    ptr->next = tmp;
                    start3 = ptr;
                    flag = true;                    
                }
                else
                {
                    tmp = ptr;
                    ptr = tmp->next;
                    tmp->next = ptr->next;
                    ptr->next = tmp;
                    current3->next = ptr;
                    flag = true;
                }
            }
            current3 = ptr;
            ptr = ptr->next;
        }
    }
    while(flag);
    printf("Отсортировали!!!\n");
	tmp = start3;
	while (tmp!=NULL)
	{
		printf("%i ", tmp->value);
		tmp = tmp->next;
	}
}

int main()
{
	setlocale(LC_ALL, "RUSSIAN");
	int choice = 0;
	while(choice!=9)
	{	
		int tmpValue, tmpValue2;
		system("cls");
		printf("1 - Создать первый список\n2 - Создать второй список\n3 - Добавить елемент в первый список\n4 - Добавить елемент во второй список\n5 - Показать первый список\n6 - Показать второй список\n7 - Отсортировать список\n8 - Выполнить слияние списков\n9 - Выход\n");
		while(!fflush(stdin)&&printf("\nВведите команду: ")&&!scanf("%i",&choice));
		system("cls");
		switch (choice)
		{
		case 1:
			while(!fflush(stdin)&&printf("Введите значение первого элемента: ")&&!scanf("%i",&tmpValue));
			CreateList(tmpValue);
			getch();
			break;
		case 2:
	        while(!fflush(stdin)&&printf("Введите значение первого элемента: ")&&!scanf("%i",&tmpValue));
			CreateList2(tmpValue);
			getch();
			break;
		case 3:
			while(!fflush(stdin)&&printf("Введите значение элемента: ")&&!scanf("%i",&tmpValue));
			AddElement(tmpValue);
			getch();
			break;
		case 4:
			while(!fflush(stdin)&&printf("Введите значение элемента: ")&&!scanf("%i",&tmpValue));
			AddElement2(tmpValue);
			getch();
			break;
		case 5:
			PrintList();
			getch();
			break;
		case 6:
			PrintList2();
			getch();
			break;
		case 7:
			Sort();
			getch();
			break;
		case 8:
			Merger();
			getch();
			break;
		}
	}
	return 0;
}

Последний раз редактировалось a.n.o.n.i.m; 21.09.2016 в 18:38.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 21.09.2016, 20:27   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Проблема в том, что вам нужно копировать списки, а не просто колхозить с указателями, хотя и с указателями путаница полнейшая. Объединение списков в данном случае можно реализовать как перебор двух списков и добавление элементов из них в третий. Добавляете по образу и подобию функции CreateList3, AddElement3 и тогда объединение будет каким-то таким:
Код:
void Merger()
{
  CreateList3();
  Point *tmp;
  // копируем элементы из первого списка
  for (tmp = start; tmp != null; tmp = tmp->next)
  {
    AddElement3(tmp->value);
  }
  // добавляем элементы из второго списка
  for (tmp = start2; tmp != null; tmp = tmp->next)
  {
    AddElement3(tmp->value);
  }
}
pu4koff вне форума Ответить с цитированием
Старый 21.09.2016, 22:53   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вроде получилось. Протестируй. И ещё одно - Зачем ты себя ограничил, когда объединяешь только равные списки, у меня можно объединить разные (см. рисунок):

Код:
void Merger()
{
	if ((start == NULL) && (start2 == NULL))
	{
		printf("Нет ни одного списка для формирования 3-го!!!");
		return;
	}

	// Сначало 1-й список копируем в 3-й (если он есть)
	if (start != NULL)
	{
		Point *tmp0 = (Point*)malloc(sizeof(Point));
		Point *tmp1 = (Point*)malloc(sizeof(Point));
		tmp1->value = start->value;
		tmp1->next = start->next;
		tmp0 = tmp1;
		start3 = tmp1;	
		while (tmp1->next != NULL)
		{
			tmp1 = tmp1->next;
			Point *tmp2 = (Point*)malloc(sizeof(Point));
			tmp2->value = tmp1->value;
			tmp2->next = NULL;
			start3->next = tmp2;		
			start3 = start3->next;
		}
		start3 = tmp0;
	}
	// Потом 2-й список копируем в 3-й (если только он и один)
	if ((start2 != NULL) && (start == NULL))
	{		
		Point *tmp0 = (Point*)malloc(sizeof(Point));
		Point *tmp1 = (Point*)malloc(sizeof(Point));
		tmp1->value = start2->value;
		tmp1->next = start2->next;
		tmp0 = tmp1;
		start3 = tmp1;
		while (tmp1->next != NULL)
		{
			tmp1 = tmp1->next;
			Point *tmp2 = (Point*)malloc(sizeof(Point));
			tmp2->value = tmp1->value;
			tmp2->next = NULL;
			start3->next = tmp2;
			start3 = start3->next;
		}
		start3 = tmp0;
	}
	// Продолжем (после 1-го) заполнять со 2-го списока
	if ((start2 != NULL) && (start != NULL))
	{
		Point *tmp0 = (Point*)malloc(sizeof(Point));
		tmp0 = start3;
		while (start3->next != NULL)
		{
			start3 = start3->next;
		}
		Point *tmp1 = (Point*)malloc(sizeof(Point));
		tmp1->value = start2->value;
		tmp1->next = start2->next;
		start3->next = tmp1;
		start3 = start3->next;
		while (tmp1->next != NULL)
		{		
			tmp1 = tmp1->next;
			Point *tmp2 = (Point*)malloc(sizeof(Point));
			tmp2->value = tmp1->value;
			tmp2->next = NULL;
			start3->next = tmp2;
			start3 = start3->next;	
		}
		start3 = tmp0;
	}

	printf("Объединили два списка\n");
	Point *tmp = (Point*)malloc(sizeof(Point));
	tmp = start3;
	while (tmp != NULL)
	{
		printf("%i ", tmp->value);
		tmp = tmp->next;
	}
}

1.jpg
ura_111 вне форума Ответить с цитированием
Старый 22.09.2016, 07:16   #8
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Пасибо за ответы, списки не равные, в первый введешь элементов 5, во второй элемента 3 и в третьем 8

Заметил тенденцию такую, сам постоянно спрашиваю, либо чьи то делаю для закрпеления на программер форуме и киберфоруме. Раньше , в году так 2011-2012 на киберфоруме постоянно отвечали, тут было молчание, а вот щас опять стал спрашивать, и заметил ровно обратную тенденцию))

Последний раз редактировалось a.n.o.n.i.m; 22.09.2016 в 07:20.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 22.09.2016, 08:12   #9
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Оба варианта хороши и работаеют, только у pu4koff я как понял если повторно заходить надо список удалить , ибо он будет просто увеличиваться каждый раз.
А ura_111 сделал даже только на существование только одного второго списка, норм, полезно. Спасибо)

Последний раз редактировалось a.n.o.n.i.m; 22.09.2016 в 08:38.
a.n.o.n.i.m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как объединить два класса vangeli57 C# (си шарп) 2 04.04.2016 12:31
Объединить два макроса Kraimon Microsoft Office Excel 8 24.02.2014 15:41
Объединить два скрипта Mick_20 JavaScript, Ajax 1 28.08.2013 11:13
Объединить 2 списка mazzahaker Помощь студентам 0 10.04.2012 15:09
Объединить два макроса KOSTIK1 Microsoft Office Excel 3 06.03.2010 22:09