Problem z wyświetleniem elementów listy

0

Witam oto fragment mojego kodu

void dodaj(int nr)
{
	if (lista==NULL)
	{
		kolejka *p = new kolejka;
		p->id = index; // zmienilem lista na p
		p->nr_strony = nr;
		p->next = NULL;
		index++;
	} 

i dalej

void wyswietl1()
{
	kolejka *p=lista;
	p->nr_strony = wypisz;
	cout << wypisz;
} 

i problem polega na tym, że przy wykonaniu programu w linijce

p->nr_strony = wypisz; 

wyskakuje wyjątek. Co jest nie tak? Jak poprawnie wyświetlić elementy tej listy?

0

Tu masz gotowca..
http://4programmers.net/Forum/Newbie/118925-zadanie_z_list_jednokierunkowych?view=unread
Nie rozumiem jak ta twoja funkcja miałaby dodać jakiś nowy element... i do tego jakiś index, który zapewne trzyma ilość węzłów:) Może mi się tylko wydaję, bo praktycznie nie pokazałeś kodu, ale chyba piszesz straszne herezje..
http://pl.wikipedia.org/wiki/Lista - To powinno Ci wystarczyć
http://pl.wikibooks.org/wiki/C/Typy_z%C5%82o%C5%BCone - A to musi Ci wystarczyć do samodzielnego zaimplementowania listy.

0
 // projekt_so.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include <cstdlib>
#include <cstdio>


using namespace std;


struct kolejka
{
	int id;
	int nr_strony;
	kolejka *next;
} *lista;

kolejka *head, *tmp, *tmp2, *nowy, *p;

//-------------deklaracje funkcji-----------------

void dodaj(int nr);
int czy_jest_na_liscie(int nr);
int czy_lista_pelna();
void wyswietl1();
void wyswietl2();
void wyswietl3();
void wyswietl_wszystko();


//-------------deklaracje zmiennych---------------

bool sprawdzanie;
bool pelna;
int index = 1;
int ilosc_elem = 0;
int bledow_strony = 0;
int x = 1;
int wypisz;

//-------------fukcje-----------------

void dodaj(int nr)
{
	if (lista==NULL)
	{
		kolejka *p = new kolejka;
		//lista = nowy;
		p->id = index; // zmienilem lista na p
		p->nr_strony = nr;
		p->next = NULL;
		index++;
		ilosc_elem++;
		bledow_strony++;
	}
	else
	{
		kolejka *p = lista;
		czy_jest_na_liscie(nr);
		if (sprawdzanie!=1) // jesli nie ma na liscie
		{
			kolejka *p = lista;
			int czy_lista_pelna();
			if (pelna==1) // lista jest pelna
			{
				if (x>3) x=1;
				kolejka *p=lista;
				while (p->nr_strony!=x) lista=lista->next;
				lista->nr_strony = nr;
				x++;
				bledow_strony++;
			}
			else // lista nie jest pelna
			{
				/*
				tmp=head;
				while(tmp->next!=NULL) tmp=tmp->next;
				kolejka *nowy = new kolejka;
				nowy->id = index;
				index++;
				ilosc_elem++;
				nowy->next = NULL;
				tmp->next = nowy;
				*/
				kolejka *p = lista;
				while (lista->next!=NULL) lista=lista->next;
				kolejka *nowy = new kolejka;
				nowy->id = index;
				index++;
				ilosc_elem++;
				nowy->next = NULL;
				lista->next = nowy;
				bledow_strony++;
			}
		}
		else // jest na liscie
		{
			
		}
	}
}

int czy_jest_na_liscie(int nr)
{
	while (p->id <= 3)
	{
		if (p->nr_strony = nr)
		{
			sprawdzanie = true;
			return sprawdzanie;
		}
		else
		{	
			p = p->next;
			czy_jest_na_liscie(nr);
		}
	}
}

int czy_lista_pelna()
{
	if (ilosc_elem >= 3)
	{
		pelna = true;
		return pelna;
	}
	else
	{
		pelna = false;
		return pelna;
	}
}

void wyswietl1()
{
    //tmp=head;
    //cout<<tmp->id<<endl;
	//tmp=tmp->next;
	kolejka *p=lista;
	p->nr_strony = wypisz;
	cout << wypisz;
}

void wyswietl2()
{
	kolejka *p=lista;
	lista=lista->next;
	lista=lista->next;
	p->nr_strony = wypisz;
	cout << wypisz;
}

void wyswietl3()
{
    kolejka *p=lista;
	lista=lista->next;
	lista=lista->next;
	lista=lista->next;
	p->nr_strony = wypisz;
	cout << wypisz; 
}

void wyswietl_wszystko()
{
	system("cls");

	cout << "Ramka pierwsza: ";
	wyswietl1();
	cout << "\nRamka druga: ";
	wyswietl2();
	cout << "\nRamka trzecia: ";
	wyswietl3();	
	
	cout << "\n\nBledow strony: ";
}

//-------------MAIN-----------------

int main()
{
	dodaj(1);
	wyswietl_wszystko();
	getchar();
	dodaj(5);
	wyswietl_wszystko();
	getchar();
	dodaj(1);
	wyswietl_wszystko();
	getchar();
	dodaj(3);
	wyswietl_wszystko();
	getchar();
	dodaj(5);
	wyswietl_wszystko();
	getchar();
	dodaj(2);
	wyswietl_wszystko();
	getchar();
	dodaj(4);
	wyswietl_wszystko();
	getchar();
	dodaj(3);
	wyswietl_wszystko();
	getchar();
	dodaj(4);
	wyswietl_wszystko();
	getchar();
	dodaj(2);
	wyswietl_wszystko();
	getchar();
	dodaj(1);
	wyswietl_wszystko();
	getchar();
	dodaj(5);
	wyswietl_wszystko();

	cin.get();
	cin.ignore();
	return 0;
}

Wklejam cały kod, program ma reprezentować wymianę stron między dyskiem a pamięcią. Komunikat błędu: Unhandled exception at 0x000b188f in projekt_so.exe: 0xC0000005: Access violation writing location 0x00000004.

0

Co masz na myśli pisząc "ilość węzłów"? Index to nr elementu na liście. A "gotowiec", który podałeś ma się nijak do mojego programu, poza używaniem listy.

0

Pisałem w poprzednim poście, program ma reprezentować wymianę stron między dyskiem a pamięcią za pomocą algorytmu FIFO. Ma dodawać na listę numery stron, w razie potrzeby osuwać najstarszą i zliczać błędy strony. Index jest zapisywany w strukturze

 p->id = index

a wskaźników jest zadeklarowanych więcej niż potrzeba, nie używam wszystkich.

0

Przepisałem program stosując listę cykliczną i znów mam podobny problem. Program wywala się z błędem Unhandled exception at 0x013e214c in projekt1.exe: 0xC0000005: Access violation reading location 0x00000000.</code> w linijce <code class="cpp"> cout << "Ramka pierwsza: " << head->nr_strony;
Kod:

 // projekt_so.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include <cstdlib>
#include <cstdio>


using namespace std;


struct kolejka
{
	int nr_strony;
	kolejka *next, *prev;
};

kolejka *head=NULL, *element1=NULL, *element2=NULL, *p, *s;

//-------------deklaracje funkcji-----------------

void utworz_liste();
void dodaj(int nr);
int czy_jest_na_liscie(int nr);
void wyswietl_wszystko();


//-------------deklaracje zmiennych---------------

int sprawdzanie;
int bledow_strony = 0;
int chwila = 0;

//-------------fukcje-----------------

void utworz_liste()
{
	kolejka *head;
	head=NULL;
	element1=NULL;
	for (int i=1; i<=3; i++)
	{
		if(head==NULL)
		{
			head = new kolejka;
			head->nr_strony = 0;
			head->next=head;
			head->prev=head;
		}

		else
		{
			if(element1==NULL)
			{
				element1 = new kolejka;
				element1->nr_strony = 0;
				head->next=element1;
				element1->prev=head;
				element1->next=head;
				head->prev=element1;
			}

			else
			{
				element2 = new kolejka;
				element2->nr_strony = 0;
				element1->next=element2;
				element2->prev=element1;
				element2->next=head;
				head->prev=element2;
			}

		}
	}
}


void dodaj(int nr)
{
	
	kolejka *head;
	czy_jest_na_liscie(nr);
	if (sprawdzanie!=1) // jesli nie ma na liscie
	{
		p->nr_strony = nr;
		bledow_strony++;
		p = p->next;
	}
	else
	{
		chwila++;
		// przechodzi do kolejnego elementu
	}
}

int czy_jest_na_liscie(int nr)
{
	while (s->next != head)
	{
		if (s->nr_strony = nr)
		{
			sprawdzanie = 1;
			return sprawdzanie;
		}
		else
		{	
			s = s->next;
			czy_jest_na_liscie(nr);
		}
	}
}

void wyswietl_wszystko()
{
	system("cls");

	cout << "Ramka pierwsza: " << head->nr_strony;
	//wyswietl1();
	cout << "\nRamka druga: " << element1->nr_strony;
	//wyswietl2();
	cout << "\nRamka trzecia: " << element2->nr_strony;
	//wyswietl3();	
	
	cout << "\n\nBledow strony: " << bledow_strony;
	cout << "\nChwila: " << chwila;
}

//-------------MAIN-----------------

int main()
{
	utworz_liste();
	wyswietl_wszystko();
	getchar();
	dodaj(1);
	wyswietl_wszystko();
	getchar();
	dodaj(5);
	wyswietl_wszystko();
	getchar();
	dodaj(1);
	wyswietl_wszystko();
	getchar();
	dodaj(3);
	wyswietl_wszystko();
	getchar();
	dodaj(5);
	wyswietl_wszystko();
	getchar();
	dodaj(2);
	wyswietl_wszystko();
	getchar();
	dodaj(4);
	wyswietl_wszystko();
	getchar();
	dodaj(3);
	wyswietl_wszystko();
	getchar();
	dodaj(4);
	wyswietl_wszystko();
	getchar();
	dodaj(2);
	wyswietl_wszystko();
	getchar();
	dodaj(1);
	wyswietl_wszystko();
	getchar();
	dodaj(5);
	wyswietl_wszystko();

	cin.get();
	cin.ignore();
	return 0;
}

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