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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2012, 18:30   #1
Dimanw92
Пользователь
 
Регистрация: 23.09.2008
Сообщений: 25
По умолчанию

Здравтвуйте, недавно столкнулся с такой проблемой:
для осуществления сортировки списка необходимо менять местами 2 соседних элемента списка, вариант обмена информационными полями не подходит, необходимо осуществить перестановку именно переадресацией указателей. Вот что вышло (естественно не работает):
Код:
void sort (spisok * head )

{int s,b;
spisok *adr;
spisok *adr1;
spisok * tmp;
spisok * tmp1;
b=schet(head);
adr=head;
adr1=head;
for (int i=1; i<=pow(b,2); i++)
{
while (head->link != NULL)
   if (head->info>head->link->info)
{
         head->link=adr->link->link;
         head=adr->link;
         adr->link->link=adr1;
 }
head = head->link;
}
head=adr;
}
не работает конкретно вот этот элемент кода:
Код:
head->link=adr->link->link;
         head=adr->link;
         adr->link->link=adr1;
кто сталкивался, подскажите как нужно осуществлять такую перестановку. Заранее спасибо.

уточню, список однонаправленный.

Последний раз редактировалось Stilet; 20.05.2012 в 18:54.
Dimanw92 вне форума Ответить с цитированием
Старый 20.05.2012, 21:16   #2
Dimanw92
Пользователь
 
Регистрация: 23.09.2008
Сообщений: 25
По умолчанию

возможно ошибка не в этом, программа зицикливается при вызове этой функции
Dimanw92 вне форума Ответить с цитированием
Старый 20.05.2012, 21:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
уточню, список однонаправленный.
т.е. я никак не могу обратиться к предидущему элементу, если он уже пройден?
Код:
while (head->link != NULL)
   pred=head;
   if (head->info>head->link->info)
{
        spisok *qq=head->link; //Запомним на что указывает текущий
        pred->link=head->link; //Предидущий зацепим на следующий после текущего
        head=qq->link; // Текущий зацепим на следующий после следующего
        qq->link=head; // Следующий зацепим на текущий, поставив его вперед
 }
head = head->link;
}
т.е. идея в том что в любом случае придется обращаться к предидущему элементу. Раз нельзя пересаживать области данных.
Я может и не точно написал - тестировать надо, но смысл довести постарался
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2012, 21:39   #4
Dimanw92
Пользователь
 
Регистрация: 23.09.2008
Сообщений: 25
По умолчанию

идея в общем понятна, но программа по-прежнему зацикливается, либо зависает
Dimanw92 вне форума Ответить с цитированием
Старый 21.05.2012, 21:58   #5
Dimanw92
Пользователь
 
Регистрация: 23.09.2008
Сообщений: 25
По умолчанию

вот весь код:
Код:
  #include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
struct spisok {
int info;
spisok *link;
};
int choise,a=0;
void Vyvod(spisok * head)
{
	int amount = 1;
	if(a==1)cout<<"No elements\n";
	else{
		cout<<"Elements:\n";
			while (head != NULL)
			{
				cout<<"Chislo nomer "<<amount<<endl;
				cout<<"X = "<<head->info<<endl;
				head = head->link;
				amount++;
			}
			cout<<"\n\n";
	}
}
int schet (spisok * head)
{int b = 1;
while (head != NULL)
			{
				head = head->link;
				b++;
			}
			return b;
    }

void Add(spisok * head,int data)
{
if (head==NULL)
{
head=new (spisok);
head->info=data;
head->link=NULL;
}
else
{
spisok *adr;
adr=head;
while(adr->link!=NULL)
{
    adr=adr->link;
}
adr->link=new(spisok);
adr=adr->link;
adr->info=data;
adr->link=NULL;
}
}
int Del(int data, spisok *first)
{
spisok*adr,*adr1;
adr=first;
if (adr->info==data)
{
first=adr->link;
if (first==NULL)
{a=1;
;}
delete adr;
}
else
{
while(adr->link!=NULL)
{ if(adr->link->info==data) {break;}
else{
adr=adr->link;
}}

if(adr->link->info==data)
{adr1=adr->link;
adr->link=adr->link->link;
delete adr1;}
else
{cout<<"\n net takogo elementa \n"; }
}
return a;
}

void sort (spisok * head)
{int s,b;
spisok * adr;
int tmp;
b=schet(head);
adr=head;
spisok *pred=head;
for (int i=1; i<=pow(b,2); i++)
{
while (head->link != NULL)
{ if (head->info>head->link->info)
{
    // tmp=head->info;
  //  head->info=head->link->info;
//head->link->info=tmp; }
//head = head->link;
        spisok *qq=head->link; //Çàïîìíèì íà ÷òî óêàçûâàåò òåêóùèé
        pred->link=head->link; //Ïðåäèäóùèé çàöåïèì íà ñëåäóþùèé ïîñëå òåêóùåãî
        head=qq->link; // Òåêóùèé çàöåïèì íà ñëåäóþùèé ïîñëå ñëåäóþùåãî
        qq->link=head; }
        head = head->link;
}
head=adr;
}
}

int Menu()
{

	cout<<"Vuberite element menu\n";
	cout<<"(1)dobavit' novoe chislo v spisok\n";
	cout<<"(2)sortirovat\n";
	cout<<"(3)vuvesti na ekran vse chisla spiska\n";
	cout<<"(4)udalit' chislo so spiska\n";
    cout<<"(5)vyhod\n";
	cin>>choise;
	cout<<endl;
	return choise;
}
 main()
{

      int x;
     // clrscr();

      cout<<"Vvedite pervoe chislo:\n";

	  cin>>x;
      cout<<"\n\n";
      spisok *first = new spisok;
first->info = x;
first->link = NULL;
while (choise!=5)
{
	Menu();
	if(choise == 1)
	{ if (a==1) { a=0;
	 cout<<"Vvedite chislo\n";
		cin>>x;
		cout<<"Chislo uspehno dobavleno v spisok\n\n";
spisok *first = new spisok;
first->info = x;
first->link = NULL;

}
else{
		cout<<"Vvedite chislo\n";
		cin>>x;
		Add(first,x);
		cout<<"Chislo uspehno dobavleno v spisok\n\n";
}
	}
    if(choise == 2)
	{if (a==1) { cout<<"No elements\n";}
	else
		sort(first);
	}
	if(choise == 3)
	{
		Vyvod(first);
	}
	if(choise == 4)
	{if(a==1)cout<<"No elements\n";
	else{
		cout<<"Vvedite chislo kotoroe nado udalit'\n";
		cin>>x;
		Del(x, first);
	}}

	if(choise == 5)
	{
		break;
	}
}
}
функция сортировки не работает, подскажите как исправить
Dimanw92 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текст в адресной строке welcomeTo PHP 8 25.12.2010 09:28
ошибка в арифметике Figushkin Помощь студентам 1 09.06.2010 07:11
Индикаторы в адресной строке Phantom JavaScript, Ajax 4 02.03.2010 12:13
Вопрос по адресной арифметике и Message в консольных приложениях Enikov Помощь студентам 5 01.01.2009 19:44
Перехват адресной строки браузера Garacio_cain Работа с сетью в Delphi 4 23.10.2008 13:48