c-为具有结构作为值的节点分配内存



我想了几种方法来做到这一点,但我想知道哪一种是正确的。

任务要求我们遍历一个二维阵列(迷宫),并从头到尾打印出最终解决方案路径的每个坐标。

坐标将存储在一个链表中,该链表具有堆栈操作(推送、弹出等)。因此,一次只查看一个节点(头将指向一个空节点,然后将值"推"到初始节点前面,然后根据需要弹出。

我的问题是节点的内存分配是否正确。

我提出的解决方案可以概括为:

struct coordinates{
    int x;
    int y;
};
struct linkedStruct
{
 int* elem;
 struct linkedStruct*  next;
};
typedef struct linkedStruct linked;
typedef linked* linkedPtr; 

所以总的来说,我想我会做这个

linkedPtr ptr = malloc(sizeof(linked));
ptr->elem = coordinates;

这是正确的吗?我第一次做链表。

更改linkedStruct以在其中包含coordinates对象:

struct linkedStruct
{
   coordinates elem;
   struct linkedStruct*  next;
};

然后,在malloc之后,可以设置新linkedStruct的成员。

linkedPtr ptr = malloc(sizeof(linked));
ptr->elem.x = 1;
ptr->elem.y = 2;
ptr->next = NULL;

我不会详细介绍链表算法,因为这似乎是你的家庭作业,可能应该阅读书籍和/或课程材料。

由于元素值是struct coordinates,因此在链表节点中存储一个指向它的指针。或者,为了避免在释放内容时过于担心,可以在节点中使用结构坐标而不是指针。

struct linkedStruct
{
    struct coordinates elem;
    struct linkedStruct*  next;
};
typedef struct linkedStruct linked;
typedef linked* linkedPtr;

添加节点时,需要像在代码中那样将next指针设置为新分配的节点。然后设置指向结构的指针。

linkedPtr ptr = malloc(sizeof(linked));
ptr->elem.x = 3;
ptr->elem.y = 4;
// assuming you are appending to the end of linked list and last_node->next is NULL
ptr->next = NULL
last_node->next = ptr;

如果新创建的节点ptrnext指针位于末尾(后面没有下一个节点),则还需要将其设置为NULL。完成后,需要使用free清理节点。另一个建议是有两个结构,一个是链表,它存储指向列表开始和结束的指针(为了更容易附加),另一个是结构,它表示节点(带有元素和下一个指针),正如您所做的那样。使用这个建议,上面的代码可以在一个函数中:

typedef struct {
    linkedPtr *head;
    linkedPtr *last;
} linked_list; // Linked list with pointers to first and last node.
int *append(linked_list *list, int x, int y)
{
    linkedPtr ptr = malloc(sizeof(linked)); // This might fail to allocate
    if (ptr == NULL) {
        return -1; // This will be the error code for failure.
    }
    ptr->elem.x = x;
    ptr->elem.y = y;
    ptr->next = NULL;
    if (list->first == NULL) { // If list is empty.
        list->first = ptr;
        list->last = ptr;
    } else {
        list->last->next = ptr; // Point the last node to new node
        list->last = ptr; // Set the last to new last node
    }
    return 0; // Code success
}

要使用append,您需要创建linked_list

linked_list *list = malloc(sizeof(linked_list)); // This might also fail.
list->head = NULL;
list->last = NULL;
if (append(list, 3, 4) == -1) {
  printf("Unable to allocate memory for appending to listn");
}

做完后别忘了free

相关内容

  • 没有找到相关文章

最新更新