我已经获得了为C中的链表创建各种方法的赋值。我陷入了交换方法,这似乎搞乱了整个链表。有人对我错在哪里有任何建议吗?干杯!
这是我的代码。
int main(int argc, char* argv[])
{
// A list of pointers to Reminders
const int MAX_ENTRIES = 10;
int numOfEntries = 0 ;
reminder_t* pFirst = (reminder_t*) malloc ( sizeof(reminder_t));
reminder_t* pSecond = (reminder_t*) malloc ( sizeof(reminder_t));
reminder_t* pThird = (reminder_t*) malloc ( sizeof(reminder_t));
reminder_t* pStart = NULL;
if (pFirst != NULL)
{
strcpy( pFirst->message, "Mikes Birthday");
pFirst->dateOfEvent.day= 1;
pFirst->dateOfEvent.month= 1;
pFirst->dateOfEvent.year= 2013;
pFirst->pNext = NULL;
}
if (pSecond != NULL)
{
strcpy( pSecond->message, "Als Soccer Match");
pSecond->dateOfEvent.day= 2;
pSecond->dateOfEvent.month= 2;
pSecond->dateOfEvent.year= 2013;
pSecond->pNext = NULL;
}
if ( pThird != NULL)
{
strcpy( pThird->message, "School Concert");
pThird->dateOfEvent.day= 3;
pThird->dateOfEvent.month= 3;
pThird->dateOfEvent.year= 2013;
pThird->pNext = NULL;
}
pFirst->pNext = pSecond;
pSecond->pNext = pThird;
pThird->pNext = NULL;
pStart = pFirst;
printf("\n------Before------\n");
listEntries(pStart);
swapPositonOf(pFirst,pThird);
printf("\n------After-aa-----\n");
listEntries(pStart);
getchar();
return 0;
}
void listEntries(reminder_t * pList)
{
printf("\n");
while (pList != NULL)
{
printf("%s\n", pList->message);
pList = pList->pNext;
}
}
void swapPositonOf(reminder_t* first , reminder_t* second)
{
reminder_t* pFirst = (reminder_t*) first;
reminder_t* pSecond = (reminder_t*) second;
reminder_t* temp = second->pNext;
pSecond->pNext = pFirst->pNext;
pFirst->pNext = temp;
temp = pSecond;
pSecond = pFirst;
pFirst = temp;
}
预期产出:
------Before------
Mikes Birthday
Als Soccer Match
School Concert
------After-aa-----
School Concert
Als Soccer Match
Mikes Birthday
输出:
------Before------
Mikes Birthday
Als Soccer Match
School Concert
------After-aa-----
Mikes Birthday
答案 0 :(得分:2)
您没有在pNext
和first
节点之前修改节点的second
指针。
您需要将“pNext
node”之前的节点的first
指向“second
node”,反之亦然。
假设链表:
Node_A -> Node_B -> Node_C -> Node_D -> Node_E
您必须交换Node_B和Node_D:
中断和形式的总链接:
Node_A -> Node_B
....新链接:Node_A -> Node_D
Node_B -> Node_C
....新链接:Node_D -> Node_C
Node_C -> Node_D
....新链接:Node_C -> Node_B
Node_D -> Node_E
....新链接:Node_B -> Node_E
还要记住像NULL指针和连续节点这样的极端情况。
答案 1 :(得分:2)
你没有正确交换它,第一个节点之前的节点和第二个节点之前的节点怎么样?
答案 2 :(得分:2)
使用单链表,您无法直接找到要交换的元素之前的列表元素。你有第一个,第二个,你可以直接操作它们,但你没有first.prev和second.prev。
您需要遍历列表,并找到要交换的两个节点之前的节点(first_previous,second_previous)。然后,节点交换还需要交换以前每个节点中的下一个节点。
reminder_t* first_prev, *second_prev;
first_prev = second_prev = pStart;
reminder_t* iter;
for( iter = pStart; iter; iter=iter->next )
{
if( iter->next == first ) first_prev = iter;
if( iter->next == second ) second_prev = iter;
}
您需要修复上述内容以处理空列表,一个元素列表,并在列表头部传递第一个或第二个...
答案 3 :(得分:1)
如果要交换列表节点的内容,那么这并不难:您可以只交换两个节点中的message
和dateOfEvent
字段
但是如果你想交换这些节点的位置(正如函数的名称所示),那么你必须注意pNext
数据成员。
实际上,仅仅交换节点指针是不够的
您需要在 first
和last
之前找到节点的位置,并执行以下操作:
/* reminder_t* beforeFirst, reminder_t* beforeSecond */
beforeFirst->pNext = second;
beforeSecond->pNext = first;
并交换first->pNext
和second->pNext
。
此外,在这些列表实现中,一般来说,注意特殊情况(如头节点和尾节点)非常重要。