Форум программистов, компьютерный форум CyberForum.ru

разреженная матрица - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
sveta11115
0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
22.03.2011, 19:46     разреженная матрица #1
Помогите, пожалуйста, с задачей:Дана разряженная матрицы общего вида. Осуществить циклический сдвиг в матрице каждого столбца на n разрядов.
У меня есть программа, где сдвиг каждой строки на n разрядов.
Если можно, переделайте, пожалуйста, на сдвиг каждого столбца на n разрядов.
Для строк вот программа:
#include "iostream"
#include "conio.h"

using namespace std;

struct mas
{
int A;
int LJ;
mas *next;
};


int create(mas*, int*, int, int);
void print(mas*, int*, int, int);
int func(mas*, int*, int, int, int);

int main()
{
int m,n,num,*LI,k;
mas *X;

cout<<"Enter number of rows and columns: ";
cin>>m>>n;
X=new mas;
LI=new int[m+1];
num=create(X,LI,m,n);
cout<<"\nYour matrix:\n";
print(X,LI,m,n);
cout<<"\nnum="<<num;
cout<<"\nEnter length of cycle: ";
cin>>k;
num=func(X,LI,m,n,k);
cout<<"\nYour matrix after cyclic shift:\n";
print(X,LI,m,n);
getch();
return 0;
}

int create(mas *X, int *LI, int m, int n)//функция создания матрицы
{
int i,j,num,k,f;
mas *z=X,*p,*q;
num=0;
z->A=0;
p=z;
q=z;
cout<<"Enter your matrix:\n";
for (i=0;i<m;i++)
{
f=0;
for (j=0;j<n;j++)
{
cin>>k;
if (k!=0)
{
if (f==0)
{
LI[i]=num;
f=1;
}


if(!z->A) //если вводится самый первый элемент
{
z->A=k;
z->LJ=j;
z->next=0;
num++;
}
else
{
z->next=new mas;
z=z->next;
z->A=k;
z->LJ=j;
z->next=0;
num++;
}
}
}

}
cout<<"\n";
while (p!=0)
{
cout<<p->A<<" "; //вывод ненулевых элементов
p=p->next;
}
cout<<"\n";
while (q!=0)
{
cout<<q->LJ<<" "; //вывод индекса j каждого ненулевого элемента
q=q->next;
}
cout<<"\n";
LI[m]=num;
for (i=0;i<=m;i++)
cout<<LI[i]<<" "; //вывод LI(местоположения 1 ненул. эл—та в каждой строке)
return num;
}

void print(mas *X,int *LI, int m, int n) //функция вывода матрицы
{
mas *p;
p=X;
int i,j,k,f;
for (i=0; i<m; i++)
{
f=LI[i+1]-LI[i]; // число ненулевых элементов в строке
k=0;
for (j=0; j<n; j++)
if ((p->LJ==j)&&(k<f))
{
cout<<p->A<<" ";
if(p->next) p=p->next;
k++;
}
else cout<<"0 ";
cout<<"\n";
}
}





int func(mas *X, int *LI, int m, int n, int k)//функция, осуществляющая циклический сдвиг каждой строки на n элементов
{
mas *p, *tmp, *tmp1, *tmp2, *q; //p-для вычисления индексов перед сортировкой,tmp2-указатель на начало каждой строки, q-для сортировки
int i,j,f, r,t1,t2;
p=X;
q=X;
tmp2=X;
tmp=X;
tmp1=X;
for (i=0; i<LI[m]; i++) //цикл по всем ненулевым элементам
{
if ((p->LJ+k)<n) p->LJ=p->LJ+k; //меняем значения LJ на новые
else p->LJ=p->LJ+k-n;
p=p->next;
}

for (i=0;i<m;i++)
{
f=LI[i+1]-LI[i]; //число ненулевых элементов в строке
for(j=0; j<=f-1; j++)
{ q=tmp2; //ссылаем q на первую позицию в строке
for (r=0; r<=f-2-j;r++)
if (q->LJ>q->next->LJ)
{
t1=q->LJ;
t2=q->A;
q->LJ=q->next->LJ;
q->A=q->next->A;
q->next->LJ=t1;
q->next->A=t2;
q=q->next;
}
else q=q->next;
}
for (j=0; j<f; j++) //передвигаем tmp2 на следующую строку
if(tmp2->next) tmp2=tmp2->next;
}

cout<<"\n";
for (i=0; i<LI[m]; i++)
{
cout<<tmp->A<<" "; //вывод нового массива А ненулевых элементов
tmp=tmp->next;
}
cout<<"\n";
for (i=0; i<LI[m]; i++)
{
cout<<tmp1->LJ<<" "; //вывод нового массива LJ индексов ненул.эл.
tmp1=tmp1->next;
}

return LI[m]; //возвращаем количество элементов
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2011, 19:46     разреженная матрица
Посмотрите здесь:

матрица C++
C++ Матрица
Матрица C++
Матрица C++
МАТРИЦА C++
C++ матрица
матрица C++
C++ Разреженная матрица
Матрица М * М C++
матрица М*М C++
Разработать класс "Разреженная матрица" C++
Осуществить циклический сдвиг в матрице каждого столбца на n разрядов (разреженная матрица) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 01:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru