0 / 0 / 0
Регистрация: 20.03.2010
Сообщений: 39
|
|
1 | |
разреженная матрица22.03.2011, 19:46. Показов 1873. Ответов 0
Метки нет (Все метки)
Помогите, пожалуйста, с задачей:Дана разряженная матрицы общего вида. Осуществить циклический сдвиг в матрице каждого столбца на 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]; //возвращаем количество элементов }
0
|
22.03.2011, 19:46 | |
Ответы с готовыми решениями:
0
Разреженная матрица Разреженная матрица Осуществить циклический сдвиг в матрице каждого столбца на n разрядов (разреженная матрица) Разработать класс "Разреженная матрица" |
22.03.2011, 19:46 | |
22.03.2011, 19:46 | |
Помогаю со студенческими работами здесь
1
Разреженная матрица Разреженная матрица Умножение разреженная матрица Разреженная вещественная матрица Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |