void obmen(){
int n1, n2;
elem *a1,
*a2,
*l1;
info haract;
list = first;
clrscr();
printf ("vvedite n1\n");
scanf ("%d", &n1);
printf ("vvedite n2\n");
scanf ("%d", &n2);
clrscr();
while (list){
if ((*list->next).har.nomer == n1)
a1 = list;
if ((*list->next).har.nomer == n2)
a2 = list;
list = (*list).next;
}
l1 = a1 -> next;
a1 -> next = a2 -> next;
a2 -> next = l1;
l1 = a1 -> next -> next;
a1 -> next -> next = a2 -> next -> next;
a2 -> next -> next= l1;
numer ();
Обмен элементов дин.структуры(первый элемент))
Вот функция обмена ,которая меняет все элементы ,кроме первого.
Код:
numer( ) - функция пронумерации элементов.Вот мне что интересно.Мне сказали ,что для обмена элементов структуры необходимо менять их указтели next .Т.е. для начала поставить указатели на элемент раньше того элемента ,который мы хотим обменять (что у меняи делается в первом цикле),а затем меняются указатели a1->next,a2 ->next .Но что делать с первым элементом?Как поставить указатель на элемент раньше первого?В общем .как вообще сделать обмен первого элемента.Я пробывал делать проверку ,если введенный нмоер с клавиатуры равен единице,значит нужно делать обмен ,как частный случай обмена с первым элементом.Но у меня не получалось обменять элементы.Подскажите плиз ,как поменять первый элемент с каким нибудь другим ?:confused::(:mad:
Если первый элемент это глава, то есть head(у вас first или last я не знаю), а вам надо обменять следующий с последующим, то просто нужно ввести указатель который будет содержать предыдущий элемент списка.
Код:
list *ptr;//указ на текущий э-т
list *ptr_t;//указ на следующий э-т
list *temp;// указ на предыдющий э-т
ptr=temp=first;//то есть temp сейчас указывает на 1 э-т, главу
ptr_t=ptr->next;//указывает на след э-т
if(ptr!=first)//если э-т не 1-й
if(ptr_t->next==NULL)// если следующий за текущем последний э-т не имеет следующего
{
//меняем связи
ptr_t->next=ptr;//след теперь указвает на текущий
ptr->next=NULL;//тек теперь указвает на след след, которого нет
temp->next=ptr_t;//пред указ на след
}
temp=ptr;//запоминаем слдеующий будущий пред-ий
ptr=ptr->next;//переходим на след э-т
list *ptr_t;//указ на следующий э-т
list *temp;// указ на предыдющий э-т
ptr=temp=first;//то есть temp сейчас указывает на 1 э-т, главу
ptr_t=ptr->next;//указывает на след э-т
if(ptr!=first)//если э-т не 1-й
if(ptr_t->next==NULL)// если следующий за текущем последний э-т не имеет следующего
{
//меняем связи
ptr_t->next=ptr;//след теперь указвает на текущий
ptr->next=NULL;//тек теперь указвает на след след, которого нет
temp->next=ptr_t;//пред указ на след
}
temp=ptr;//запоминаем слдеующий будущий пред-ий
ptr=ptr->next;//переходим на след э-т