在C中创建指向链接列表的2D指针数组

时间:2014-02-01 23:55:46

标签: c arrays list pointers linked-list

我想创建一个程序:

  1. 创建一个2D数组,该数组由指向链表的指针组成,链表包含一个名为result的整数和一个* next指针
  2. 首先将数组的所有元素设置为NULL
  3. 然后,对于数组的每个位置(i,j),通过scanf读取一个名为temp的整数。如果temp == - 1则进入下一个{i,j},如果temp!= - 1,则放入temp在结果中,创建一个NULL列表作为array[i][j]的下一个,并且给定temp的新值时,同样的工作会扩大array[i][j]的列表。
  4. 我写了这段代码:

        #include<stdio.h>
        #include<stdlib.h>
        #include<malloc.h>
    
        typedef struct linked_list *list;
    
        struct linked_list
        {
    int result;
    list next;
        };
    
        int main()
        {
    int i,j;
    scanf("%d %d",&i,&j);
    
    int l,k;
    list **array=malloc(i*sizeof(list));
    
    for(l=0;l<j;l++)
        array[l]=malloc(j*sizeof(list));
    
    for(l=0;l<i;l++)
    {   
        for(k=0;k<j;k++)
        {
            array[i][j]=NULL;
        }
    }
    
    int temp;
    list new;
    list current;
    for(l=0;l<i;l++)
        for(k=0;k<j;k++)
        {
            scanf("%d",&temp);
            while(temp!=-1)
            {
                if (array[l][k]==NULL)
                {
                    new->result=temp;
                    new->next=NULL;
                    array[l][k]->next=new;
                }
                else
                {
                    current->result=temp;
                    current->next=NULL;
                    new->next=current;
                }
                scanf("%d",&temp);
            }
        }
    
    int cnt=0;
    for(l=0;l<i;l++)
        for(k=0;k<j;k++)
        {
            if (array[l][k]==NULL)
                printf("array(%d)(%d) is empty!\n",l,k);
            else
            {
                do
                {
                    cnt++;
                    printf("element no.%d of array(%d)(%d) is:   %d\n",cnt,l,k,array[l][k]->result);
                    array[l][k]=array[l][k]->next;
                }while (array[l][k]!=NULL);
            }
        }
    
    return 0;
        }
    

    这是为了做我之前描述的。但是,使用正确的内存分配不是很灵活,即使i = 1,j = 1运行此代码,我也会得到“分段错误”作为输出。如果有人能帮助我理解我必须做什么才能正确分配所需的内存,我真的很高兴!

    提前致谢!

1 个答案:

答案 0 :(得分:4)

这里有一些问题可以解决。

首先,用于创建2D数组的malloc语句是错误的。

你的第一个应该是:

list **array=(list**)malloc(i*sizeof(list*));

你的第二个也应改为以下。请注意,for循环条件不正确 - 您需要在条件中使用行维(i),而不是j:

for(l=0;l<i;l++)
    array[l]=(list*)malloc(j*sizeof(list));

这应该给你一个空数组。您的下一个任务是将所有这些元素设置为NULL。这就是你遇到下一个问题的地方。

for(l=0;l<i;l++){   
    for(k=0;k<j;k++){
        array[i][j]=NULL;
    }
}
你看到了吗?您使用变量“i”和“j”来查找元素而不是“l”和“k”。这是一个简单的解决方法。

现在你应该有一个NULL指针数组。大。但现在你会发现你得到了一个不同的段错误。这个是由于这段代码:

if (array[l][k]==NULL){
    new->result=temp;
    new->next=NULL;
    array[l][k]->next=new;
}

请注意,如果数组位置中的指针为NULL,则执行此代码。然后,您继续取消引用此相同的指针。但该指针为NULL。因此,seg错误。除非我误解你在这里做了什么,否则你可以通过将最后一个语句改为

来解决这个问题
array[l][k] = new;

我认为这应该让你走上正轨。你的代码仍然有一些问题(检查输出的循环...特别是do-while循环),但希望没有更多的seg错误。