Lista jednokierunkowa sortujaca

0
#include <iostream>

using namespace std;

void insert(double);
void remove(double);
void print();
struct db{
    double num;
    struct db *next;
    };

db *head=NULL;

int main()
{
    db *head=NULL;
    insert(2.5);
    insert(2.2);
    insert(7.8);
    remove(2.2);
    insert(2.3);
    insert(11.2);
    print();
}



void insert(double num)
{
     db *cur, *tmp, *p;
     int i;
	 if (head==NULL) //we are creating first element of list
     {
        head= new db;
        head->num=num;
        head->next=NULL;
        return;              
     };
	 cur=head;
	 tmp=head;
	 while(cur->next !=NULL)
	 {
		if(num > cur->next->num) //we comparing num with every next num object on list
		{
			tmp=cur; //saves cur to tmp, which we will use to add element
			i++; //iterator, used to define if our num is bigger than some element on list or not, if its=0 than we going to create new head
			if(cur->next->num==num)
			{
				return;
			}
		}
		cur=cur->next; //loop progress
	 }
	 cur=tmp;                 //we creating new element, and if i=0 than we assigning head to it, otherwise we inputing it in middle
	 p=new db;
	 p->num=num;
	 if (p->num == head->num) //if head=num we are breaking function
	 {
		return;
	 }
	 p->next=tmp->next;
	 if(i==0)
	 {
		head=p;
	 }  else {tmp->next=p;}
	return; 
}


void remove(double num)
{
	db *cur;
    cur=head;
    if(cur->num==num)
    {
	head=cur->next;
	delete cur;
    }
    
    while(cur!=NULL)
    {
	if(cur->next->num==num)
	{
	    db *tmp;
	    tmp=cur->next;
	    cur=tmp->next;
	    delete tmp;	    
	}
    }
}

void print()
{
	db *cur;
    cur=head;
    while(cur->next !=NULL)
    {
	cout<<cur->num,"\n";
	cur=cur->next;
    }
}

Komentowałem w j.Angielskim, problem jest w tym ze funkcja print albo nie wypisuje, albo insert nie dopisuje liczb do listy, chociaż wygląda mi poprawnie kod. Dodam dla tych co nie zauważą po kodzie że lista ma dodawać liczby sortując je od razu.

na krotko opisze funkcje insert. Sprawdzamy czy lista istnieje, jesli nie to ją tworzymy, następnie przechodzimy całą listę szukając w którym miejscu nasza liczba będzie mniejsza od następnej, gdy znajdziemy ją to kończymy pętle, a w tmp zapisujemy wskaźnik do poprzedniej. Tworzymy nowy element któremu każemy wskazywać na następny, a poprzedniemu na nowy. Do tego na końcu są 2 if'y które mają za zadanie wyjść z funkcji jeżeli okaże się że insert musiałby wstawić 2 takie same liczby obok siebie.

0

dodam ze nie potrzebuje gotowca, ale jakiejś wskazówki co robię źle, bo własne błędy trudniej wychwycić.

0

po pierwsze to wydaje mi się, że brakuje Ci kilku nawiasów w stylu

(cur->next)->num

po drugie musisz rozpatrzyć sytuację, w której masz tylko jeden element na liście (samą głowę)
pamiętaj, że wówczas wskaźnik na następny element jest równy NULL więc warunek wejścia do pętli while (tam w około 40. linijce) nie zachodzi, przez co nie chce Ci zadziałać program - nigdy nie jest tworzony drugi element listy.

0

Problem polega na tym, że to jest strasznie skomplikowane to co napisałeś:

void insert(double num)
{
      db** insetTo= &head; // zacznij od początku listy

      while(*insertTo) { // szukaj do końca listy
          if ((*insertTo)->num < num) {
               break; // znaleziono element, przed który należy wstawić nową liczbę
          }
          insertTo = &(*insertTo)->next; // następny element wskazujący w liście
      }

      db* newItem = new db; // nowy element
      newItem->num = num;
      newItem->next = *insertTo; // nowy element wskazuje na stare miejsce
      *insertTo = newItem; // wstaw do odnalezionego miejsca
}

Na dodatek masz ewidentny błąd w print (przekombinowałeś warunek).

0

rano dziś udało mi sie to zrobic;] print rzeczywiscie mial blad. co do samego inserta to przepisałem calość w prostszej wersji na kilka if'ów i 1 while, co prawda nowy insert działa tak jak stary, ale dobrze i czytelnie wygląda, łatwiej w nim było poprawić błędy w założeniach.

co do tego co blipek napisal, dorobilem warunek ktory dziala jesli cur->next=NULL, w czasie pisania zapomniałem, a wyszło przy testowaniu

void insert(double num)
{
    db *cur, *tmp, *p;
    int i=0;
	if (head==NULL) //we are creating first element of list
    {
        head= new db;
        head->num=num;
        head->next=NULL;
        return;              
    };
	cur=head;
	tmp=head;
	if (num < head->num) //sprawdzamy czy liczba pasuje przed head
	{
		p=new db;
		p->num=num;
		p->next=head->next;
		head=p;
		return;
	}
	else
	{
		while(cur->next !=NULL) //jesli nie to sprawdzamy czy pasuje po head, do ostatniego el. listy
		{
			if(num > cur->num) //we comparing num with every next num object on list
			{
				tmp=cur; //saves cur to tmp, which we will use to add element
				if(cur->next->num==num)
				{
					return;
				}
			}
			cur=cur->next; //loop progress
		}
	};
		if (num > cur->num) //dodajemy po ostatnim elemencie
		{
			p=new db;
			p->num=num;
			p->next=NULL;
			cur->next=p;
		} else 
			{ //dodajemy przed ostatnim elementem
				cur=tmp;
				p=new db;
				p->num=num;
				p->next=cur->next;
				cur->next=p;
			}
	return; 
}

Tak dla potomnych. Mimo że w końcu sam znalazłem błędy to dzięki za pomoc

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