lista jednokierunkowa z funkcją bool

0

Mam problem dotyczący zadania z treścią:

Zdefiniowana jest struktura Node:

struct Node
{int data;Node* next;
};

Program tworzy listy jednokierunkowe obiektów tego typu. Dla tworzonych list należy zapewnić następującą funkcjonalność:

  • dodawanie do listy węzła zawierającego dane typu int w ten sposób, że jeśli na liście jest już węzeł z daną o tej wartości, to nowy węzeł nie jest dodawany,a funkcja zwraca false; w przeciwnym przypadku nowy węzeł jest dodawany(na początek listy), a funkcja zwracatrue;

Do funkcji add oraz clean „głowa” listy (a więc wskaźnik na pierwszy węzeł listy)przekazywana jest przez referencję, tak, aby funkcja mogła ją zmienić. Schemat programu:


#include <iostream>
struct Node {
int   data;
Node* next;
};

bool add(Node*& head, int data);
size_t size(const Node* head);
void clear(Node*& head);
void printList(const Node* head);

int main() {
    using std::cout; using std::endl;
    
    int tab[] = {1,4,1,3,5};
    
    Node* head = 0;
    
    for (size_t i = 0, e = std::size(tab); i != e; ++i) {
        bool b = add(head,tab[i]);
        
        cout << tab[i] << (b ? "     " : " NOT ")
        
        << "added" << endl;
    }
    
    //cout << "Size of the list: " << size(head) << endl;
    
    printList(head);
    //clear(head);
    
}

mam taki pomysł by sprawdzić listę przed dodaniem liczby i sprawdzić czy posiada ona już go i jeśli nie to go dodać a jak tak to nie dodawać, ale jak to zrobić? nie wiem jak by to miało wyglądać, mam takie coś co oczywiście nie działa i nie wiem co zrobić by działało dlatego proszę o pomoc:

bool add(Node*& head, int data){
    
        
    Node* current = head;
    Node* new_node = new Node();
    
    while (head != NULL){
        if(current->data == data)
            
        return false;
        current = current->next;
    }
   
      new_node->data = data;
      new_node -> next = &(*head);
    
    return true;

}
0

@lolek997: Zdefiniuj nie działa.
Na pierwszy rzut oka Node*& wygląda bardzo dziwnie, raczej potrzebujesz Node*.

0

oczekiwany rezultat z tego zadania to:
1 added
4 added
1 NOT added
3 added
5 added

a ja dostaje takie cos:

1 added
4 added
1 added
3 added
5 added

Node*& jest z treści zadania i tego nie dodawałem, tak po prostu ma być

0

@lolek997: Problem polega na tym, że wywołujesz funkcję ze zmienną head, która nie jest headem.

EDIT: I jeszcze head jest NULLem na początku.

0

Pattern, przeszukiwania listy w funkcji, print_list.
https://github.com/lion137/C_datastructures/blob/master/linked_list/linked_list.h

1

Zmieniłem wiersze oznaczone //! oraz dodałem wiersz oznaczony //+

bool add(Node*& head, int data){
    Node* current = head;

    while (current != NULL){ //!
        if(current->data == data)
            return false;
        current = current->next;
    }

    Node* new_node = new Node(); //!
    new_node->data = data;
    new_node->next = head; //!
    head = new_node; //+

    return true;
}

Fragment z while mógłby być wydzielony do osobnej funkcji find

Node* find(Node* head, int data){
    while (head){
        if(head->data == data)
            return head;
        head = head->next;
    }
    return nullptr;
}

bool add(Node*& head, int data){
    if (find(head, data))
        return false;

    Node* new_node = new Node();
    new_node->data = data;
    new_node->next = head;
    head = new_node;
    return true;
}
0

Do tego co napisał @-daniel- dodałbym jeszcze funkcję tworzącą węzł.

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node* next;
};

bool find(Node *head,int data)
{
    while((head)&&(head->data!=data)) head=head->next;
    return head;
}

Node *make(int data,Node *next)
{
    Node *node=new Node();
    node->data=data;
    node->next=next;
    return node;
}

bool add(Node *&head,int data)
{
    if(find(head,data)) return false;
    head=make(data,head);
    return true;
}

int main() 
{
    int tab[]={1,4,1,3,5};
    static const char *yesno[]=
	{
		" NOT ",
		"     "
	};
    Node *head=0;
    for(size_t i=0;i<size(tab);++i) cout<<tab[i]<<yesno[add(head,tab[i])]<<"added"<<endl;
    //printList(head);
    //cleanList(head);
    return 0;
}

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