如何实现[复制数组到链表]功能?

时间:2017-03-23 16:28:51

标签: c arrays pointers linked-list

这应该做的是:

  • 创建一个包含4个元素的数组。

  • 打印这4个元素。

  • 将数组元素复制到copy fucntion中创建的链接列表。

  • 打印带有打印和遍历功能的链表。

我试过这个并编译,但打印完阵列后崩溃了。

#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);
}

如何解决?

2 个答案:

答案 0 :(得分:1)

你不需要将head传递给copy函数,因为它是全局的,当你这样做时,你创建一个名为head的本地指针,一旦函数结束就会被销毁。

所以copy看起来应该是这样的

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;
     }  
}

同时打印时将while更改为

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

    }

答案 1 :(得分:0)

当您调用函数副本时,您正在传递&#34; array [ELEMENTS]&#34;作为一个参数,但你想只传递&#34;数组&#34;。您传递的内容是数组之后的值,复制函数试图将其解释为它实际期望的数组的地址。

请注意,访问不属于您的值会导致未定义的行为,并且实际上会导致系统终止您的应用程序。但是之后可能发生的事情是内存中会有一个0,它会被传递给复制函数,然后它会尝试访问内存0x0到0xF的值,这几乎总会导致分段错误,正如您亲身经历的那样,导致程序停止工作。

底线,在您调用复制功能的行中删除[ELEMENTS],我相信该程序应该开始工作。我恳请你进一步研究指针并将它们作为函数参数传递。

(因为我还不能发表评论,我只会把它放在这里,正如狙击手所说,你不必传递对全局变量的引用,但他对结构被破坏的结果是错误的。如果它是在堆栈中创建的,那本来是真的,但是你在堆上为它分配空间,这意味着它将保持在那里,直到你释放()它或程序结束。)