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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2018, 16:39   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Что вы не понимаете в указателях и адресах? Что сложного в простейшем алгоритме в лоб:
Код:
el = tail;
while(el != nullptr)
{
  s += el->field;
  el = el->prev;
}
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 17:00   #12
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Ну вот например, el это элемент, а tail - конец списка, у меня el используется как int, а tail как Spisok* tail, и вот они не приравниваются друг к другу, nullptr это NULL наверно, остальные строчки я понял? суммируются элементы и с каждой итерацией берется предыдущий

Код:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Spisok
{
	int value;
	Spisok* next;
	Spisok* prev;
};

Spisok* ini(int x)
{
		Spisok* ptr;
	ptr = new Spisok;
	ptr->value = x;
	ptr->next = NULL;
	ptr->prev=NULL;
	return ptr;
}

void add(Spisok** first, Spisok** tail, int value) {
       Spisok* p = new Spisok;
       p->next = NULL;
       p->prev = NULL;
p->value=value;

       if(*first == NULL)
             *first = *tail = p;
       else {
             (*tail)->next = p;
             p->prev = *tail;
             *tail  = p;
       }
}

Spisok* add1(Spisok* first, Spisok* tail, int el)
{
	Spisok *tmp = new Spisok;
	
tmp->value=el;
tmp->next=first;
return tmp;
}

Spisok* summ(Spisok* tail)
{
	Spisok *el = new Spisok;
	Spisok *s;
	el=tail;
	while(el!=NULL)
	{
		s+=el->value;
		el=el->prev;
	}
	return s;
}

void print(Spisok* first)
{
	Spisok* pt;
	pt = first;
	while(pt!=NULL)
	{
	printf("%d", pt->value);
	pt=pt->next;
}}

int main()
{
	
	Spisok* j,*i,*first = NULL, *tail=NULL;
	int x,val,x1;
	scanf("%d", &x);
	while(x!=-9999)
	{
	  add(&first, &tail, x);
	scanf("%d", &x);}
               print(first);
                first=0,tail=0;
	scanf("%d", &x1);
	while(x1!=-9999)
	{
first = add1(first, tail,x1);
		scanf("%d", &x1);}
			  print(first);
		first = summ(first);
	  print(first);
}
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 17:05   #13
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

При суммировании выдается такое число 651886615913
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 17:08   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Т.е. думать вы даже не пытаетесь...

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
el это элемент, а tail - конец списка, у меня el используется как int, а tail как Spisok* tail, и вот они не приравниваются друг к другу
Ну заведите для алгоритма Element. Зачем натягивать сову на глобус?

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
nullptr это NULL наверно
Ну да. Раз у вас С, то и new надо менять.

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
суммируются элементы и с каждой итерацией берется предыдущий
Ну так суммируйте, а не тупо пример прохода по списку копируйте. У вас же два списка и два числа на каждой итерации должны складываться, и перенос учитываться.
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 18:33   #15
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Код:
list* summ(list* el, list*tail)
{
	list*s = new list;
	el = tail;
	while (el != NULL)
	{
		s += el->field;
		el = el->prev;
	}
	return s;
}


int main() {
	list *head=NULL, *cur=NULL, *head2=NULL;
	int num,x1;
	//scanf("%d", &num);
	//head = init(num);
	//cur = head;
	scanf("%d", &num);
while(num!=-9999){
	add(&head, &cur, num);
		scanf("%d", &num);
	}
	listprint(head);
	head2 = 0;
	scanf("%d", &x1);
	while (x1 != -9999)
	{
		add2(&head2, &cur, x1);
		scanf("%d", &x1);
	}
	listprint(head2);
	head = summ(head,head2);
	listprint(head);
	return 0;
}
Сделал таким образом, вызываю в мейне, вроде правильно два списка создаю, а не обнуляю один и тот же, но все равно выводит непонятное число и на этом все
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 19:31   #16
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну бред же написали. Вы код хоть читайте.
1. Передаете в сумм два списка и один из них тут же теряете, перезаписывая.
2. Где вы суммируете элементы двух списков? Где хотя бы указатель для второго списка?
3. Ну сделали s списком, молодец. Но суммировать то надо в элементы этого списка, а не просто гоняя указатель. Потому и выводит бред, что вы только угнали фиг знаете куда указатель.
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 19:43   #17
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Похоже ошибка где-то в функции печати, потому что если её не вызывать после суммирования то ошибки нет
Код:
list* summ(list* element, list*tail)
{
	list*s=NULL;
	list*el;
	el = tail;
	while (el != NULL)
	{
		s += el->field;
		el = el->prev;
	}
	return s;
}


int main() {
	list *head=NULL, *cur=NULL, *head2=NULL, *s=NULL;
	int num,x1;
	//scanf("%d", &num);
	//head = init(num);
	//cur = head;
	scanf("%d", &num);
while(num!=-9999){
	add(&head, &cur, num);
		scanf("%d", &num);
	}
	listprint(head);
	head2 = 0;
	scanf("%d", &x1);
	while (x1 != -9999)
	{
		add2(&head2, &cur, x1);
		scanf("%d", &x1);
	}
	listprint(head2);
	s = summ(head,head2);
	//listprint(s);
	return 0;
}
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 19:53   #18
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
el = tail;
Это мы в список el устанавливаем последний элемент?
HelloVikiend вне форума Ответить с цитированием
Старый 04.06.2018, 22:55   #19
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
Похоже ошибка где-то в функции печати, потому что если её не вызывать после суммирования то ошибки нет
Нет. Ошибка в функции суммирования и я ее вам указал. Вы сдвигаете указатель фиг знает куда, а потом пытаетесь оттуда распичатать список.

Цитата:
Сообщение от HelloVikiend Посмотреть сообщение
Это мы в список el устанавливаем последний элемент?
Нет. Это палец. Вы же посты читаете и как вам советовали раз 5 повторили алгоритм?
p51x вне форума Ответить с цитированием
Старый 04.06.2018, 23:06   #20
HelloVikiend
Пользователь
 
Регистрация: 02.11.2017
Сообщений: 33
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы сдвигаете указатель фиг знает куда,
В смысле фиг знает куда, я же сдвигаю его задом поперед, пока список не встретит пустой элемент не встретит и суммирует все это дело
HelloVikiend вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны два целых числа A и B (A < B). Найти произведение всех целых чисел от A до B включительно. nadyaH Помощь студентам 10 29.10.2013 09:08
Сложить два 48 разрядных числа @Серж@ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.12.2011 20:17
MMX сложить два числа gansm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 29.10.2010 05:16
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 22:02
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27