Video: The mind behind Linux | Linus Torvalds 2024
Als u in C-programmering een tweede structuur wilt toevoegen aan code die u al hebt gemaakt, maakt u een gekoppelde lijst - een reeks structuren die verwijzingen naar elkaar bevatten. Naast de basisgegevens in een structuur bevat de structuur een aanwijzer, die het adres van de volgende structuur in de lijst bevat.
Met een slimme combinatie van namen van aanwijzers en een NULL om het einde van de lijst te omzeilen, kunt u in A Primitive Linked-List Example iets krijgen dat lijkt op de broncode.
EEN PRIMITIEF LINKED-LIJST VOORBEELD
# include # include # include int main () {struct stock {char symbol [5]; int hoeveelheid; vlotterprijs; struct stock * next;}; struct stock * eerst; struct voorraad * actueel; struct stock * nieuw; / * Maak een structuur in het geheugen * / first = (struct stock *) malloc (sizeof (struct stock)); if (first == NULL) {puts ("Some type of malloc () error"); exit (1);} / * Structuurgegevens * / current = eerst toewijzen; strcpy (huidig-> symbool, "GOOG"); stroom-> hoeveelheid = 100; stroom-> prijs = 801. 19; stroom-> next = NULL; nieuw = (struct stock *) malloc (sizeof (struct stock)); if (nieuw == NULL) {puts ("Another malloc () error"); exit (1);} current-> next = nieuw; current = new; strcpy (huidig-> symbool, "MSFT"); stroom-> hoeveelheid = 100; stroom-> prijs = 28. 77; stroom-> next = NULL; / * Toon database * / puts ("Beleggingsportefeuille"); printf ("SymboltSharestPricetValuen"); current = eerste; printf ("% - 6st% 5dt%. 2ft%. 2fn", huidige-> symbool, huidige-> hoeveelheid, huidige-> prijs, huidige-> hoeveelheid * huidige-> prijs); current = stroom-> volgende; printf ("% - 6st% 5dt%. 2ft%. 2fn", huidige-> symbool, huidige-> hoeveelheid, huidige-> prijs, huidige-> hoeveelheid * huidige-> prijs); return (0);}
Deze broncode is vrij lang, maar het creëert simpelweg een tweede structuur, gekoppeld aan de eerste. Laat de lengte van de broncode je niet intimideren.
Regels 13 tot en met 15 verklaren de standaard drie structuurwijzers die nodig zijn voor een gelinkte danslijst. Traditioneel worden ze als eerste, huidig en nieuw genoemd. Ze spelen in het vierde lid in de structuur, vervolgens gevonden op Lijn 11, die een structuuraanwijzer is.
Gebruik typedef niet om een nieuwe structuurvariabele te definiëren bij het maken van een gekoppelde lijst. Een voorbeeld van een primitieve gekoppelde lijst gebruikt geen typedef, dus het is geen probleem met de code, maar veel C-programmeurs gebruiken typedef met structuren. Doe voorzichtig!
De variabele naam nieuw, gebruikt in regel 15, is een gereserveerd woord in C ++, dus als u tweetalig wilt zijn, wijzigt u de naam van de variabele in new_struct of in iets anders dan het woord new.
Wanneer de eerste structuur is gevuld, wijst lijn 30 een NULL-aanwijzer toe aan het volgende element.Die NULL-waarde sluit het einde van de gekoppelde lijst af.
Regel 32 maakt een structuur door het adres in de nieuwe pointervariabele te plaatsen. Het adres wordt opgeslagen in de eerste structuur in regel 38. Zo blijft de locatie van de tweede structuur behouden.
Regel 40 tot en met 43 vullen informatie voor de tweede aanwijzer, en kennen een NULL-waarde toe aan het volgende element op regel 43.
Het koppelen vindt plaats terwijl de inhoud van de structuur wordt weergegeven. Lijn 48 legt het adres van de eerste structuur vast. Vervolgens lijn 54 vangt het adres van de volgende structuur vanuit de eerste structuur.
Oefening 1 : Typ de broncode uit Voorbeeld van een primitieve gekoppelde lijst in uw editor. Hoewel het lang is, typt u het in, omdat u het later opnieuw moet bewerken (als u dat nu nog niet bent gewend). Bouw en ren.
In tegenstelling tot arrays, zijn structuren in een gekoppelde lijst niet genummerd. In plaats daarvan is elke structuur gekoppeld aan de volgende structuur in de lijst. Zolang u het adres van de eerste structuur kent, kunt u de lijst tot het einde doorlopen, die wordt gemarkeerd door een NULL.
Een voorbeeld van een primitieve gekoppelde lijst toont een slordige broncode met veel herhaalde code. Wanneer u meerdere verklaringen zoals deze in uw code ziet, zou u onmiddellijk "functies" moeten denken. "
EEN BETER LINKED-LIJST VOORBEELD
# include # include # include #define ITEMS 5 struct stock {char symbol [5]; int hoeveelheid; vlotterprijs; struct stock * next;}; struct stock * eerst; struct voorraad * actueel; struct stock * nieuw; struct stock * make_structure (void); void fill_structure (struct stock * a, int c); ongeldige show_structure (struct voorraad * a); int main () {int x; for (x = 0; xnext = new; current = new;} fill_structure (current, x + 1);} current-> next = NULL; / * Display-database * / puts ("Investment Portfolio"); printf ("SymboltSharestPricetValuen "); current = first; while (current) {show_structure (current); current = current-> next;} return (0);} struct stock * make_structure (void) {struct stock * a; a = (struct stock *) malloc (sizeof (struct stock)); if (a == NULL) {puts ("Some type of malloc () error"); exit (1);} return (a);} void fill_structure (struct stock * a, int c) {printf ("Artikel #% d /% d: n", c, ITEMS); printf ("Voorraadsymbool:"); scanf ("% s", a-> symbool); printf ("Nummer van shares: "); scanf ("% d ", & a-> aantal); printf (" Share price: "); scanf ("% f ", & a-> price);} void show_structure (struct stock * a) {printf ("% - 6st% 5dt%. 2ft%. 2fn", a-> symbool, a-> aantal, a-> prijs, a-> hoeveelheid * a-> prijs);}
Meeste gekoppelde lijsten worden gemaakt zoals weergegeven in Voorbeeld van een betere gekoppelde lijst De sleutel is om drie structuurvariabelen te gebruiken, weergegeven in regels 13 tot en met 15:
-
bevat altijd eerst het adres van de eerste structuur in de lijst. Altijd.
-
current bevat het adres van de structuur waaraan wordt gewerkt, die is gevuld met gegevens of die wordt weergegeven.
-
nieuw is het adres van een nieuwe structuur gemaakt met behulp van de functie malloc ().
Lijn 7 verklaart de voorraadstructuur als globaal. Op die manier is het toegankelijk via de verschillende functies.
De for-lus tussen regels 25 en 39 creëert nieuwe structuren die ze aan elkaar koppelen.De oorspronkelijke structuur is speciaal, dus het adres wordt opgeslagen op regel 30. Anders wordt een nieuwe structuur toegewezen, dankzij de functie make_structure ().
In regel 35 is de vorige structuur bijgewerkt; de waarde van stroom wordt niet gewijzigd tot regel 36. Voordat dat gebeurt, wordt de aanwijzer in de huidige structuur bijgewerkt met het adres van de volgende structuur, nieuw.
Op regel 40 wordt het einde van de gekoppelde lijst gemarkeerd door de nieuwe aanwijzer in de laatste structuur opnieuw in te stellen op een NULL.
De while-lus op regel 46 geeft alle structuren in de gekoppelde lijst weer. De conditie van de lus is de waarde van de huidige aanwijzer. Wanneer de NULL wordt aangetroffen, stopt de lus.
De rest van de code in A Better Linked-List Example bestaat uit functies die voor zichzelf spreken.
Oefening 2 : Kopieer de code van een beter voorbeeld met een gelinkte lijst naar de editor. Bouw en ren.
Let op de instructies scanf () in de functie fill_structure (). Vergeet niet dat de -> de "peeker" -notatie is voor een aanwijzer. Om het adres te krijgen, moet u de variabele een prefix geven met een & in de scanf () -functie.