| Из всех заданых мне заданий вроде бы всё сделал, вот только не могу сделать функцию, переставляющую елементы списка местами( как угодно, но только не сильно замудрённо), помогите пожалуйста !!!
//////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <new.h>
#include <stdio.h>
#include <iostream.h>
#include <ctime>
#include <stdlib.h>
//функция, заполняющая масив случайными значениями
void random (int *p,int r)
{
for(int i=0;i<r;i++)
p[i]=rand();
}
// сума элементов масива
int sum_elem (int *p,int r)
{
int suma=0;
int *j=p;
for(int i=0;i<r;i++)
suma+=j[i];
return suma;
}
// ф-ия, печатающая содержанее масива
void print (int *p,int rozmir)
{
for(int i=0;i<rozmir;i++)
cout<<"p["<<i<<"] : "<<p[i]<<endl;
}
//-----------------------структура, сохраняющая элеметы списка---------------------------
struct nomer
{
int a;
nomer *prev,*next;
};
nomer *add_nomer (nomer *e,int add) //Добавление элемента в конец
{
if(e==NULL){
e=new nomer;
e->a=0;
}
if(e->a){
while (e->next)
e=e->next;
nomer *pz=new nomer;
e->next=pz;
pz->prev=e;
pz->next=NULL;
pz->a=add;
}else{
e->a=add;
e->next=NULL;
e->prev=NULL;
}
return e;
}
//------------------------поиск последнего елемента списка---------------------------------
nomer *GetLast (nomer *begin)
{
if (!begin) // проверка существования первого элемента
return NULL;
while (begin ->next)
begin = begin ->next;
return begin; //возвращение указателя на последний элемент
}
//------------------------ 1. Очистка списка -------------------------------
void clean_list (nomer *begin)
{
nomer *cl;
while (begin ->next)
{
begin ->prev = NULL;
begin = begin ->next;
cl = begin ->prev;
cl -> next = NULL;
}
}
//---------------------------2. Добавление элемента в конец списка----------------------------------------
nomer *add_tail (nomer *begin, int z)
{
nomer *last = GetLast (begin);
if (!last)
{
cout << "!last = NULL" << endl;
cout << last << endl;
return NULL;
}
nomer *p = new nomer;
last -> next = p;
p -> prev = last;
p -> next = NULL;
p -> a = z;
return 0;
}
//--------------------------- 4. Получение указателя на i-ый элемент списка ----------------------------------------
nomer *show_i_element (nomer *begin , int i)
{
// int i;
//cout << "Vvedite nomer elementa masiva = ";
//cin >> i;
for (int z = 0; z < i; z++)
begin = begin ->next;
cout << begin;
return begin;
}
//------------------------- 5. Получение номера элемента за его указателем -------------------
int show_pokazchik_i_elementa (nomer *begin, nomer *pokaz)
{
int i = 1;
while (!((begin ->next) == pokaz))
{
i++;
begin = begin ->next;
}
cout << "Nomer elementa = " << i << " pri pokazchike = " << pokaz <<endl;
return i; //повертаємо номер елементу
}
//------------------------- 7. Удаление с елемента a по елемент b -------------------
void fun_delete (nomer *begin)
{
int a, b;
cout << "Vvedite zna4enie a = "; cin >> a; cout << endl;
cout << "Vvedite zna4enie b = "; cin >> b; cout << endl;
nomer *y = show_i_element (begin, a - 1); // указатель на a елемент
nomer *k = show_i_element (begin, b - 1); // указатель на b елемент
y ->next = k;
k ->prev = y;
}
//------------------------9. Вставка елемента в список перед обозначеным елементом---------------------------------
void vstav_element (nomer *begin)
{
int i;
cout << "Vveditb i element = ";
cin >> i;
nomer *y = show_i_element (begin, i - 1);
nomer *k = show_i_element (begin, i); // указатель на і-й елемент
nomer *p = new nomer;
y -> next = p;
p ->next = k;
k ->prev = p;
p ->prev = y;
cout << "Vveditе zna4еnie = ";
int z;
cin >> z;
p ->a = z;
}
//------------------------- 10. Печать содержащихся элементов на экран -------------------
void show_all (nomer *begin)
{
int i = 1;
while (begin ->next)
{
cout << "element spiska = " << i << endl;
i++;
cout << "zna4enie a = " << begin->a << endl << endl;
begin = begin ->next;
}
cout << "element spiska = " << i << endl;
i++;
cout << "zna4enie a = " << begin->a << endl << endl;
begin = begin ->next;
}
//--------------------------- main ----------------------------------------
int main(int argc, char* argv[])
{
int r;
cout<<"Razmer masiva: \n";
cin>>r;
int *j=new int[r];
random(j,r);
print(j,r);
cout<<"Suma: "<<sum_elem(j,r)<<endl;
delete [] j;
nomer w1;
w1.a=1;
w1.prev = NULL;
w1.next = NULL;
// инициализация значений элементов
for (int o = 2; o < 8; o++)
add_tail (&w1, o); //
nomer *pz=new nomer;
pz->a=0;
pz=add_nomer(pz,2);
pz=add_nomer(pz,3);
pz=add_nomer(pz,4);
bool d = true;
while (d)
{
// Оператор-переключатель
cout << endl << "Chto nyzno sdelat?" << endl
<< "1.Vuvesti vse elementu!" << endl
<< "2. Ydalit' vse?" << endl
<< "3. poly4enie 'i' elementa?" << endl
<< "4. poly4enie ykazatel9?" << endl
<< "5. vstavka elevmentov v spisok pered 'i'?" << endl
<< "6. ydalit' ot 'a' do 'b'?" << endl
<< "7. dobavlenie elementa v konec?" << endl
<< "8. EXIT" << endl;
nomer *p;
int j;
cin >> j;
switch ( j )
{
case 1: show_all (&w1); break; case 2: clean_list (&w1); break;
case 3: p = show_i_element (&w1, 3); break;
case 4: show_pokazchik_i_elementa(&w1, p); brea;
case 5: vstav_element (&w1); break;
case 6: fun_delete (&w1); break;
case 7:
int m;
cout << "znachenna elementy = ";
cin >> m;
add_tail (&w1, m); break;
case 8: d = false; break;
default: cout << "nepravilno";
}
}
return 0;
} | |