【问题标题】:Linked List error (Language: C)链表错误(语言:C)
【发布时间】:2014-02-18 05:18:43
【问题描述】:

程序应该生成一个图并将其邻居存储在邻接列表中。我在解析列表时得到SEGFAULT。这很奇怪,因为当我尝试一个一个访问列表时,它工作正常。

我的代码:

int main(void) 
{   

    typedef struct linkedList{
        int vertice;
        struct linkedList *next;
    }LL;

    typedef struct vertex{
        int color;
        int noOfNeighbours;
        LL *adj;
    }vertex;

    int E, V;

    scanf ("%d %d", &V, &E);
    //printf ("%d %d", E, V);

    int i, j; //loop variables

    vertex arrOfVertices [V];

    for (i=0; i<V; i++)
    {
        arrOfVertices[i].color=-1; 
        arrOfVertices[i].noOfNeighbours=-1;
        arrOfVertices[V].adj = NULL;
    }
    printf ("Output is : \n");
    int firstV, secondV;
    for (i=0; i<E;i++)
    {
        scanf ("%d %d", &firstV, &secondV);
        LL* temp = malloc (sizeof(LL));
        temp -> vertice = secondV-1;
        if (arrOfVertices[firstV-1].adj == NULL)
        {
            arrOfVertices[firstV-1].adj=temp;
            arrOfVertices[firstV-1].adj->next=NULL;
        }
        else
        {
            temp->next=arrOfVertices[firstV-1].adj;
            arrOfVertices[firstV-1].adj=temp;
        }
    }

    //Printing the list function. This part strangely segfaults and I don't know why
    for (j=0; j<V;j++)
    {
        LL* parser = arrOfVertices[j].adj;
     // printf ("%d : Color: %d\n", i+1, arrOfVertices[i].color);

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

    return 0;
}

【问题讨论】:

  • int firstV, secondV;使用时似乎没有初始化并且没有赋值?
  • @Jerry_Y scanf(),假设它有效,应该算作something
  • 其实没关系,因为测试用例提供了 E 的值,然后它正好有 E 行。
  • 顶点 arrOfVertices [V]; arrOfVertices[V].adj = NULL;似乎您也访问了索引之外。
  • 它直接超出了数组索引的声明边界(对于大小为 V 的数组,为 0..V-1),因此会调用未定义的行为。恕我直言,这是一个错字。应该是arrOfVertices[i].adj = NULL;

标签: c list linked-list segmentation-fault singly-linked-list


【解决方案1】:

在您的代码中,您似乎想要定义一个大小为 V 的数组,其中 V 的实际值由用户输入。但是,在 C 中,编译器需要提前知道数组的大小。 C 可能允许您以任意顺序放置类型和变量声明,但这并不意味着这将是执行顺序。

如果必须使用数组,则需要提前设置数组的大小,并检查是否足够大以容纳输入的值。或者,您需要创建一个指向顶点数组的指针。然后,在用户输入 V 后,您需要使用 malloc 和 sizeof(vertex) 构建用户要求的尽可能多的结构,就像程序后面部分中所做的那样。

附言正如我提到的那样,您还将在 arrOfVertices[V].adj = NULL; 行中产生越界引用。 C 中的数组是从 0 开始的,因此如果 V 为 5,并且您(通过上述方法)生成了 5 个顶点,则必须将最后一个顶点称为 arrOfVertices[4]。

【讨论】:

  • 错误在arrOfVertices[V].adj = NULL;,它需要是arrOfVertices[i].adj = NULL;谢谢,无论如何:)
【解决方案2】:

错误出现在arrOfVertices[V].adj = NULL;,更改为arrOfVertices[i].adj = NULL; 时有效。错字。呸!谢谢@Whoami 和@WhozCraig 指出这一点。 :)

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 2017-11-14
    • 2014-05-07
    • 2014-02-11
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多