所以我仍然试图把我的脑袋包裹在C中的链接列表中。它们对我来说是令人难以置信的,因为我还没有完全理解指针,更不用指针指针了,还有动态内存分配链表要求。
我正在尝试创建一个具有独立高度和宽度值的二维数组。最多他们将是30x30。我有一个二维数组让我们称之为arr [x] [y]。 arr [x] [y]填充了从-2到1的整数值,如何将这个二维数组转换为链表?然后,我如何随心所欲地从这个链表中访问值?我很困惑,任何帮助都将不胜感激。在我们发言时,我正在浏览教程。
此外,这应该是一种堆栈链接列表,我可以调用push等函数(将新值推送到链表顶部),pop(从链表顶部弹出一个值) ,top(返回最近推入堆栈的值),isEmpty(检查堆栈是否为空)。
我不需要任何完整的代码,但代码在这里会有所帮助。我只需要了解链接列表,以及如何实现这些功能。
此外,这是与Assignment
相关的作业这是一个迷宫求解器,我已经完成了将ascii图片分析为二维数组的整数值的代码。如上所述,这是我需要帮助的。
答案 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;