Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

Using Search, Union and Intersection in a Linked List, Program Crash

$
0
0
I'm workng on a project that I thought I understood and it turns out that I have no idea what I'm doing. The program is supposed to list different set of numbers out of an existing set, implemeting union and intersection. The program builds with no errirs and partially runs but then crashes. If someone can point out what I've done wrong and how to fit it I would be much obliged. Here is my code so far.

// list.cpp
// simple linked list program

#include <stdlib.h>
#include <string>
#include <iostream>

using std::cout;
using std::string;

// node object for the linked list
struct Node {
    int data;
    Node* link;
};

// implement a singly linked list
class LinkedList {protected:
    Node* front;        // pointer to the front of the linked list
    Node* back;         // pointer to the last node in the linked list

public:
    // constructs an empty list
    LinkedList() {
        front = back = NULL;
    }

	// search the list for a target value
    // return index if found or -1 if not found
    int Search(int targetVal) {
        Node* p;
        int count = 0;
        for (p = front; p != NULL; p = p->link) {
            if (p->data == targetVal) {
                return count;
            }
            count++;
        }
        return -1;
    }
	
    // deletes the list
    ~LinkedList() {
        // remove objects from the list as long as list is not empty
        while(Length() > 0) {
            RemoveFront();
        }
    }

    // inserts a node at the front of the list
    void InsertFront(int newValue) {
        Node* newNode = new Node;
        newNode->data = newValue;
        if (front == NULL) {
            // list must be empty so make front & back point to new node
            front = back = newNode;
            newNode->link = NULL;
        } else {
            // list is not empty so insert between front and first node
            newNode->link = front;
            front = newNode;
        }
    }

    // removes a node from the front of the list
    int RemoveFront() {
        int returnVal;
        Node *temp;
        if (front != NULL) {
            // list is not empty so remove & return first node
            returnVal = front->data;
            temp = front;
            front = front->link;
        } else {
            // list is empty just return 0
            returnVal = 0;
        }
        return returnVal;
    }

    // returns the length of the list
    int Length() {
        Node* p;
        int count = 0;
        // loop through each node in the list until we find a null value
        for (p = front; p != NULL; p = p->link) {
            count++;
        }
        return count;
    }

    // outputs a string containing all the data values in the list
    void Output() {
        Node* p;
        // loop through each node in the list until we find a null value
        for (p = front; p != NULL; p = p->link) {
            cout << p->data << ", ";
        }
    }
};

// use inheritance to create a Set class from the LinkedList class
class Set : public LinkedList {
public:
    // insert a new value only if it is unique (not already in the set)
    void Insert(int newValue) {
		int duplicate = Search(newValue);
		if (duplicate == -1)
			InsertFront(newValue);
    }

    // make this the union of two sets
    void Union(Set& a, Set& B)/> {
		Node*p;
		for(p = a.front; p != NULL; p = p->link)
		{
			Insert(p->data);
		}
		for(p = b.front; p != NULL; p = p->link)
		{
			Set::Insert(p->data);
		}
	}

    // make this the intersection of two sets
    void Intersection(Set& a, Set& B)/> {
		Node*p;
		Node*q;
		for(p = a.front; p != NULL; p = p->link)
		{
			for(q = b.front; p != NULL; p = p->link)
			{
				if (p == q)
				{
					Insert(p->data);
				}
			}
		}
	}
};


int main() {
    Set setA, setB, setUnion, setIntersection;

    setA.Insert(5);
    setA.Insert(2);
    setA.Insert(3);
    setA.Insert(5);
    setA.Insert(2);

    cout << "Contents of setA: ";
    setA.Output();
    cout << "\n\n";

    setB.Insert(1);
    setB.Insert(2);
    setB.Insert(4);

    cout << "Contents of setB: ";
    setB.Output();
    cout << "\n\n";

    setUnion.Union(setA, setB);
    cout << "Contents of setA union setB: ";
    setUnion.Output();
    cout << "\n\n";

    setIntersection.Intersection(setA, setB);
    cout << "Contents of setA intersection setB: ";
    setIntersection.Output();
    cout << "\n\n";
}




Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>