C二维数组到链表

时间:2012-11-05 20:12:52

标签: c arrays list linked-list 2d

所以我仍然试图把我的脑袋包裹在C中的链接列表中。它们对我来说是令人难以置信的,因为我还没有完全理解指针,更不用指针指针了,还有动态内存分配链表要求。

我正在尝试创建一个具有独立高度和宽度值的二维数组。最多他们将是30x30。我有一个二维数组让我们称之为arr [x] [y]。 arr [x] [y]填充了从-2到1的整数值,如何将这个二维数组转换为链表?然后,我如何随心所欲地从这个链表中访问值?我很困惑,任何帮助都将不胜感激。在我们发言时,我正在浏览教程。

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

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

此外,这是与Assignment

相关的作业

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

为了访问诸如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
};

答案 2 :(得分:1)

首先,您需要定义正确的结构。第一次,当您指向下一个节点的指针为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]);
}

就是这样,学习实现链表的方法。

答案 3 :(得分:1)

您不应该将整个数组转换为链接列表,您只应该将最佳路径转换为链接列表。当你遇到死胡同时,你会通过蛮力,尝试指示和回溯来做到这一点。

你的路径,链表,需要看起来像这样:

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

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

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

这个特殊的链表是特殊的,它有两种方式:它有一个指向下一个元素和前一个元素的指针。仅列出两个列表的列表称为单链表,这两个列表称为双链表。单链表只是一种方式,只能在一个方向上遍历。

将您的链表视为一大堆字符串,每个字符串都有一个起始端和一个结束端。当您走过迷宫时,您会在您访问的每个节点处系上一根绳子,并将您带到下一个广场。如果你必须回溯,你带回来的字符串,所以它不再指向错误的方格。一旦找到迷宫结束的路,您就可以通过跟踪字符串来跟踪您的步骤。

  

你能解释一下 - &gt;究竟意味着什么?

->是一体化指针解除引用和成员访问运算符。说我们有:

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

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

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