繁体   English   中英

C二维数组到链接列表

[英]C Two Dimensional Array into Linked List

所以我仍在努力用C语言编写链接列表。它们对我来说真是令人难以置信,因为我还没有完全理解指针,更不用说指向指针的指针了,以及链接列表需要的动态内存分配。

我正在尝试创建一个具有独立的高度和宽度值的二维数组。 最多为30x30。 我有一个二维数组,我们称它为arr [x] [y]。 arr [x] [y]填充了从-2到1的整数值,我如何将这个二维数组传输到链接列表中? 然后,我怎么会一时兴起从此链接列表中访问值? 我很困惑,任何帮助将不胜感激。 我正在浏览我们讲的教程。

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

我不需要任何完整的代码,但是这里的代码会有所帮助。 我只需要了解链接列表,以及如何实现这些功能。

此外,这是与此相关的作业作业

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

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

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

要访问诸如arr [3] [4]之类的2D数组之类的元素,需要遍历第一个列表,同时保持y的计数,然后向下移动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
};

首先,您需要定义适当的结构。第一次创建列表时会更容易,该列表在指向下一个节点的指针为NULL时终止,然后您将发现带有前哨,双向列表以及现在的东西的列表。可能看起来太复杂了。
例如,这是一个结构:

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

typedef node* list;

这次我们假设列表和节点是同一件事,您将发现分隔列表的概念比节点的概念更为精确,例如,您可以将列表的长度存储在列表中(避免每次计算所有节点时都进行计数) ,但现在让我们那样做。
您初始化列表:

list l=NULL;

因此,列表包含零个节点,要测试其是否为空,只需查看指针是否为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]);
}

就是这样,了解您实现链表的方式。

您不应将整个数组转换为链表,而应仅将最佳路径转换为链表。 当您遇到死胡同时,您将用蛮力做到这一点,尝试方向和回溯。

您的路径(链接列表)需要看起来像这样:

struct PathNode
{
    int coordX, coordY;
    PathNode * next, * prev;
}

如果我以后记得,我会画一张图片或这种结构的东西,并将其添加到帖子中。 请在几个小时后对此信息发表评论,以吸引我的注意力。

该列表将始终包含一个起点,该起点将是列表中的第一个节点。 当您一个接一个地移到其他位置时,可以将它们推到列表的末尾。 这样,您可以简单地按顺序从列表中逐个弹出元素,从而遵循从当前位置到迷宫开始的路径。

此特定的链表的特殊之处在于它有两种方式:它具有指向下一个元素和上一个元素的指针。 只有两个列表之一的列表称为单链接列表,而这两个列表都称为双链接列表。 单链列表只是一种方式,只能在一个方向上遍历。

可以将链接列表视为一堆巨大的字符串,每个字符串都有一个起始端和一个结束端。 在迷宫中穿行时,您要在访问的每个节点上系一根绳子,并随身带到下一个广场。 如果必须回溯,可以将字符串带回去,这样它就不再指向错误的正方形。 一旦找到迷宫的尽头,就可以通过跟随字符串来跟踪步伐。

您能解释一下->到底是什么意思吗?

->是多合一指针取消引用和成员访问运算符。 说我们有:

PathNode * p = malloc(sizeof(*p));
PathNode q;

我们可以通过以下任意方式访问p和q的成员:

(*p).coordX;
q.coordX;
p->coordX;
(&q)->coordX;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM