dodawanie na elementach 2 list

0
 
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <conio.h>
#include <list>
using namespace std;
struct element
    {
            char cyfra;
            struct element *next;
    };
struct element *nowy_element(char d)
    {
            struct element *wsk; //wskaznik pomocniczy
            wsk=new element;
            wsk->cyfra=d;
            wsk->next=NULL; //wskaźnik wskazuje na null, czyli tam gdzie nic nie ma
            return wsk;
    }
struct element *add_element(struct element *poczatek, struct element *nowy)
    {
            nowy->next=poczatek;
            return nowy;
    }
struct element pierwsza()
{
    struct element *poczatek1;//dwie listy, więc dwa oddzielne początki
    poczatek1 = NULL; //zerujemy początki, staną się one końcami swoich list
	element *temp1=poczatek1;
    char d;
    cout<<" WPISZ liczbe pierwsza ";
    do
    {
            d=getchar();
            poczatek1=add_element(poczatek1, nowy_element(d));
   
    }
    while(d!='\n');
	return *poczatek1;
}
struct element druga()
{
	char d;
	struct element *poczatek2;
	poczatek2 = NULL;
	element *temp2=poczatek2;
    cout<<" WPISZ liczbe druga ";
    do
    {
        d=getchar();
        poczatek2=add_element(poczatek2,nowy_element(d));
    }
    while(d!='\n');
    return *poczatek2;
}
void wyswietlanie(element *temp)
{	
	struct element *poczatek=NULL;
	cout<<"TWOJA LICZBA TO= "<<endl;
	while(temp!=NULL)
	{
		cout<<temp->cyfra<<" ";
		temp=temp->next;
	}
}
struct element dodawanie(element *poczatek1,element *poczatek2)
{
	struct element *poczatek3;
	poczatek1=poczatek2=poczatek3=NULL;
    element *temp1=poczatek1;
    element *temp2=poczatek2;
    element *temp3=poczatek3;
    //funkcja dodawania:
    while((poczatek1&&poczatek2)!=NULL)
    {
        if((temp1->cyfra)+(temp2->cyfra)>=10)
        {
                temp3->cyfra=(temp1->cyfra)+(temp2->cyfra);
                (temp3->cyfra)%10;
                poczatek3=add_element(poczatek3, nowy_element(temp3->cyfra));
                temp1=temp1->next;
                temp1->cyfra++;
                temp2=temp2->next;
                temp3=temp3->next;
        }
        if((temp1->cyfra)+(temp2->cyfra)<10)
        {
                poczatek3=add_element(poczatek3, nowy_element(temp3->cyfra));
                temp1=temp1->next;
                temp2=temp2->next;
                temp3=temp3->next;
        }
		if((temp1->cyfra)==NULL && (temp2->cyfra)!=NULL)
		{
			temp3=temp2->next;
		}
		if ((temp1->cyfra)!=NULL && (temp2->cyfra)==NULL)
		{
			temp3=temp1->next;
		}
	}
	cout<<"TWOJA LICZBA TO= "<<endl;
	while(temp3!=NULL)
	{
		cout<<temp3->cyfra<<" ";
		temp3=temp3->next;
	}
	return *poczatek3;
}
int main()
{
	struct element jakistam1, jakistam2, dodaj;
	jakistam1=pierwsza();
	//wyswietlanie(&jakistam1);
	jakistam2=druga();
	//wyswietlanie(&jakistam2);
	dodaj=dodawanie(&jakistam1,&jakistam2);
	//wyswietlanie(&dodaj);

	system("pause");
	return 0;

}

wygląda to tak, tylko przy returnie z dodawania wywala mi się cały program z tym, że nie zna wartości *początek3...
co jest źle? czy coś przeoczyłam??

0

Po co to robic na charach skoro stringi sa o wiele bardziej intuicyjne?

0

Takie wymogi projektu.

0

Nie zajmujemy sie odrabianiem zadan domowych

0

Ja nie szukam gotowej odpowiedzi...tylko podpowiedzi!

0

Nie chcę mi się analizować milionowej listy w moim życiu, ale jak już poprawnie wczytasz te dane, to ten program nie będzie się dużo różnił od tego, który Ci wcześniej napisałem..

#include <iostream>
#include <algorithm>
#include <string>
int StrToInt(char n){
    return n-'0';
}
char IntToStr(int n){
    return n+'0';
}
char Plus(char l,char l1,int &p){
    int s=StrToInt(l)+StrToInt(l1)+p;
    p=0;
    if(s<=9)
        return IntToStr(s);
    else{
        p = s/10;
        return IntToStr((s%10));
    }
}
std::string Plus(std::string liczba,std::string liczba1){
    std::string suma;
    int p=0,pozL=liczba.size(),pozR=liczba1.size();
    while(pozL&&pozR){
        suma+=Plus(liczba[pozL-1],liczba1[pozR-1],p);
        pozL--;
        pozR--;
    }
    while(pozL){
        suma+=Plus(liczba[pozL-1],'0',p);
        pozL--;
    }
    while(pozR){
        suma+=Plus(liczba1[pozR-1],'0',p);
        pozR--;
    }
    if(p)
        suma+=IntToStr(p);
    std::reverse(suma.begin(),suma.end());
    return suma;
}
int main(){
    std::string liczba,liczba1;
    std::cin>>liczba;
    std::cin>>liczba1;
    std::cout<<Plus(liczba,liczba1);
    return 0;
}

