2016-12-08 4 views
-2

ОБНОВЛЕНОКогда я добавляю элемент в связанный список, содержащийся в массиве связанных списков, почему все остальные элементы списка удаляются?

Проблема этого кода является то, что после того, как матрица была преобразована в массив связанных списков, похоже, никакого значения не содержится в массиве связанных списков. Я думаю, что проблема заключается в функции, которая добавляет узел в определенный список массива связанных списков.

// node 
struct node { 
    int n; 
    struct node* next_ptr; 
}; 

// prototypes 
void fill_mat(int mat[][SIZE]); 
void mat_to_list(int mat[][SIZE]); 
void insertSortedLinkedList(struct node *l, int value); 
void print_mat(int mat[][SIZE]); 
void print_vet(); 

// array of pointers 
struct node* vet[SIZE]; 
int visitato[SIZE]; 

// main function 
int main(int argc, const char *argv[]) { 
    int mat[SIZE][SIZE]; 
    int i, j; 

    // reset the matrix 
    for(i = 0; i < SIZE; ++i) { 
     for(j = 0; j < SIZE; ++j) { 
      mat[i][j] = 0; 
     } 
    } 

    // generate graph with weights 
    srand(time(NULL)); 
    fill_mat(mat); 

    // transform matrix in an array of linked lists 
    mat_to_list(mat); 
    print_mat(mat); 
    printf("\n"); 
    print_vet(); 

    return 0; 
} 


// generate graph 
void fill_mat(int mat[][SIZE]) { 
    int x, y, z; 

    for(x = 0; x < (SIZE * SIZE)/2;) { 
     y = rand() % SIZE; 
     z = rand() % SIZE; 

     if(mat[y][z] == 0) { 
      mat[y][z] = rand() % 10 + 1; 
      ++x; 
     } 
    } 
} 

// insert in list 
void addNode(struct node **st, int d) { 
    struct node *temp = *st; 

    if(temp == NULL) { 
     temp = malloc(sizeof(struct node)); 
    } else { 
     while((temp)->next_ptr != NULL) { 
      temp = temp->next_ptr; 
     } 

     temp->next_ptr = malloc(sizeof(struct node)); 
     temp = temp->next_ptr; 
    } 

    temp->n = d; // this must done using strncpy 
    temp->next_ptr = NULL; 
} 

// transform matrix to array of linked lists 
void mat_to_list(int mat[][SIZE]) { 
    int i, j; 

    // reset array 
    for(i = 0; i < SIZE; ++i) { 
     vet[i] = NULL; 
    } 

    for(i = 0; i < SIZE; ++i) { 

     for(j = 0; j < SIZE; ++j) { 
      if(mat[i][j] != 0) { 
        addNode(&(vet[i]), mat[i][j]); 
      } 
     } 
    } 
} 

// print matrix 
void print_mat(int mat[][SIZE]) { 
    int i, j 
    ; 
    for(i = 0; i < SIZE; ++i) { 
     for(j = 0; j < SIZE; ++j) { 
      printf("%-2d ", mat[i][j]); 
     } 
     printf("\n"); 
    } 
} 

// print array of linked lists 
void print_vet() { 
    int i; 
    struct node* temp; 

    for(i = 0; i < SIZE; ++i) { 
     printf("ARRAY CELL: %d\n", i); 
     temp = vet[i]; 

     while(temp != NULL) { 
      printf("NODE VALUE --> "); 
      printf("%d\n", temp->n); 
      temp = temp->next_ptr; 
     } 

     printf("\n"); 
    } 
} 
+1

'* й = (* й) -> next_ptr' Вы модифицируя исходный указатель. Вам нужно использовать переменную tmp для обхода списка. – kaylum

+0

Вы можете написать код для переменной temp? – ZwartyZ

+0

Предоставьте [mcve] и см. [Ask]. – Olaf

ответ

2

я не понял, где есть множество списков и как долго вы собираетесь показывать свои издания функции. Но в любом случае правильная функция может выглядеть следующим образом

void addNode(struct node **st, int d) 
{ 
    while (*st) st = &(*st)->next_ptr; 

    *st = malloc(sizeof(struct node)); 

    (*st)->n = d; 
    (*st)->next_ptr = NULL; 
} 

Или следующим образом

int addNode(struct node **st, int d) 
{ 
    while (*st) st = &(*st)->next_ptr; 

    *st = malloc(sizeof(struct node)); 

    int success = *st != NULL; 

    if (success) 
    { 
     (*st)->n = d; 
     (*st)->next_ptr = NULL; 
    } 

    return success; 
} 
+0

Он работает! Благодарю вас и извините за отсутствие ясности в моем вопросе, я попытался сделать его более чистым. – ZwartyZ

+0

@ ZwartyZ Нет проблем. Добро пожаловать.:) –

1

Похоже, вы изменяете исходный указатель. Итератор может использоваться для поиска последнего узла.

В вашей вызывающей функции вы можете создать итератор.

first = (node *) malloc(sizeof(node)); 
iterator = first; 

В вашей функции, вы можете передать итератор

void addNode(node *iterator, int d) { 
    /*Create a new node*/ 
    newNode = (node *) malloc(sizeof(node)); 
    newNode->n = d; 
    newNode->next_ptr = NULL; 

    /*Iterate through your list to find end*/ 
    if (iterator != 0) { 
     while (iterator->next != 0) { 
      iterator = iterator->next; 
     } 
    } 
    /*Add item to last link in list*/ 
    iterator->next = newNode; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^