Chcę zaimplementować operacje dodawania wektorów i iloczynu skalarnego na wektorach rzadkich.
Mój wektor rzadki to lista jednokierunkowa (zawierająca niezerowe składowe wektora)w takiej postaci:
Kod: Zaznacz cały
struct TWezel{
int wartosc;
int nr_skladowej;
TWezel *nast;
};
Suma: równoległe przebieganie przez obydwie listy/tablice z wybieraniem zawsze elementu z mniejszą pozycją (z dwóch list/tablic) i w przypadku napotkania równych pozycji: sumowanie.
Iloczyn skalarny: przebieganie przez listę/tablicę i mnożenie tylko elementów, które mają równą wartość pozycji.
ale nie potrafię tego poprawnie zaimplementować.
oto cały kod:
Kod: Zaznacz cały
#include <cstdlib>
#include <iostream>
using namespace std;
struct TWezel{
int wartosc;
int nr_skladowej;
TWezel *nast;
};
bool dodaj_skladowa(TWezel *& poczatek,int nr_skl,int wartosc_skl){
TWezel * tmp= new TWezel;
if(tmp!=NULL){
tmp->wartosc=wartosc_skl;
tmp->nr_skladowej=nr_skl;
tmp->nast=poczatek;
poczatek=tmp;
return true;
}
return false;
}
bool pusta(TWezel * w){
return (w==NULL);
}
bool usun_skladowa(TWezel *&w){
if(!pusta(w)){
TWezel *tmp = w;
w=w->nast;
delete tmp;
return true;
}
else {
return false;
}
}
void wyswietl_wektor(TWezel *&poczatek){
TWezel * wezel = poczatek;
if(!pusta(poczatek)){
while(wezel!= NULL){
cout << "wartosc skladowej nr " << wezel->nr_skladowej <<" wynosi " << wezel->wartosc <<endl;
wezel= wezel->nast;
}
}
else {
cout << "Wektor jest zerowy." <<endl;
}
}
TWezel * dodaj_wektory(TWezel * w1,TWezel *w2){
TWezel *tmp=new TWezel;
TWezel * wekt1=w1;
TWezel * wekt2=w2;
while(wekt1!=NULL){
if(wekt1->nr_skladowej==wekt2->nr_skladowej){
dodaj_skladowa(tmp,wekt1->nr_skladowej,wekt1->wartosc + wekt2->wartosc);
}else{
TWezel *t;
if(wekt1->nr_skladowej<wekt2->nr_skladowej)
t=wekt1;
else
t=wekt2;
dodaj_skladowa(tmp,t->nr_skladowej,t->wartosc);
t=NULL;
}
wekt1=wekt1->nast;
wekt2=wekt2->nast;
}
return tmp;
}
TWezel * pomnoz_skalarnie(TWezel * w1,TWezel *w2){
TWezel *tmp=new TWezel;
if(tmp!=NULL){
TWezel * wekt1=w1;
TWezel * wekt2=w2;
while(wekt1!=NULL){
if(wekt1->nr_skladowej==wekt2->nr_skladowej){
dodaj_skladowa(tmp,wekt1->nr_skladowej,wekt1->wartosc * wekt2->wartosc);
}
wekt1=wekt1->nast;
wekt2=wekt2->nast;
}
return tmp;
}
else
return NULL;
}
int main(int argc, char *argv[])
{
TWezel * w1 =NULL;
.......
//dalej znajdują się wyłania tych funkcji
Jak prawidłowo zaimplementować te operacje na wektorach??