Operacje na wektorach rzadkich

gorek
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 7 lis 2010, o 19:00
Płeć: Mężczyzna
Lokalizacja: Wrocław

Operacje na wektorach rzadkich

Post autor: gorek »

Witam

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;
       };
wyczytałem na innym forum ze:
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
Sumowanie wyświetla mi jakieś kosmiczne wyniki a iloczyn skalarny jeszcze dziwniejsze:(

Jak prawidłowo zaimplementować te operacje na wektorach??
ODPOWIEDZ