Sorted Singly linked list v C

Rad1m

Sorted Singly linked list v C
« kdy: 01. 04. 2014, 20:26:37 »
Ahoj,

muze mi nekdo poradit, proc mi nefunguje funkce sorts a pritom funguje insback? Jde mi o to, ze v sorts kompletne preskocim while loop, zatimco v insback to funguje spravne. Uz do toho koukam snad hodinu a nevidim chybu.

Diky.

Kód: [Vybrat]
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// maximum length for a word
#define LENGTH 45

// default dictionary
#define DICTIONARY "words.txt"

typedef struct node
{
    char word[LENGTH + 1];
    struct node* next;
}
Word;

Word *head = NULL;

/****************************************/
/*              PROTOTYPES              */
/****************************************/
Word* sorts(char *node);
Word* insback(char *node);
void create(char *node);
void display();
void freememory();

/****************************************/
/*              FUNCTIONS               */
/****************************************/

void create(char *node)
{
    Word *new_node = NULL;
    new_node=(Word*)malloc(sizeof(Word));

    if(head==NULL)
    {
        printf ("Creating list\n");
        new_node->next=NULL;
        head=new_node;
        printf ("List created\n");
    }
}

//Insert sorted after the word
Word* sorts(char *node)
{
    Word *temp1;
    temp1 = (Word*)malloc(sizeof(Word));
    temp1 = head;

    while(temp1->next!=NULL)
    {
        printf ("looping\n");

        Word *curr;
        curr = (Word*)malloc(sizeof(Word));
        strncpy(curr->word, node, LENGTH);

        if (strcmp(curr->word, temp1->word) >0 )
        {
        printf ("adding word\n");
        curr->next = NULL;
        temp1->next = curr;
        }
       
        temp1 = temp1->next;
    }
    return head;
}

//Insert from back
Word* insback(char *node)
{
    Word *temp1;
    temp1 = (Word*)malloc(sizeof(Word));
    temp1 = head;
   
    while(temp1->next!=NULL)
    {
        temp1 = temp1->next;
    }
   
    Word *curr;
    curr = (Word*)malloc(sizeof(Word));
    strncpy(curr->word, node, LENGTH);
    curr->next = NULL;
    temp1->next = curr;
    return head;
}

// output the list
void display()
{
    Word *Wordlist;
    Wordlist = head;
    while (Wordlist != NULL)
    {
        printf("%s->", Wordlist->word);
        Wordlist = Wordlist->next;
    }
    printf("End of the list!\n");
}

// free allocated memory
void freememory()
{
    Word *freenode = NULL;
    Word *curr = NULL;
    freenode = head;
    while(freenode != NULL)
    {
        curr = freenode;
        freenode = freenode->next;
        free(freenode->word);
        free(curr);
    }
}

/****************************************/
/*               M A I N                */
/****************************************/

int main()
{
    system("clear");
    char data[LENGTH];
    int count = 0;
       
    FILE* file = fopen(DICTIONARY, "r");
    printf ("Opening file\n");
   
    // check successfull opening of the file
    if(file == NULL) {
        perror("Error opening file");
        return -1;
    }
   
    create(NULL);
   
    //read data (words) from file
    while(fscanf (file, "%s", data) == 1)
    {
        count++;
        insback(data);
    }
   
    //insfront("Start");
    printf ("%d words read\n", count);
    display();
    freememory();
    fclose(file);
    return 0;
}


Sten

Re:Sorted Singly linked list v C
« Odpověď #1 kdy: 01. 04. 2014, 20:38:20 »
Kód: [Vybrat]
temp1 = (Word*)malloc(sizeof(Word));
temp1 = head;

Určitě nebude dělat to, co chcete.

gamer

Re:Sorted Singly linked list v C
« Odpověď #2 kdy: 01. 04. 2014, 20:45:09 »
zacházíš blbě s pamětí a máš smůlu, že to nepadá
Kód: [Vybrat]
==2249== Memcheck, a memory error detector
==2249== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==2249== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==2249== Command: ./a.out
==2249==
==2249== Conditional jump or move depends on uninitialised value(s)
==2249==    at 0x4E6E88D: vfprintf (vfprintf.c:1617)
==2249==    by 0x4E75A59: printf (printf.c:35)
==2249==    by 0x4009C9: display (main.c:102)
==2249==    by 0x400AF5: main (main.c:153)
==2249==
==2249== Invalid read of size 8
==2249==    at 0x400A1A: freememory (main.c:117)
==2249==    by 0x400AFF: main (main.c:154)
==2249==  Address 0x518b3f0 is 48 bytes inside a block of size 56 free'd
==2249==    at 0x4C240FD: free (vg_replace_malloc.c:366)
==2249==    by 0x400A2D: freememory (main.c:118)
==2249==    by 0x400AFF: main (main.c:154)
==2249==
==2249== Invalid free() / delete / delete[]
==2249==    at 0x4C240FD: free (vg_replace_malloc.c:366)
==2249==    by 0x400A39: freememory (main.c:119)
==2249==    by 0x400AFF: main (main.c:154)
==2249==  Address 0x518b3c0 is 0 bytes inside a block of size 56 free'd
==2249==    at 0x4C240FD: free (vg_replace_malloc.c:366)
==2249==    by 0x400A2D: freememory (main.c:118)
==2249==    by 0x400AFF: main (main.c:154)
==2249==
==2249==
==2249== HEAP SUMMARY:
==2249==     in use at exit: 392 bytes in 7 blocks
==2249==   total heap usage: 16 allocs, 16 frees, 1,408 bytes allocated
==2249==
==2249== LEAK SUMMARY:
==2249==    definitely lost: 392 bytes in 7 blocks
==2249==    indirectly lost: 0 bytes in 0 blocks
==2249==      possibly lost: 0 bytes in 0 blocks
==2249==    still reachable: 0 bytes in 0 blocks
==2249==         suppressed: 0 bytes in 0 blocks
==2249== Rerun with --leak-check=full to see details of leaked memory

RAII

Re:Sorted Singly linked list v C
« Odpověď #3 kdy: 01. 04. 2014, 20:57:46 »
Kód: [Vybrat]
void create(char *node)
{
    Word *new_node = NULL;
    new_node=(Word*)malloc(sizeof(Word));

    if(head==NULL)
    {
        printf ("Creating list\n");
        new_node->next=NULL;
        head=new_node;
        printf ("List created\n");
    }
}
Pokud to správně chápu, tak budeš mít nepěkný memory leak když tudle funkci zavoláš a head nebude NULL.

RAII

Re:Sorted Singly linked list v C
« Odpověď #4 kdy: 01. 04. 2014, 21:06:12 »
Jinak, proč to nezkusit udělat v C++? Díky RAII se ti nestane výše zmíněná chyba pokud použiješ chytré pointery (nebo spíš, vyváží tvou nepozornost). http://www.cplusplus.com/reference/memory/shared_ptr/.


Rad1m

Re:Sorted Singly linked list v C
« Odpověď #5 kdy: 01. 04. 2014, 21:46:16 »
Kód: [Vybrat]
void create(char *node)
{
    Word *new_node = NULL;
    new_node=(Word*)malloc(sizeof(Word));

    if(head==NULL)
    {
        printf ("Creating list\n");
        new_node->next=NULL;
        head=new_node;
        printf ("List created\n");
    }
}
Pokud to správně chápu, tak budeš mít nepěkný memory leak když tudle funkci zavoláš a head nebude NULL.

jde o kurz CS50, ktery delam na edx.org, ted je tam ukol v C. Na memory leak se urcite taky podivam a zkusim to vyladit, az tomu budu vice rozumet. To, co mi vrta hlavou je, ze obe funkce sorts a insback zacinaji uplne stejne, volam je stejne sorts(data) nebo insback(data) a pro insback funguje while loop a pro sorts to nefunguje.

gamer

Re:Sorted Singly linked list v C
« Odpověď #6 kdy: 01. 04. 2014, 22:04:46 »
jde o kurz CS50, ktery delam na edx.org, ted je tam ukol v C. Na memory leak se urcite taky podivam a zkusim to vyladit, az tomu budu vice rozumet. To, co mi vrta hlavou je, ze obe funkce sorts a insback zacinaji uplne stejne, volam je stejne sorts(data) nebo insback(data) a pro insback funguje while loop a pro sorts to nefunguje.

V tom kódu jsou mraky chyb. Jen ty hlavní logické:
1) ve while smyčce chybí break, když se tam přidá prvek (potom už není potřeba nic dál procházet)
2) do curr->next se nemá přiřazovat NULL ale temp1->next

死神

  • ***
  • 159
    • Zobrazit profil
Re:Sorted Singly linked list v C
« Odpověď #7 kdy: 02. 04. 2014, 09:56:22 »
Ta angličtina je taky bomba, třeba "successfull" nebo "length for a word", to jsou fakt perly! ;D

gamer

Re:Sorted Singly linked list v C
« Odpověď #8 kdy: 02. 04. 2014, 10:18:57 »
Sám jsi perla, length se běžně používá:
http://www.cplusplus.com/reference/string/string/length/
a word má v tom kontextu taky smysl.

Sten

Re:Sorted Singly linked list v C
« Odpověď #9 kdy: 02. 04. 2014, 12:20:27 »
Sám jsi perla, length se běžně používá:
http://www.cplusplus.com/reference/string/string/length/
a word má v tom kontextu taky smysl.

Jak je na té odkazované stránce vidět, tak se length váže s of ;)

gamer

Re:Sorted Singly linked list v C
« Odpověď #10 kdy: 02. 04. 2014, 12:37:49 »
Jak je na té odkazované stránce vidět, tak se length váže s of ;)
To vím a přijde mi to úplně nepodstatné. V každém projektu, na kterém se podílejí lidi z celého světa se v komentářích najdou mnohem horší prohřešky proti správné angličtině a nikdo to neřeší.

Rad1m

Re:Sorted Singly linked list v C
« Odpověď #11 kdy: 02. 04. 2014, 18:01:57 »
Ta angličtina je taky bomba, třeba "successfull" nebo "length for a word", to jsou fakt perly! ;D

chlape najdi si pritelkyni a mozna i nejake kamarady, pak se ti mozna zvedne sebevedomi a nebudes si muset neco dokazovat na internetu

Rad1m

Re:Sorted Singly linked list v C
« Odpověď #12 kdy: 02. 04. 2014, 18:16:12 »
Sám jsi perla, length se běžně používá:
http://www.cplusplus.com/reference/string/string/length/
a word má v tom kontextu taky smysl.

Jak je na té odkazované stránce vidět, tak se length váže s of ;)

"for a word" je gramaticky naprosto v poradku, jde o to, co chcete rict. Tim ovsem nepopiram, ze tam nemam preklepy. Nicmene diskuze je mimo tema, skoro to vypada, ze se nekteri nikdy neucili programovat a hned to umeli od narozeni a nepotrebovali od nikoho poradit.

Diky tem, co maji komentare k veci. Prekopal jsem kod a uz to funguje o neco lepe.