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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 10.03.2010, 20:49   #1
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию Динамический список в С

написал код но никак не могу заставить его работать выполнение останавливается на выделенной строке как я понял выполняется только половина итерации и дальше цикл не работает объясните в чем проблема ?
вот код :
Код:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iomanip>
#include <clocale>
#include <malloc.h>
using namespace std;

 
struct	peka{
	short Number;
	struct glubina{
		int g_min;
		int g_max;
	              };
        glubina g;
		char name [20];
		float prot9gennostb; 
         peka *nextpeka;
    };
    struct SPISOK_REK
	{
    peka *first, *last;
    };
  peka * pekavvod (peka * newpeka);
  void pekavivod (peka * peki);

int main (void)
{
peka *drugayapeka,*Temp;
SPISOK_REK sp;
int i;
setlocale(LC_ALL,"Russian");
{
printf ("---------------------------Река №%d-----------------------------", 1);
drugayapeka=pekavvod(NULL);
drugayapeka->Number=1; 
sp.first=drugayapeka;
for(i=1;i<5;i++)  // здесь исправил теперь дальше вылетает при выводе на экран
{
printf ("---------------------------Peкa №%d-----------------------------", i); 
drugayapeka=pekavvod(drugayapeka); 
drugayapeka->Number=i;
}
sp.last=drugayapeka;
pekavivod (sp.first);

drugayapeka=sp.first;
while(drugayapeka->nextpeka!=sp.last)
{
drugayapeka=drugayapeka->nextpeka;
}
drugayapeka->nextpeka=sp.first;
sp.last->nextpeka=sp.first->nextpeka;
sp.first->nextpeka=NULL;
// меняем местами первый и последний элемент
Temp = sp.first;
sp.first = sp.last;
sp.last = Temp;
pekavivod (sp.first);
_getch (); 
}
}
peka *pekavvod (peka *drugayapeka )
{
peka * newpeka;
newpeka = new peka;
if(drugayapeka!=NULL) drugayapeka->nextpeka=newpeka;

printf ("\nВведите Название : ") ;
fflush (stdin);//сброс буфера ввода 
fgets (newpeka->name, 20 - 1, stdin); 
*(newpeka->name + strlen (newpeka->name) - 1) = '\0'; 

printf ("\nВведите минимальную глубину реки: ") ;
fflush (stdin); 
scanf_s ("%d", &(newpeka->g.g_min) );

printf ("\nВведите максимальную глубину реки: ") ; 
scanf_s ("%d", &(newpeka->g.g_max) );

printf ("\nВведите протяженность реки : " );
fflush (stdin); 
scanf_s ("%d", &(newpeka->prot9gennostb) );

newpeka->nextpeka=NULL;
return newpeka; //дописал так теперь вводит парамеиры для реки 1 и сразу перескакивает на реку5 ???
}

void pekavivod (peka * peki)
{
peka * pek;
pek = new peka;
printf ("\n\n");
printf ("№, Имя, протяженность реки \n");
printf (" глубина минимальная и глубина максимальная \n");


while(pek!=NULL)
{
printf ("%-3d %-15s %-3d %-4d %-20s\n\n", pek->Number,
pek->name,
pek->g.g_min,
pek->g.g_max,
pek->prot9gennostb
);
pek=pek->nextpeka; 
}
}

Последний раз редактировалось серг; 10.03.2010 в 22:43.
серг вне форума
Старый 10.03.2010, 21:28   #2
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

как правильно расставить индексы объясните плиз я чет никак не врублюсь в коде все выделено

Последний раз редактировалось серг; 10.03.2010 в 21:55.
серг вне форума
Старый 10.03.2010, 22:22   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

"for(i=1;i<5;i++);"
; - зачем? пустой цикл организовали?
p51x вне форума
Старый 10.03.2010, 22:25   #4
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

не понял почему пустой он отвечает за количество рек ? вместо 5 можно сделать переменную которую пользователь будет вводить с клавиатуры