Tyle,że będziesz szukał do !=NULL,a nie size()>=0

Funkcje Plus praktycznie się nie zmienią..

0

Jak sie nie ogarnia to trzeba wrocic do grebosza. a zreszta. jesli chcesz podpowiedzi prosze:zrob to na stringach.

0

Niestety prowadzący uparł się na listy. Już i tak 50% wytraciłam za nie oddanie w terminie... Właśnie tutaj o to chodzi że program sie sypie przy zwrocie funkcji dodawania. Zupełnie jakby nie umiał wyprowadzić tej listy...

0

Robisz to praktycznie tak samo jak kod wyżej, tyle, że zamiast

suma+=IntToStr(p);

Musisz dodawać to do listy, czyli musisz mieć jakąś funkcje

dodajDoListy(element *glowa,char n);

dodajesz coś w stylu..

dodajDoListy(glowa,IntToStr(pozL->cyfra));

i tyle, że w while(pozL->next&&pozR->next) pozL i pozR to będą wskaźniki a nie stringi, które po czasie zwrócą NULL, a nie size()>=0

Nie mam ani czasu ani ochoty prowadzić Cie za rączkę. Jak nie potrafisz, to daj ogłoszenie.

0
kopernik napisał(a)

Robisz to praktycznie tak samo jak kod wyżej, tyle, że zamiast

suma+=IntToStr(p);

Musisz dodawać to do listy, czyli musisz mieć jakąś funkcje

dodajDoListy(element *glowa,char n);

dodajesz coś w stylu..

dodajDoListy(glowa,IntToStr(pozL->cyfra));

i tyle, że w while(pozL->next&&pozR->next) pozL i pozR to będą wskaźniki a nie stringi, które po czasie zwrócą NULL, a nie size()>=0

Nie mam ani czasu ani ochoty prowadzić Cie za rączkę. Jak nie potrafisz, to daj ogłoszenie.

A mozesz wyjaśnić czemu są dwie funkcje dodaj? jedna char a druga string?

0

string zwraca cały wynik. W twoim wypadku, będziesz musiał zwrócić wskaźnik do początku listy. A char zwraca wynik dodawania liczb na n-tym miejscu, oraz przeniesienie, przez referencje.

0

Dodawanie. Na nic więcej nie licz.

#include <iostream>
struct element{
    char znak;
    element* nastepny;
};
void dodaj(element *glowa,char n){
    while(glowa->nastepny){
        glowa=glowa->nastepny;
    }
    element *temp=new element;
    temp->znak=n;
    temp->nastepny=NULL;
    glowa->nastepny=temp;
}
void drukuj(element* glowa){
    glowa=glowa->nastepny;
    while(glowa->nastepny){
        std::cout<<glowa->znak;
        glowa=glowa->nastepny;
    }
}
void l_reverse(element * &head){
    element *p, *pc;
    if(head){
        pc = head;
        while(pc->nastepny){
            p = pc->nastepny;
            pc->nastepny = p->nastepny;
            p->nastepny = head;
            head = p;
        }
    }
}
bool UsunListe(element *head){
     if (!head->nastepny) return false;
      UsunListe(head->nastepny);
      delete head;
      return true;
}
int StrToInt(char n){
    return n-'0';
}
char IntToStr(int n){
    return n+'0';
}
char Plus(char l,char l1,int &p){
    int s=StrToInt(l)+StrToInt(l1)+p;
    if(s<=9)
        return IntToStr(s);
    else{
        p = s/10;
        return IntToStr((s%10));
    }
}
element* Plus(element* liczba,element* liczba1){
    element* suma=new element;
    suma->nastepny=NULL;
    suma->znak='0';
    int p=0;
    while(liczba->nastepny&&liczba1->nastepny){
        liczba=liczba->nastepny;
        liczba1=liczba1->nastepny;
        dodaj(suma, Plus(liczba->znak,liczba1->znak,p));
    }
    while(liczba->nastepny){
        liczba=liczba->nastepny;
        dodaj(suma, Plus(liczba->znak,'0',p));
    }
    while(liczba1->nastepny){
        liczba1=liczba1->nastepny;
        dodaj(suma, Plus(liczba1->znak,'0',p));
    }
    if(p)
         dodaj(suma,Plus('0','0',p));
    l_reverse(suma);
    return suma;
}
int main(){
    element *l=new element,*l1=new element;
    l->znak=l1->znak='0';
    l->nastepny=l1->nastepny=NULL;
    char temp;
    std::cout<<"Podaj pierwsza liczbe\n:";
    while(std::cin>>std::noskipws>>temp){
        dodaj(l,temp);
        if(temp=='\n') break;
    }
    std::cout<<"Podaj druga liczbe\n:";
    while(std::cin>>std::noskipws>>temp){
        dodaj(l1,temp);
        if(temp=='\n') break;
    }
    l_reverse(l);
    l_reverse(l1);
    std::cout<<"Wynik:\n";
    element *wynik=Plus(l,l1);
    drukuj(wynik);
    if(UsunListe(l)&&UsunListe(l1)&&UsunListe(wynik))
        std::cout<<"\n\nZwolniono Pamiec\n\n";
    return 0;
}

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