---
title: "Länkade listor i c++"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/160556-länkade-listor-i-c"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "B22"
published: "2007-05-21T11:11:41.000Z"
updated: "2007-05-23T12:20:24.000Z"
replies: 7
views: 947
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/160556-länkade-listor-i-c"
---

# Länkade listor i c++

## #1 — B22, 2007-05-21T11:11Z

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;
}
```

Permalänk: https://www.webforum.nu/p/160556

## #2 — FreddeX, 2007-05-21T18:22Z

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.

Permalänk: https://www.webforum.nu/p/1979688

## #3 — B22, 2007-05-21T20:30Z

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

Permalänk: https://www.webforum.nu/p/1979727

## #4 — FreddeX, 2007-05-22T13:34Z

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?

Permalänk: https://www.webforum.nu/p/1979907

## #5 — B22, 2007-05-22T18:43Z

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

Permalänk: https://www.webforum.nu/p/1980011

## #6 — FreddeX, 2007-05-22T19:07Z

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 :)

Permalänk: https://www.webforum.nu/p/1980018

## #7 — B22, 2007-05-22T19:37Z

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...

Permalänk: https://www.webforum.nu/p/1980030

## #8 — FreddeX, 2007-05-23T12:20Z

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.

Permalänk: https://www.webforum.nu/p/1980263

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/160556-länkade-listor-i-c
