2015-06-06 1 views
0

Я пытаюсь реализовать программу с помощью i, могу создавать ~ произвольное количество одиночно связанных списков динамически и выполнять операции над определенным (определяется параметром). Я создаю динамический массив головных указателей, чтобы я мог ссылаться на определенный головной узел, определенный параметром (индекс массива + 1). Параметр - это просто (1,2,3 .. количество списков). До сих пор мне удалось реализовать только функцию инициализации и push, но программа после компиляции не работает должным образом. В чем проблема?Связанные списки, операции с параметром

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

#define CHUNK 10 

typedef struct 
{ 
    char *str; 
    struct node *next; 
} node; 


node *initialise(node **array, int *amount_of_lists); 
void push(node **array, int *amount_of_lists); 
char *getString(void); 

int main() 
{ 
    node **heads = NULL; //initially null, pointer to the dynamic array of head pointers 
    int amount_of_lists = 0; 
    int *no_of_heads = &amount_of_lists; 

    initialise(heads, no_of_heads); 
    initialise(heads, no_of_heads); 
    push(heads, no_of_heads); 
    push(heads, no_of_heads); 

    return 0; 
} 

node *initialise(node **array, int *amount_of_lists) /*reallocate memory for another head pointer ans return the pointer to node*/ 
{ 
    ++(*amount_of_lists); 
    printf("\n%d", *amount_of_lists); 
    array = (node**)realloc(array, sizeof(node*)*(*amount_of_lists)); 
    return array[(*amount_of_lists) - 1] = malloc(sizeof(node)); 
} 

int readParameter(int *amount_of_lists) 
{ 
    int parameter = 0, control = 0; 
    bool repeat = 0; 
    do 
    { 
     if(repeat) 
     { 
      printf("\nWrong parameter, try again."); 
     } 
     printf("\n Enter list parameter: "); 
     control = scanf("%d", &parameter); 
     fflush(stdin); 
     repeat = 1; 
    } 
    while(control != 1 || parameter < 1 || parameter > (*amount_of_lists)); 

    return parameter; 
} 

void push(node **array, int *amount_of_lists) 
{ 
    int parameter = readParameter(amount_of_lists) - 1; 
    node *temp = array[parameter]; 
    array[parameter] = malloc(sizeof(node)); 
    array[parameter] -> next = temp; 
    array[parameter] -> str = getString(); 
} 

char *getString(void) 
{ 
    char *line = NULL, *tmp = NULL; 
    size_t size = 0, index = 0; 
    int ch = EOF; 

    while (ch) 
    { 
     ch = getc(stdin); 

     /* Check if we need to stop. */ 
     if (ch == EOF || ch == '\n') 
      ch = 0; 

     /* Check if we need to expand. */ 
     if (size <= index) 
     { 
      size += CHUNK; 
      tmp = realloc(line, size); 
      if (!tmp) 
      { 

       free(line); 
       line = NULL; 
       break; 
      } 
      line = tmp; 
     } 

     /* Actually store the thing. */ 
     line[index++] = ch; 
    } 

    return line; 
} 
+3

Как это работает не так, как ожидалось? –

+0

После того, как он принимает правильный параметр, программа сокрушает. В push-функции должна быть проблема, потому что getString - это функция, которую я нашел где-то, и она работала правильно в моих других программах. – paul867

+0

0) 'typedef struct' ->' typedef struct node' – BLUEPIXY

ответ

0

Как BLUEPIXY несколько crypticly намекают в своем комментарии: 1) для того, чтобы изменить main() «s heads в initialise(), вы должны пройти headsпо ссылке к initialise(), я. е. изменить

initialise(heads, no_of_heads); 
    initialise(heads, no_of_heads); 

к

initialise(&heads, no_of_heads); 
    initialise(&heads, no_of_heads); 

следовательно

node *initialise(node **array, int *amount_of_lists) 

изменения в

node *initialise(node ***array, int *amount_of_lists) 

и внутри array изменений *array, т.е.. е.

*array = realloc(*array, sizeof(node *) * *amount_of_lists); 
    return (*array)[*amount_of_lists - 1] = malloc(sizeof(node));