topcat
topcat

Reputation: 189

How to implement a [copy array to linked list] function?

What this supposed to do is:

I tried this and it compiles, but crashes after printing the array.

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ELEMENTS  4

struct node {
    int data;
    struct node *next;
};
struct node *head;

void insert(int x) {
    struct node *temp = malloc(sizeof(struct node));
    temp->data = x;
    temp->next = NULL;

    if (head != NULL)
        temp->next = head;
    head = temp;
}

void copy(struct node *head, int array[ELEMENTS], int n) {                       
    //copying array elements and create linked list

    struct node *temp = malloc(sizeof(struct node));
    temp->data = array[0];
    temp->next = NULL;
    head = temp;

    int i;
    for (i = 1; i < n; i++) {
        struct node *temp2 = malloc(sizeof(struct node));
        temp->next = temp2;
        temp2->data = array[i];
        temp2->next = NULL;
        temp = temp2;
    }
}

void printlist() {
    struct node*temp = head;
    printf("List is : ");

    while (temp->next != NULL) {
      printf(" %d ", temp->data);
      temp = temp->next;
    }
    printf("\n");
}

int main() {
    int *array = (int*)calloc(ELEMENTS , sizeof(int));
    int i = 0;
    for (i = 0; i < ELEMENTS; i++) {
        printf("arrays = [%d] ", i);
        scanf("%d", &array[i]);
    }

    for (i = 0; i < ELEMENTS; i++)
        printf("array [%d] = %d \n", i, array[i]);

        copy(head, array[ELEMENTS], ELEMENTS);
        printlist();

        getchar();
        return(0);
}

How to fix it?

Upvotes: 3

Views: 7201

Answers (3)

KACHKA
KACHKA

Reputation: 1

I have simple dimple answer:

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


struct Node{
    int current;
    struct Node *next;
};

struct LinkedList{
    struct Node *head;
};


int main(){
    int i, data[5] = {10, 20, 30, 40, 50};
    struct Node *node = malloc(sizeof(struct Node));
    struct LinkedList *llist = malloc(sizeof(struct LinkedList));

    node->current = data[0];
    node->next = NULL;

    llist-> head = node;

    for(i = 1; i <= sizeof(data) / sizeof(data[0]) - 1; i++){
        struct Node *new_node = malloc(sizeof(struct Node));
        node->next = new_node;
        new_node->current = data[i];
        new_node->next = NULL;
        node = new_node;
    }
    
    node = llist->head;

    printf("llist: ");
    while(node != NULL){
        printf("%d->", node->current);
        node = node->next;
    }

    return 0;
}

Upvotes: 0

Ordoshsen
Ordoshsen

Reputation: 780

When you call the function copy, you are passing "array[ELEMENTS]" as an argument, but you want to pass only "array". What you're passing is value after your array, which the copy function is trying to interpret as an address of an array it's actaully expecting.

Note that accessing a value that is not yours like this results in undefined behaviour and can actually make the system kill your application. But what probably happened after is there will be a 0 in the memory, which gets passed to the copy function and it then tries to access values at memory 0x0 to 0xF, which almost always results in segmentation fault, which as you experienced first hand, causes the program to stop working.

Bottom line, delete [ELEMENTS] at the line where you call the copy function and I believe the program should start working. I implore you though to do further research on pointers and passing them as function parameters.

(And since I cannot comment yet I will just put this in here, as Sniper stated, you don't have to pass reference to global variable, but he is wrong about the structure being destroyed at the end of the function. That would have been true, if it was created at stack, but you are allocating space for it at heap, which means it will stay there until you either free() it or the program ends.)

Upvotes: 0

r-sniper
r-sniper

Reputation: 1493

You dont need to pass head to the copy function because it is global and when you do you create a local pointer named head which gets destroyed as soon as function is over.

So copy should look like this

void copy(int array[ELEMENTS],int n)                         //copying array elements and create linked list
{
    struct node*temp = malloc(sizeof(struct node));
    temp->data=array[0];
    temp->next=NULL;
    head =temp;
    int i;
    for(i=1;i<n;i++)
    {
        struct node*temp2= malloc(sizeof(struct node));
        temp->next= temp2;
        temp2->data = array[i];
        temp2->next = NULL;
        temp=temp2;
     }  
}

Also while printing change while to

while(temp!=NULL)
    {
      printf(" %d ",temp->data);
      temp=temp->next;

    }

Upvotes: 2

Related Questions