C语言链表合并算法实现及常见错误分析
C语言链表合并算法实现及常见错误分析
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
List Merge( List L1, List L2 )
{
List head = (List)malloc(sizeof(struct Node));
List p = head;
List p1 = L1->Next;
List p2 = L2->Next;
while(p1 && p2)
{
if(p1->Data <= p2->Data)
{
p->Next = p1;
p1 = p1->Next;
}
else
{
p->Next = p2;
p2 = p2->Next;
}
p = p->Next;
}
if(p1)
{
p->Next = p1;
}
if(p2)
{
p->Next = p2;
}
L1->Next = NULL;
L2->Next = NULL;
return head;
}
编写这段代码时容易出现以下问题和错误:
- 忽略创建链表的细节:
Read()函数未提供,需要自己实现。如果没有正确创建链表,可能会导致后续的操作出错。
解决办法:实现 Read() 函数,确保正确创建链表。
- 未对空链表进行判断:
Print()函数未对空链表进行判断,可能会导致空指针错误。
解决办法:在 Print() 函数中添加对空链表的判断,如果链表为空,则输出 'NULL'。
- 内存泄漏: 在
Merge()函数中,创建了一个新的链表头节点head,但在函数结束后未释放该节点的内存。
解决办法:在函数结束前,释放 head 节点的内存。
- 未更新原链表的指针: 在
Merge()函数中,将p1和p2指针的下一个节点链接到p上后,未更新p1和p2的指针,可能会导致链表断裂。
解决办法:在链接完节点后,更新 p1 和 p2 的指针。
- 未将原链表的尾节点指向 NULL: 在
Merge()函数中,未将L1和L2的尾节点指向 NULL,可能会导致原链表的尾节点指向错误的位置。
解决办法:将 L1 和 L2 的尾节点指向 NULL。
综上所述,可以按照以下方式修改代码:
- 实现
Read()函数,确保正确创建链表。 - 在
Print()函数中添加对空链表的判断。 - 在
Merge()函数结束前,释放head节点的内存。 - 在链接完节点后,更新
p1和p2的指针。 - 将
L1和L2的尾节点指向 NULL。
原文地址: https://www.cveoy.top/t/topic/de0n 著作权归作者所有。请勿转载和采集!