当我将一个元素添加到链接列表数组中包含的链表时,为什么列表中的每个其他元素都被删除?

时间:2016-12-08 21:43:21

标签: c arrays list singly-linked-list

已更新

此代码的问题在于,在将矩阵转换为链接列表数组之后,看起来链接列表数组中不包含任何值。 我认为问题在于将节点添加到链表列表的特定列表中的函数。

// 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");
    }
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
}