Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将二维数组转换为链表_C_Arrays_List_Linked List_2d - Fatal编程技术网

C 将二维数组转换为链表

C 将二维数组转换为链表,c,arrays,list,linked-list,2d,C,Arrays,List,Linked List,2d,所以我仍然试图用C语言来理解链表,它们是。。现在让我难以置信,因为我还没有完全理解指针,更不用说指向指针的指针,以及链表所需的动态内存分配 我试图创建一个具有独立高度和宽度值的二维数组。最多是30x30。我有一个二维数组,我们称之为arr[x][y]。arr[x][y]是由-2到1的整数值填充的,如何将这个二维数组转换为链表?然后,我将如何在突发奇想时访问此链接列表中的值?我很困惑,任何帮助都将不胜感激。我们谈话时,我正在浏览教程 此外,这应该是一种堆栈链表,我可以在其中调用函数,如push(将

所以我仍然试图用C语言来理解链表,它们是。。现在让我难以置信,因为我还没有完全理解指针,更不用说指向指针的指针,以及链表所需的动态内存分配

我试图创建一个具有独立高度和宽度值的二维数组。最多是30x30。我有一个二维数组,我们称之为arr[x][y]。arr[x][y]是由-2到1的整数值填充的,如何将这个二维数组转换为链表?然后,我将如何在突发奇想时访问此链接列表中的值?我很困惑,任何帮助都将不胜感激。我们谈话时,我正在浏览教程

此外,这应该是一种堆栈链表,我可以在其中调用函数,如push(将新值推送到链表顶部)、pop(从链表顶部弹出一个值)、top(返回最近推送到堆栈上的值)、isEmpty(检查堆栈是否为空)

我不需要任何完整的代码,但代码在这里会很有用。我只需要了解链表,以及如何实现这些功能

此外,以下是与此相关的任务:


这是一个迷宫解算器,我已经完成了将ascii图片分析为二维数组的整数值的代码。如上所述,这正是我需要帮助的地方。

基本上,您需要创建一个链接列表,其每个节点都是另一个列表的头,该列表包含一个成员(从概念上说是向下增长的),以及列表中通常的下一个指针

要访问像arr[3][4]这样的2D数组这样的元素,您需要遍历第一个列表,同时保持Yan的计数,然后向下移动计数x,或者您也可以这样做

这是一种常见的数据结构分配,其名称为“多堆栈或多队列”,如果通过列表实现,则可提供所需的内容

struct Node
{
    int data;
    struct Node *next;
    struct Node *head; // This head can be null initially as well as for the last node in a direction
};

基本上,您需要创建一个链接列表,其每个节点都是作为成员包含的另一个列表(从概念上说是向下增长的)的头部,以及列表中常见的下一个指针

要访问像arr[3][4]这样的2D数组这样的元素,您需要遍历第一个列表,同时保持Yan的计数,然后向下移动计数x,或者您也可以这样做

这是一种常见的数据结构分配,其名称为“多堆栈或多队列”,如果通过列表实现,则可提供所需的内容

struct Node
{
    int data;
    struct Node *next;
    struct Node *head; // This head can be null initially as well as for the last node in a direction
};

提示:根据您的分配,堆栈不应完全表示数组,而是表示您动态构建的路径,以找到从迷宫起始位置到迷宫目标位置的路径。

提示:根据您的分配,堆栈不应完全表示数组,但要表示动态构建的路径,以找到从迷宫起始位置到迷宫目标位置的路径。

首先,您需要定义适当的结构。第一次创建一个在指向下一个节点的指针为空时终止的列表会更容易。之后,您将发现列表使用sentinel、双向列表和现在看起来太复杂的东西。
例如,这是一个结构:

typedef struct __node
{
    int info;
    struct __node* next;
}node;

typedef node* list;
这一次,让我们假设列表和节点是同一事物,您会发现分离列表概念比分离节点概念更精确,例如,您可以将其长度存储在列表中(避免每次都计算所有节点),但现在让我们这样做。
您可以初始化列表:

list l=NULL;
因此该列表包含零个节点,要测试它是否为空,只需查看指针是否为空。
添加一个新元素:

if(NULL==l)
{
    l=(node*)malloc(sizeof(node));
    l->next=NULL;
    l->info=0;
}
现在列表包含零个节点,请创建一个函数以添加新节点:

void pushBack(list* listPointer, int info)
{
    if(NULL==*listPointer)
    {
        *listPointer=(node*)malloc(sizeof(node));
        (*listPointer)->info=info;
    }
    else
    {
        node* ptr=l;
        while(ptr->next!=NULL)
            ptr=ptr->next;
        ptr->next=(node*)malloc(sizeof(node));
        ptr->info=info;
    }
}
您还可以通过在前面添加元素来提高效率。或者通过返回添加的元素来优化代码,这样您就不必每次都找到最后一个元素。我将此留给您。现在让我们为数组的每个元素调用pushBack函数:

for(int i=0; i<N; i++)
{
    pushBack(l,arr[i]);
}

for(int i=0;i首先,您需要定义适当的结构。第一次,创建一个在指向下一个节点的指针为空时终止的列表会更容易。之后,您将发现包含哨兵列表、双向列表以及现在看起来太复杂的内容的列表。
例如,这是一个结构:

typedef struct __node
{
    int info;
    struct __node* next;
}node;

typedef node* list;
这一次,让我们假设列表和节点是同一事物,您会发现分离列表概念比分离节点概念更精确,例如,您可以将其长度存储在列表中(避免每次都计算所有节点),但现在让我们这样做。
您可以初始化列表:

list l=NULL;
因此该列表包含零个节点,要测试它是否为空,只需查看指针是否为空。
添加一个新元素:

if(NULL==l)
{
    l=(node*)malloc(sizeof(node));
    l->next=NULL;
    l->info=0;
}
现在列表包含零个节点,请创建一个函数以添加新节点:

void pushBack(list* listPointer, int info)
{
    if(NULL==*listPointer)
    {
        *listPointer=(node*)malloc(sizeof(node));
        (*listPointer)->info=info;
    }
    else
    {
        node* ptr=l;
        while(ptr->next!=NULL)
            ptr=ptr->next;
        ptr->next=(node*)malloc(sizeof(node));
        ptr->info=info;
    }
}
您还可以通过在前面添加元素来提高效率。或者通过返回添加的元素来优化代码,这样您就不必每次都找到最后一个元素。我将此留给您。现在让我们为数组的每个元素调用pushBack函数:

for(int i=0; i<N; i++)
{
    pushBack(l,arr[i]);
}

for(int i=0;i你不应该把整个数组转换成一个链表,你只应该把最好的路径转换成一个链表。你应该用蛮力,在遇到死胡同时尝试方向和回溯

您的路径(链接列表)需要如下所示:

struct PathNode
{
    int coordX, coordY;
    PathNode * next, * prev;
}
如果我以后还记得的话,我会画一张这类结构的图片或其他东西,并将其添加到帖子中。几个小时后评论这篇帖子以吸引我的注意力

列表将始终包含一个起点,即列表中的第一个节点。当您一个接一个地移动到其他位置时,您会将它们推到列表的末尾。这样,