а точка с запятой блин )))

после заполнения вылетает ((( опять не понял почему
(((

причем выдает код на ассемблере который как я понял пишет что не работает sp.last sp.first хотя мы его еще не учили так что не уверен

Последний раз редактировалось Stilet; 11.03.2010 в 11:33.
серг вне форума
Старый 10.03.2010, 23:20   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Какую ошибку выдает?
p51x вне форума
Старый 11.03.2010, 10:58   #6
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

ошибка такая
Unhandled exception at 0x1023320f in file.exe: 0xc0000005: Access violation reading location 0xa0000000.
и стрелка в коде причем код выдается на С ++ ????
почему так и не понял

и break, contine, return
переполняется может быть, ток где пока не понял

вроде переполнение возникает в функции pekavvod
при вводе в список имени реки хотя вроде бы там все обработано

Код:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iomanip>
#include <clocale>
#include <malloc.h>
using namespace std;

 
struct	peka{
	short Number;
	struct glubina{
		int g_min;
		int g_max;
	              };
        glubina g;
		char name [20];
		float prot9gennostb; 
         peka *nextpeka;
    };
    struct SPISOK_REK
	{
    peka *first, *last;
    };
  peka * pekavvod (peka * newpeka);
  void pekavivod (peka * peki);

int main (void)
{
peka *drugayapeka,*Temp;
SPISOK_REK sp;
int i;
setlocale(LC_ALL,"Russian");
{
printf ("---------------------------Река №%d-----------------------------", 1);
drugayapeka=pekavvod(NULL);
drugayapeka->Number=1; 
sp.first=drugayapeka;
for(i=1;i<5;i++)  // здесь исправил теперь дальше вылетает при выводе на экран
{
printf ("---------------------------Peкa №%d-----------------------------", i); 
drugayapeka=pekavvod(drugayapeka); 
drugayapeka->Number=i;
}
sp.last=drugayapeka;
pekavivod (sp.first);

drugayapeka=sp.first;
while(drugayapeka->nextpeka!=sp.last)
{
drugayapeka=drugayapeka->nextpeka;
}
drugayapeka->nextpeka=sp.first;
sp.last->nextpeka=sp.first->nextpeka;
sp.first->nextpeka=NULL;
// меняем местами первый и последний элемент
Temp = sp.first;
sp.first = sp.last;
sp.last = Temp;
pekavivod (sp.first);
_getch (); 
}
}
peka *pekavvod (peka *drugayapeka )
{
peka * newpeka;
newpeka = new peka;
if(drugayapeka!=NULL) drugayapeka->nextpeka=newpeka;

printf ("\nВведите Название : ") ;
fflush (stdin);//сброс буфера ввода 
fgets (newpeka->name, 20 - 1, stdin); как понял ошибка где то здесь но никак не исправлю 
*(newpeka->name + strlen (newpeka->name) - 1) = '\0'; 

printf ("\nВведите минимальную глубину реки: ") ;
fflush (stdin); 
scanf_s ("%d", &(newpeka->g.g_min) );

printf ("\nВведите максимальную глубину реки: ") ; 
scanf_s ("%d", &(newpeka->g.g_max) );

printf ("\nВведите протяженность реки : " );
fflush (stdin); 
scanf_s ("%d", &(newpeka->prot9gennostb) );

newpeka->nextpeka=NULL;
return newpeka; //дописал так теперь вводит парамеиры для реки 1 и сразу перескакивает на реку5 ???
}

void pekavivod (peka * peki)
{
peka * pek;
pek = new peka;
printf ("\n\n");
printf ("№, Имя, протяженность реки \n");
printf (" глубина минимальная и глубина максимальная \n");


while(pek!=NULL)
{
printf ("%-3d %-15s %-3d %-4d %-20s\n\n", pek->Number,
pek->name,
pek->g.g_min,
pek->g.g_max,
pek->prot9gennostb
);
pek=pek->nextpeka; 
}
}

Последний раз редактировалось Stilet; 11.03.2010 в 11:34.
серг вне форума
Старый 11.03.2010, 11:36   #7
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

Код:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iomanip>
#include <clocale>
#include <malloc.h>
using namespace std;

 
struct	peka{
	short Number;
	struct glubina{
		int g_min;
		int g_max;
	              };
        glubina g;
		char name [20];
		float prot9gennostb; 
         peka *nextpeka;
    };
    struct SPISOK_REK
	{
    peka *first, *last;
    };
  peka * pekavvod (peka * newpeka);
  void pekavivod (peka * peki);

int main (void)
{
peka *drugayapeka,*Temp;
SPISOK_REK sp;
int i;
setlocale(LC_ALL,"Russian");
{
printf ("---------------------------Река №%d-----------------------------", 1);
drugayapeka=pekavvod(NULL);
drugayapeka->Number=1; 
sp.first=drugayapeka;
for(i=1;i<5;i++)  // здесь исправил теперь дальше вылетает при выводе на экран
{
printf ("---------------------------Peкa №%d-----------------------------", i); 
drugayapeka=pekavvod(drugayapeka); 
drugayapeka->Number=i;
}
sp.last=drugayapeka;
pekavivod (sp.first); ВОТ ЗДЕСЬ ЭТА ЗЕЛЕНАЯ СТРЕЛОЧКА

drugayapeka=sp.first;
while(drugayapeka->nextpeka!=sp.last)
{
drugayapeka=drugayapeka->nextpeka;
}
drugayapeka->nextpeka=sp.first;
sp.last->nextpeka=sp.first->nextpeka;
sp.first->nextpeka=NULL;
// меняем местами первый и последний элемент
Temp = sp.first;
sp.first = sp.last;
sp.last = Temp;
pekavivod (sp.first);
_getch (); 
}
}
peka *pekavvod (peka *drugayapeka )
{
peka * newpeka;
newpeka = new peka;
if(drugayapeka!=NULL) drugayapeka->nextpeka=newpeka;

printf ("\nВведите Название : ") ;
fflush (stdin);//сброс буфера ввода 
fgets (newpeka->name, 20 - 1, stdin);
*(newpeka->name + strlen (newpeka->name) - 1) = '\0'; 

printf ("\nВведите минимальную глубину реки: ") ;
fflush (stdin); 
scanf_s ("%d", &(newpeka->g.g_min) );

printf ("\nВведите максимальную глубину реки: ") ; 
scanf_s ("%d", &(newpeka->g.g_max) );

printf ("\nВведите протяженность реки : " );
fflush (stdin); 
scanf_s ("%d", &(newpeka->prot9gennostb) );

newpeka->nextpeka=NULL;
return newpeka; 
}

void pekavivod (peka * peki)
{
peka * pek;
pek = new peka;
printf ("\n\n");
printf ("№, Имя, протяженность реки \n");
printf (" глубина минимальная и глубина максимальная \n");


while(pek!=NULL)
{
printf ("%-3d %-20s %-3d %-3d %-3d \n\n", pek->Number, 
// поправил коэффициенты но теперь выводит отрицательные числа и ошибка 
выше указывается зеленой стрелочкой 
pek->name,
pek->g.g_min,
pek->g.g_max,
pek->prot9gennostb
);
pek=pek->nextpeka; 
}
}
никак не пойму в чем проблема,и как это исправляется

Последний раз редактировалось серг; 11.03.2010 в 12:01.
серг вне форума
Старый 11.03.2010, 12:17   #8
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

вот что выводится во вложении посмотрите
там стрелочка и все указано
стрелка пишет this code has called into another function. when this function is finished this is the next statement that will be executed
и если pekavivod заменить на pekavvod ошибка пропадает но появляется ввод лишней реки без номера
Вложения
Тип файла: doc Doc1.doc (131.5 Кб, 15 просмотров)

Последний раз редактировалось серг; 11.03.2010 в 12:52.
серг вне форума
Старый 11.03.2010, 13:25   #9
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

короче я сам все отредактировал вот рабочий код
Код:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <clocale>
#include <malloc.h>
using namespace std;


struct glubina{
		int g_min;
		int g_max;
	};
struct	peka{
	short Number;
	glubina g;
	char name [20];
	int prot9gennostb; 
	peka *nextpeka;
};
int kolichestvo_pek;
struct SPISOK_REK
{
	peka *first, *last;
};
peka * pekavvod (peka * newpeka);
void pekavivod (peka * peki);

int main (void)
{
	setlocale(LC_ALL,"Russian");
	printf("Введите количество вводимых вами рек: ");
    scanf_s ("%d",&kolichestvo_pek);
	peka *drugayapeka,*Temp;
	SPISOK_REK sp;
	int i;
	{
		printf ("---------------------------Река №%d-----------------------------", 1);
		drugayapeka=pekavvod(NULL);
		drugayapeka->Number=1;
		sp.first=drugayapeka;
		for(i=1;i<kolichestvo_pek;i++)
		{
			printf ("---------------------------Peka №%d-----------------------------", i+1); 
			drugayapeka=pekavvod (drugayapeka); 
			drugayapeka->Number=i+1;
		}
		sp.last = drugayapeka;
		pekavivod (sp.first);
		//Обмениваем внутренние указатели списка
		drugayapeka=sp.first;
		while(drugayapeka->nextpeka!=sp.last)
		{
			drugayapeka=drugayapeka->nextpeka;//Находим предпоследний элемент
		}
		drugayapeka->nextpeka=sp.first;
		sp.last->nextpeka=sp.first->nextpeka;
		sp.first->nextpeka=NULL;
		//Обмениваем указатели на первый и последний элементы
		Temp = sp.first;
		sp.first = sp.last;
		sp.last = Temp;
		pekavivod (sp.first);
		_getch (); 
	}
}
peka *pekavvod (peka * drugayapeka )
{
	peka * newpeka;
	newpeka = new peka;
	if(drugayapeka!=NULL) drugayapeka->nextpeka=newpeka;

	printf ("\nВведите Название : ") ;
	fflush (stdin);//сброс буфера ввода 
	fgets (newpeka->name,20-1, stdin); 
	*(newpeka->name+strlen(newpeka->name)-1)='\0'; 

	printf ("\nВведите минимальную глубину реки: ") ;
	fflush (stdin); 
	scanf_s ("%d", &(newpeka->g.g_min) );

	printf ("\nВведите максимальную глубину реки: ") ; 
	scanf_s ("%d", &(newpeka->g.g_max) );

	printf ("\nВведите протяженность реки : " );
	fflush (stdin); 
	scanf_s ("%d", &(newpeka->prot9gennostb) );
    newpeka->nextpeka=NULL;
	return newpeka;
}

void pekavivod (peka * peki)
{
	printf ("\n\n");
	printf (" №,   Имя,                                                     протяженность реки \n");
	printf ("               глубина миy и глубина макс \n");

    while(peki!=NULL)
	{
		printf ("%-3d   %-20s     %-3d     %-3d    %-10d\n\n", peki->Number,
			peki->name,
			peki->g.g_min,
			peki->g.g_max,
			peki->prot9gennostb
			);
		peki=peki->nextpeka; 
	}
}
поставьте мне плюсик за свою же работу )))))
серг вне форума
Старый 11.03.2010, 13:39   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
серг
Написал, и молодец
Получай огурец
I'm learning to live...
Stilet вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический список в С серг Общие вопросы C/C++ 0 04.03.2010 19:54
Динамический список Ker_33rus Общие вопросы C/C++ 3 04.03.2010 09:32
Динамический список ... doseras JavaScript, Ajax 0 08.12.2009 17:06
Динамический список...на Delphi Olgasato Помощь студентам 6 11.12.2007 15:02
Динамический список (срочно!) Achtung-Partizanen Помощь студентам 4 08.05.2007 16:08