我有一个链接列表,其中包含另一个链接列表,我希望将数据集成到其中,但我不能。
这是我的代码:
结构声明:
typedef struct BigStructure {
UINT x;
UINT y;
struct SmallStructure* smallStructure;
struct BigStructure* next;
} BigStructure;
typedef struct SmallStructure {
UINT x;
UINT y;
struct SmallStructure* next;
} SmallStructure;
结构操作函数:
BigStructure* addLinkedListElement(BigStructure* linkedList)
{
if(linkedList-> next == NULL)
{
return NULL;
}
BigStructure* newLinkedList = malloc(sizeof(linkedList));
newLinkedList->next = linkedList;
return newLinkedList;
}
BigStructure* removeLinkedListElement(BigStructure* linkedList)
{
//If the list is empty, we return NULL
if(linkedList == NULL)
return NULL;
//If the list contains one element
if(linkedList->next == NULL)
{
free(linkedList);
return NULL;
}
//if the list contains at least 2 elements
BigStructure* tmp = linkedList;
BigStructure* ptmp = linkedList;
/* Tant qu'on n'est pas au dernier élément */
while(tmp->next != NULL)
{
//ptmp stores the address of tmp
ptmp = tmp;
//We move tmp (but pmpt keeps the old value of tmp)
tmp = tmp->next;
}
ptmp->next = NULL;
free(tmp);
return linkedList;
}
BigStructure* getLinkedListElement(BigStructure* linkedList, int id)
{
int i = 0;
for(i=0; i<id && linkedList != NULL; i++)
{
linkedList = linkedList->next;
}
if(linkedList == NULL)
{
return NULL;
}
else
{
return linkedList;
}
}
我尝试了上面的代码来访问SmallStructure变量,但是我得到一个很大的数字(看起来像地址):
BigStructure* bigStructure = NULL;
void addBigStructure(UINT x, UINT y) {
if(bigStructureNb == 1)
{
bigStructure->x = x;
bigStructure->y = y;
}
else
{
BigStructure* newBigStructure;
newBigStructure = (BigStructure*)addLinkedListElement((BigStructure*)&bigStructure);
newBigStructure->x = x;
newBigStructure->y = y;
}
}
void addSmallStucture(UINT x, UINT y) {
if(smallStructuresNb == 1)
{
bigStructure->startTrigger = malloc(sizeof(BigStructure*));
bigStructure->startTrigger->x = x;
bigStructure->startTrigger->y = y;
}
else
{
BigStructure* tmpBigStructure = NULL;
tmpBigStructure = (BigStructure*)getLinkedListElement(&bigStructure, rowID); //Table row ID
g_print("%d", tmpBigStructure->id); //Here I get a false value !!!!
//Here I want to set the value of the tmpBigStructure->smallStructure->x/y
}
}
答案 0 :(得分:1)
我觉得问题出在getLinkedListElement()上。 这是一些代码建议:
BigStructure* getLinkedListElement(BigStructure** linkedList, int id)
{
int i;
if( linkedList == NULL || *linkedList == NULL)
return NULL ;
//We cannot update HEAD(linkedList), therfore using local pointer.
BigStructure* linkWalk = * linkedList;
/*I am asuming ids are mapped to linked list nodes as below.
id 0 -> first node
id 1 -> second node
......
id n -> n-1 node
*/
//starting from second node since linkWalk is already pointing to first above.
for(i=1; i<id && linkWalk != NULL; i++)
linkWalk = linkWalk->next;
// At this point , either id = 0 OR id = i OR the link has been traversed.
return linkWalk ;
}
最后, 在调用g_print(“%d”,tmpBigStructure-&gt; id)之前,请检查tmpBigStructure!= NULL。
答案 1 :(得分:0)
在我看来,全局:“BigStructure * bigStructure = NULL”是你的头指针,你传递了它的地址。你可以在头部添加节点。因此,你不需要走下列表来添加一个链接节点。
建议: 你传递的是bigStructure的地址(即双指针) 并在结构操作函数中作为单个指针进行操作。 这需要在所有功能中进行更改。
作为一个例子,你添加节点的功能可能就像(假设linkedList是HEAD):
BigStructure* addLinkedListElement(BigStructure** linkedList)
{
BigStructure* newLinkedList = malloc(sizeof(BigStructure));
if (newLinkedList == NULL)
return NULL ; // Just to handle malloc failure
newLinkedList->next = *linkedList;
*linkedList = newLinkedList;
return newLinkedList;
}