使用struct作为值为节点分配内存

时间:2015-02-11 19:35:12

标签: c memory-management struct linked-list malloc

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

分配要求我们遍历2d数组(迷宫)并从头到尾打印出最终解决方案路径的每个坐标。

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

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

我想出的解决方案将被概括为:

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;

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

2 个答案:

答案 0 :(得分:2)

更改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;

答案 1 :(得分:0)

我不会详细介绍链表算法,因为这似乎是你的功课,应该阅读这本书和/或课程资料。

由于您的元素值为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;

如果它在最后(后面没有下一个节点),您还需要将新创建的节点next的{​​{1}}指针设置为ptr。 完成后,您需要使用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 }

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 list\n"); } 所有这些。