Lista jednokierunkowa

0

Cześć! Oto mój pierwszy programik dotyczący list. Postanowiłem, że napiszę go dla dodawania elementu po wybranym elemencie, usuwaniu elementu o podanej wartosci, zliczaniu bieżącej liczby elementów na liście oraz funkcji zapisu i odczytu do i z pliku. Póki co sprawdzałem pojedyncze funkcje i funkcje dodawania i odczytu nie chcą trybić. Mógłbym liczyć na jakąś pomoc? Z góry dzięki

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

class List
{
public:
	Node *head;
	unsigned int counter;

	List()
	{
		head = NULL;
		counter = 0;
	}

	~List()
	{
		Node *p;
		while(head)
		{
			p = head->next;
			delete head;
			head = p;
		}
	}
	
	unsigned size()
	{
		return counter;
	}

	void Addafter(Node *e, int v)
	{
		Node *p = new Node;
		
		p->next = e->next;
		p->key = v;
		e->next = p;
		counter++;
	}

	int Delete(Node* e, int v)
	{
		Node *p = new Node;
		int count = 0;
		while(p->next != NULL)
		{
			if(p->key = v)
			{
				delete p;
				count++;
				return count;
			}
		}
	}
	void Write()
	{
		string data;
		fstream file;
		file.open("D:\\plik.txt", ios::out);
		Node *p = head;
		while(p->next !=NULL)
		{
			p = p->next;
			float wartosc = p->key;
			file<<wartosc;
		}
		file.close();
	}

	void Read()
	{
		string data;
		fstream file;
		file.open("D:\\plik.txt", ios::in);
		Node *p = head;
		for(int i=0; i<counter; i++)
		{
			getline(file, data);
			float wynik = atoi(data.c_str());
			p->key = wynik;
			p = p->next;
		}
		file.close();
	}
};
0

daj caly program, zawartosc pliku d:\plik.txt i opis bledu

0

Przepraszam za pomyłkę, program dobrze odczytuje z pliku, to z zapisem jest problem.
W pliku mam wypisane kolejno liczby, po jednej na linię.
Pozostałe funkcje działają w porządku, po zdefiniowaniu ich w mainie program sie kompiluje.

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

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

class List
{
public:
	Node *head;
	unsigned int counter;

	List()
	{
		head = NULL;
		counter = 0;
	}

	~List()
	{
		Node *p;
		while(head)
		{
			p = head->next;
			delete head;
			head = p;
		}
	}
	
	unsigned size()
	{
		return counter;
	}

	void Addafter(Node *e, int v)
	{
		Node *p = new Node;
		
		p->next = e->next;  //BŁĄD
		p->key = v;
		e->next = p;
		counter++;
	}

	int Delete(Node* e, int v)
	{
		Node *p = new Node;
		int count = 0;
		while(p->next != NULL)
		{
			if(p->key = v)
			{
				delete p;
				count++;
				return count;
			}
		}
	}
	void Write()
	{
		string data;
		fstream file;
		file.open("D:\\plik2.txt", ios::out);
		Node *p = head;
		while(p->next !=NULL)		//BŁĄD
		{
			p = p->next;
			int wartosc = p->key;
			file<<wartosc;
		}
		file.close();
	}

	void Read()
	{
		string data;
		fstream file;
		file.open("D:\\plik.txt", ios::in);
		Node *p = head;
		for(int i=0; i<counter; i++)
		{
			getline(file, data);
			int wynik = atoi(data.c_str());
			p->key = wynik;
			p = p->next;
		}
		file.close();
	}
		

};

int main()
{
	List a;
	a.Read();
	a.Addafter(a.head, 3);
	a.Delete(a.head, 5);
	a.size();
	system("PAUSE");
	return 0;
} 

Tak wygląda błąd:

First-chance exception at 0x00e71ea2 in AiSD.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x00e71ea2 in AiSD.exe: 0xC0000005: Access violation reading location 0x00000000.
0
: Access violation reading location 0x00000000.

znaczy ze uzywasz wskaznika ktory pokazuje na NIC
odpal debugger i lecisz ;)

0

Ogólnie cała ta klasa wygląda, jakbyś posklejał kody z różnych źródeł bez zrozumienia. Dlatego nie działa. Bo żeby działało musi to być spójne, a nie jest. Tam gdzie zaznaczyłeś:

p->next = e->next;  

Masz wywołanie takie, że przekazujesz e jako head, który jest NULL-em.
Zacznij od prostszych rzeczy, bo przeskoczyłeś kilka lekcji najwyraźniej....

A w kodzie widzę więcej błędów...

0

Funkcja delete nie zadziała. Wskaznik poprzedniego od usuwanego elementu będzie wskazywał w usunietą czesc pamieci. Poza tym skoro masz wskaznik na Node'a to po co masz do funkcji delete przekazywać wartość? Dwa: jazda po liscie:

for( Node* it = head; it; it = it->next )
{
	//*it = whatever();
}

Napisałeś metodę 'addafter', uzyj ją w Read.
Oczywiscie jak naprawsz ją.
Wydaje mi się, że nie rozumiesz idei listy, jeżeli dodajesz element po danem elemencie e, to musisz zapamietac adres elementu kolejnego od niego (next), wstawic, a nowo zrobionego obiektu next musi być taki sam jak zapamietany wczesniej ;)

To tyle na tę chwilę.

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