Permalänk

Behöver hjälp med C

Hej

Jag har lite funderingar hur man skriver koden för att använda länkade listor i C. Jag har ett program som skall lagra ett bildelsregister och har en struct som inkluderar alla posterna som behövs.

Kruxet är att jag vill spara ner detta till en fil så att jag kan öppna den och radera, och sortera efter märke i bokstavsordning, jag har fått lite hjälp om att en länkad lista skulle vara perfekt för att spara ner innehållet till en fil men kommer inte på hur man skall använda den.

Detta gäller både skapandet och hur man sprar ner den till en fil, är tydligen helt borta nu, har hittils sparat ner poster genom att skriva in via scanf_s och till filen via fprintf funktionerna.

Detta fungerar fint så länge jag bara vill läsa och skriva nya poster till filen men när det kommer till att radera eller sortera den för märkena så blir det stopp.

/ZeroMoney

Visa signatur

===========================================================================
I prefer dangerous freedom before peaceful slavery... Anonymous!!

Permalänk

Litet exempel på länkad lista. Borde fungera, men har ej testat.

typedef struct node node; struct node { int data; node *next; }; node* insert_last(node *n, int data) { node *temp = n: while (temp != NULL) temp = temp->next; temp = malloc(sizeof(node)); temp->data = data; temp-> next = NULL; return temp; } void print_list(node *n) { node *temp = n; while (temp != NULL) { printf("%i ", temp->data); temp = temp->next; } } int main() { node *head = NULL; insert_last(head, 10); insert_last(head, 5); insert_last(head, 9); print_list(head); // Borde skriva ut 10 5 9 }

scanf_s och fprintf funktionerna behöver du fortfarande använda. Med att lägga till ny post, hur har du gjort nu? Har du bara lagt till en ny rad i slutet av filen? I så fall måste du skriva om hela (eller större delen av) filen när du ska ha den sorterad.

Edit: Korrigerade print_list så det inte blir oändlig loop.

Permalänk

Re: Behöver hjälp med C

Citat:

Ursprungligen inskrivet av ZeroMoney
Hej

Jag har lite funderingar hur man skriver koden för att använda länkade listor i C. Jag har ett program som skall lagra ett bildelsregister och har en struct som inkluderar alla posterna som behövs.

Kruxet är att jag vill spara ner detta till en fil så att jag kan öppna den och radera, och sortera efter märke i bokstavsordning, jag har fått lite hjälp om att en länkad lista skulle vara perfekt för att spara ner innehållet till en fil men kommer inte på hur man skall använda den.

Tja, det går väl bra med en länkad lista eller en vanlig array. Skriv bara ut varje post för sig med något skiljetecken mellan sig. T.ex. kan du ha varje post på en rad med radbrytning mellan posterna.

Citat:

Ursprungligen inskrivet av ZeroMoney

Detta gäller både skapandet och hur man sprar ner den till en fil, är tydligen helt borta nu, har hittils sparat ner poster genom att skriva in via scanf_s och till filen via fprintf funktionerna.

Låter bra. Du kan fortsätta att göra så vare sig du använder en länkad lista eller en array.

Citat:

Ursprungligen inskrivet av ZeroMoney

Detta fungerar fint så länge jag bara vill läsa och skriva nya poster till filen men när det kommer till att radera eller sortera den för märkena så blir det stopp.

/ZeroMoney

För sortering är det bättre med en array. Det finns i färdig funktion i C-biblioteket som heter qsort() som sorterar en array.

För borttagning av enskilda element är det bättre med en länkad lista dock. Detta beror på att man måste flytta elementen bakom det borttagna elementet om man använder en array.

Antingen så för då köra på en array och flytta element när du tar bort en post, eller så konvertera till en array från din länkade lista när du vill sortera.

Gör du det här för att lära dig C eller är det något som ska användas i verkligheten? Ifall det ska användas i verkligheten är det bättre att spara data i en vanlig SQL-databas.

Visa signatur

Dator: i5-13600K, Asus Prime Z690-P, Noctua NH-D14, Kingston Fury Beast RGB 32GB DDR5-6000, Gigabyte RTX 4090 gaming OC, Seasonic Platinum SS-1000XP, Lian-Li Lancool 215, Samsung 980Pro 2TB M.2 NVME, Acer Predator XB323QKNV 4k 144Hz

Permalänk

[milkyway]
Jag håller på med ett enkelt program som min farsa skall använda till sina veteransbildelar, men det är lika mycket att lära sig också för jag vill fortsätta och lära mig så att man kanske kan jobba med det i framtiden.

Sedan är detta en förstudie till att lära mig programmera PIC-kretsar i C, jag håller på med modellflyg och bilar så det vore roligt att kunna göra egna grejer till detta därav PIC intresset.

[Deterministic]
Jo jag har bara skrivit till filen med append när jag har lagt till, dock är detta gjort utan struct metoden, denna har jag börjat med nu för att förenkla lite när jag skall skicka pekare till funktionerna som ingår i programmet.

Svårt när man sitter och lär sig utan direkta ideér hur man skall göra och utan bra exempelkod för att kunna se hur andra har gjort.

Men jag skall kolla upp koden ni har gett mig och prova runt lite själv och se resultatet. Allt ni kan ge mig i information är mycket bra

Visa signatur

===========================================================================
I prefer dangerous freedom before peaceful slavery... Anonymous!!

Permalänk

Smög sig in en oändlig loop i min kod ovan. Rättade till det

Som milkyway säger så kan du använda en vektor om du vill. När vektorn är liten och om inmatning och radering ska ske för hand så är prestadaförlusterna försumbara. (Med liten innebär storleksordningen på en miljon och mer).

En lista lämpar sig när ett utrymme ska växa dynamiskt och man vill kunna lägga till och ta bort objekt snabbt.

Nackdelen som en vektor har är att vid inmatning så måste man i värsta fall utöka storleken på vektorn. Detta innebär att man måste allokera en ny vektor som har plats för fler objekt och sen kopiera över samtliga objekt.

Personligen tycker jag det är roliga att använda en lista. Tycker det blir mer intuitivt så.

Sortering är lite svårare att sätta sig in i. Finns en lista över olika algoritmer på wikipedia (länk). Bubble sort är ganska enkel att implementera.

Litet tips: Man kan göra så att exel kan öppna filen man sparat. Detta gör man genom att använda \n för ny rad och \t för nästa kolonn. Sen får man ju ha rätt filändelse också

"A\t1\nB\t2" hade gett

A 1
B 2

i exel.

Permalänk
Medlem

Re: Re: Behöver hjälp med C

Citat:

Ursprungligen inskrivet av Milky Way
För sortering är det bättre med en array. Det finns i färdig funktion i C-biblioteket som heter qsort() som sorterar en array.

Går ju lika snabbt att sortera listor.

ZeroMoney:
http://cslibrary.stanford.edu/103/
http://en.wikipedia.org/wiki/Merge_sort