wskaźniki i listy

0

mam do zrobienia program realizujacy podstawowe dzialania na zbiorach (suma, roznica, iloczyn)
ma to byc zrobione na wskaznikach, zbiory jako kolejki
niby cos mam, ale w sytuacji gdy np. iloczyn jest zbiorem pustym program sie wysypuje
czy ktos moglby mi pomoc??
ponizej kod tego co mam zrobione

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <math.h>
#include <conio.h>

typedef struct lista{
int liczba;
lista *adres;
} wskaznik;

wskaznik *utworz_liste (unsigned int);
wskaznik *suma (wskaznik *A, wskaznik *B);
wskaznik *kopiuj (wskaznik *C);
wskaznik *czy_nalezy (wskaznik *element, wskaznik *ZBIOR);
wskaznik *roznica (wskaznik *A, wskaznik *B);
wskaznik *iloczyn (wskaznik *A, wskaznik *B);
void pokaz_liste(wskaznik *glowa);

void main()
{
wskaznik *A = utworz_liste(4);
wskaznik *B = utworz_liste(5);
pokaz_liste(A);
pokaz_liste(B);
cout << "A + B = ";
pokaz_liste(suma (A,B));
cout << "A - B = ";
pokaz_liste(roznica (A,B));
cout << "A * B =";
pokaz_liste (iloczyn(A, B));

}

------------ UTWORZ LISTE -------------------------//////
wskaznik *utworz_liste(unsigned int zakres)
{
if (zakres)
{
int a=zakres;
cout <<"Tworze liste "<<a<< " elementowa"<<endl;
wskaznik *p=NULL, *glowa;

	while (zakres--)
	{
		if(!p)
		{
			p = new wskaznik;
			glowa = p;
			cout <<"podaj "<< (a-zakres)<<" element"<<endl;
			cin >>p->liczba;
		}
		else
		{
			p -> adres = new wskaznik;
			p = p -> adres;
			cout <<"podaj "<< (a-zakres)<<" element"<<endl;
			cin >>p->liczba;
		}
	}
	p -> adres = NULL;
	return (glowa);
}
else return(NULL);

}

-------------------- POKAZ LISTE --------------////////
void pokaz_liste(wskaznik *glowa)
{
while (glowa)
{
cout << glowa ->liczba << " ";
glowa = glowa ->adres;
}
cout << endl;
}

///--------------SUMA------------------///////
wskaznik *suma (wskaznik *A, wskaznik *B)
{
if (A && B)
{
wskaznik *nowa = kopiuj (A);
wskaznik *p;
while (B)
{
if (czy_nalezy (B, nowa))
{
p = new wskaznik;
p ->liczba = B ->liczba;
p ->adres = nowa;
nowa = p;
}
B = B ->adres;
}
return (nowa);
}
else if (A) return (kopiuj (A));
else return (kopiuj(B));
}

//////////*/ kopiuj *///////
wskaznik *kopiuj (wskaznik *C)
{
if (C)
{
wskaznik *p;
wskaznik *glowa;
p = new wskaznik;
glowa = p; //zapamietanie poczatku
p ->liczba= C ->liczba;

while (C->adres)
{
	p ->adres = new wskaznik;
	C = C->adres;
	p = p ->adres;
	p ->liczba = C ->liczba;
}
p ->adres = NULL;
return (glowa);

}
else return (NULL);
}

//* ---------- CZY NALEZY DO ZBIORU -------*//////////
wskaznik *czy_nalezy (wskaznik *element, wskaznik *ZBIOR)
{
while (ZBIOR)
{
if (element ->liczba == ZBIOR ->liczba)
return (NULL);
ZBIOR = ZBIOR ->adres;
}
return (element);
}

//----------- ROZNICA --------------////
wskaznik *roznica (wskaznik *A, wskaznik *B)
{
if (A && B)
{
wskaznik *glowa = NULL;
wskaznik *p = NULL;
while (A)
{
if (czy_nalezy (A, B))
{
if (!p)
{
p = new wskaznik;
glowa = p;
p ->liczba = A ->liczba;
}
else
{
p ->adres = new wskaznik;
p = p ->adres;
p ->liczba = A ->liczba;
}
}
A= A ->adres;
}
p -> adres = NULL;
return (glowa);
}
else if (A) return (NULL);
else return (kopiuj (A));
}

///////---------- ILOCZYN -----------//////
wskaznik *iloczyn (wskaznik *A, wskaznik *B)
{
if (A && B)
{
wskaznik *glowa = NULL;
wskaznik *p= NULL;
while (B)
{
if (!czy_nalezy(B, A))
{
if (!p) //tworzenie pierwszego elementu listy
{
p = new wskaznik;
glowa = p; // zapamietanie poczatku
p ->liczba = B ->liczba;
}
else
{
p ->adres = new wskaznik;
p = p ->adres;
p ->liczba = B -> liczba;
}
}
B = B ->adres;
}
p ->adres = NULL;
return (glowa);
}
else return (NULL);
}

0

czemu nie masz funkcji sprawdzającej czy zbiór jest pusty ? wtedy tylko dajesz
if (czypusty(a) or czypusty(b))
{
c->glowa=null;
}

0

w sumie cenna uwaga - dolacze do mojego programu
ale u mnie problem pojawia sie gdy te zbiory sa niepuste

0

próbowałem poprawićm jednak nazwy, których użyłeś przy tworzeniu list bardzo bardzo bardzo mi to utrudniają. Twój kod jest źle napisany, więc nawet jak uda Ci się poprawić ten błąd to radze dobrze Ci radzę: napisz to jeszcze raz...

0

az taka beznadzieja?? :(
a moze robiles kiedys cos podobnego?? a moze masz implementacje listy??
ja raczej mam marne pojecie o programowaniu, a na zaliczenie cos trzeba zrobic

0

Jesli chodzi o sama kolejke to masz tu przyklad i kilka funkcji:

struct kolejka 
   { 
   char dane[10]; 
   kolejka *ref;            //wskaznik do nastepnego elementu 
   }; 

   kolejka *pointer;      //wskaznik do aktualnego(ostatniego)elementu kolejki 
   kolejka *tmp;          //wskaznik pomocniczy
   kolejka *first;          //wskaznik do pierwszego elementu kolejki 

void add_queue(char dodaj[10]) 
{ 
tmp=new kolejka; 
strcpy(tmp->dane,dodaj); 
if (pointer==NULL) first=tmp; //ustawianie wkaznika do pierwszego elementu 
else pointer->ref=tmp; 
pointer=tmp; //przeskakujemy o 1 element 
} 

void delete_node(void) 
{ 
if (first!=NULL) 
   { 
   tmp=first->ref; 
   printf("Usunieto: %s\n",first->dane); 
   delete first; 
   first=tmp; 
   } else printf("Kolejka jest pusta\n"); 
} 
void print_queue() 
{ 
printf("Zawartosc kolejki:\n"); 
tmp=first; 
while (tmp!=NULL) 
   { 
   cout <<tmp->dane<<endl; 
   tmp=tmp->ref; 
   } 
} 
void delete_all(void) 
{ 
while (first!=NULL)   delete_node(); 
printf("\nKolejka oczyszczona. Dowolny klawisz..."); 
} 
0

jelo jesli piszesz w c++ to po co pisac implementacje skoro STL juz posiada liste.

0

w tym problem,ze ja mam to zrobic na wskaznikach...

1 użytkowników online, w tym zalogowanych: 0, gości: 1