Форум: Форум C++Разное
Новые темы: 00
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Динамическая память и указатели ((
 
 автор: metiS   (15.03.2010 в 00:54)   письмо автору
 
 

Из всех заданых мне заданий вроде бы всё сделал, вот только не могу сделать функцию, переставляющую елементы списка местами( как угодно, но только не сильно замудрённо), помогите пожалуйста !!!

//////////////////////////////////////////////////////////////////////////////


#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;
}

  Ответить  
 
 автор: .....   (17.03.2010 в 14:09)
 
   для: metiS   (15.03.2010 в 00:54)
 

что-то непохоже что это работает как нужно
взять хотябы

int *j=new int[r];
random(j,r);
print(j,r);
cout<<"Suma: "<<sum_elem(j,r)<<endl;
delete [] j;
здесь массив простой, и он уничтожается после того как распечатан.

потом вызывается в цикле
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;
}
( должна возвращать nomer* а фактически может только 0 или NULL )
и к первому рукодельному nomer создаёт ещё штук семь

потом создаётся ещё другая ссылка на другой nomer
nomer *pz=new nomer;
дальше вроде нигде не используется.

и ничего не понятно, даже как это должно работать. запустил выбрал 2: clean_list , потом 1: show_all и элементы остались, вобщем если сделать нормально это, в процессе должно стать понятно как можно переставить элементы :) Просто два значения переставляются вроде только с временным сохранением одного и них в третьем месте . или готовой функцией.

  Ответить  
 
 автор: metiS   (18.03.2010 в 19:47)   письмо автору
 
   для: .....   (17.03.2010 в 14:09)
 

Спасибо, буду что-то думать, просто я с этой лабой уже 2 недели воюю, и ничего толкового не выходит ((

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования