webForumDet fria alternativet

Länkade listor i c++

C/C++ur C/C++

7 svar · 926 visningar · startad av B22

Medlem sedan mars 2004256 inlägg
Frågan#1

Hej!
Jag vill ha ett fält som har en dynamisk storlek. Varje gång en ny storlek anges så ska den gamla sparas och ett nytt fält skapas som rymmer den gamla och den nya storleken.
Den jag har gjort hittills ser ni i koden nedan, det är vad jag har tänkt ungefär. Hoppas att någon kan hjälpa mig med den.

#include <iostream>
#include <ctime>
using namespace std;

void fylla_lista(int *&list, int n, int tal);
void expandera_lista( int *&list , int n) ; 
void printa_lista ( int *list , int n);

int main()
{
 do
	{
	srand(time(0));
	int* vektor= 0;
	int antal, n=0;
	
	cout << "Ange vektor storleken: ";
	cin >> antal;

	vektor= new int[antal];

	fylla_lista(vektor, n, antal);

	printa_lista ( vektor , antal);

	return 0;
}

//Fyller fältet "list" en och en!, talet som skall läggas in är "tal", nuvarande antal heltal i fältet är n st.
void fylla_lista(int *&list, int n, int tal)
{
	for (int i = tal; i < tal+n; i++){
		list[i]=rand()%35; //fyller i listan själv med slumpade tal
	}
	char answer;
	
		cout<<"hur många nya tal:"; //om Ja, ta emot det nya talet
		cin>>n;
		expandera(list,n+antal); //expandera den gamla vektorn med det nya antalet plus det gamla
		fylla_lista(vektor, n,antal); //fyll verktorn igen, skicka med det gamla och det nya antalet 
									//för att skapa plats för det nya utan att skriva över den gamla
		cout<<"Vill du fortsätta öka listan?"<<endl;
		cin>>answer;
	}
	while ((answer == 'J') || (answer == 'j'));	
}

//För varje anrop skapar denna funktion, ett nytt fält med en position mer än det gamla, 
//kopierar innehållet till det nya och tar bort det gamla fältet. 
//Väl tillbaka från funktionen, lägger vi in det nya talet, som inte fanns plats för innan!

void expandera_lista( int *&list , int total_antal)										 
{	
	
	list_temp= new int[total_antal];
	for(int i=0;i<=antal; i++ ){
		list[i]=list_temp[i];

		delete list; //deletar innehållet där list pekar på inte själva pekaren
		list->list_temp;
		kopiera från list till list_temp
		//här måste den gamla list deletas föra tt den har kopierats till det nya list_temp 
		//låt pekaren för list peka på list_temp också för att inte tappa kopplingen
	
	}
}

//Skriver ut innehållet i list.
void printa_lista ( int *list , int n)
{	
	cout<<"Vektorn innehåller talen: "<<endl;
	for (int i = 0; i < n; i++)
		cout<<list[i]<<" "<<endl;
}
Medlem sedan mars 2007117 inlägg
#2

Det bästa du kan göra är att skapa en std::vector<int> eller någon av dem klasserna, finns nämligen ganska många sådana. Dock kanske du vill lära dig kunna göra en egen sådan, men i den koden du har skrivit finns många fel. Men om du har tur så hinner jag skriva ihop ett lätt exempel senare ikväll.

Medlem sedan mars 2004256 inlägg
#3

Tack, hoppas du gör det ja. :)

Medlem sedan mars 2007117 inlägg
#4

Ett lätt exempel:

#include <iostream>
#include <algorithm> //för for_each

/* 
Funktionen nedan är generisk. Med detta menas med att den kan anropas  med vilken datatyp som helst typ. Any blir t ex int om man anropar den med Set(ob,ob+10,10);
om ob pekar på typen int.
*/
template <class Any> 
void Set(Any *start, Any *end, Any value){ 
    while(start != end){ 
        *start = value;
        start++;
    }
    return;
}

void Draw(const int a){ //ritar ut en int
    std::cout << a << std::endl;
}

int main(){
    int * ob = new int[10];
    Set(ob,ob+10,0);
//ob,ob+10 är intervallet..och det andra är värdet som allt däremellan ska få
    std::cin.get(); //väntar på enter
    Set(ob,ob+10,10);
    std::cout << "Nu ska allt ha värdet 10." << std::endl;
    std::for_each(ob,ob+10,Draw); //alla dataobjekt mellan ob, ob+10 kommer att skickas till funktionen Draw.
    std::cin.get();
    Set(ob,ob+10,100);
    std::cout << "Nu ska allt ha värdet 100." << std::endl;
    std::for_each(ob,ob+10,Draw);
    std::cin.get();
    std::cout << "Nu ökar jag storleken med 10 int och sätter allt till 1000" << std::endl;
    ob = new int[10];
    Set(ob,ob+20,1000);
    std::for_each(ob,ob+20,Draw);
    std::cin.get();
    delete [] ob; //raderar allt. 
    return 0;
}

Förstår du?

Medlem sedan mars 2004256 inlägg
#5

Jag är rädd att jag inte förstår din kod, Freddex... :(

Medlem sedan mars 2007117 inlägg
#6

Det räknade jag inte med, men man lär sig fort och jag tror att du kommer förstå inom snar framtid om du håller på att lära dig c++. Har nu lagt till några förklaringar, dock nog inte tillräckligt.

Om någon kan c++ och är bättre på att förklara koden ovan än mig så får ni gärna förklara det :)

Medlem sedan mars 2004256 inlägg
#7

Tack för att du försöker.

Vilka fel har jag i min kod?
Jag har aldrig använt algorithm biblioteket, därför blir jag förvirrad...

Medlem sedan mars 2007117 inlägg
#8

För många för att berätta. Mycket bättre att du provar kompilera koden så får du se alla fel och att du läser i din c++ bok lite mer.

Jag använde bara for_each i algorithm bara för att jag ville kunna skriva ut alla int:ar smidigt då for_each tar ett intervall och ett funktions namn som den sedan ska anropa med varje data objekt i det intervallet.

129 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)