链表中指针的问题 ,新定义指针对链表操作与直接对链表操作区别,代码如下?
代码1
List Merge( List L1, List L2 )
{
List L,q;
L =malloc(sizeof(struct Node));
q =L;
L1=L1->Next;
L2=L2->Next;
while(L1&&L2)
{
if(L1->Data<L2->Data)
{
q->Next=L1;
q =L1;
L1=L1->Next;
}
else
{
q->Next=L2;
q =L2;
L2=L2->Next;
}
}
q->Next =L1?L1:L2;
L1->Next=NULL;
L2->Next=NULL;
return L;
}
代码2
List Merge( List L1, List L2 )
{
List L;
L=malloc(sizeof(struct Node));
List p;//用P做游标遍历链表
p=L;
List p1=L1->Next;//头插法
List p2=L2->Next;
while(p1&&p2)
{
if(p1->Data<p2->Data)
{
p->Next=p1;
p=p1;
p1=p1->Next;
}
else
{
p->Next=p2;
p=p2;
p2=p2->Next;
}
}
p->Next=p1?p1:p2;
L1->Next=NULL;//为了输出
L2->Next=NULL;
return L;
}//代码2用p1和p代替L1和L2,代码直接对L1,L2为什么不对
代码1中,L1和L2在函数的参数中传入,因此在函数内部对L1和L2的修改不会影响到原始链表。L1 = L1->Next 和 L2 = L2->Next 实际上是将L1和L2向后移动一个位置,而不是修改原始链表的指针。
List Merge(List L1, List L2)
{
List L, q;
L = malloc(sizeof(struct Node));
q = L;
L1 = L1->Next;
L2 = L2->Next;
while (L1 && L2)
{
if (L1->Data < L2->Data)
{
q->Next = L1;
q = L1;
L1 = L1->Next;
}
else
{
q->Next = L2;
q = L2;
L2 = L2->Next;
}
}
q->Next = L1 ? L1 : L2;
L1->Next = NULL;
L2->Next = NULL;
return L;
}
代码2中,同样的道理,对p1和p2的修改只会在函数内部生效,不会对原始链表产生影响。L1->Next = NULL 和 L2->Next = NULL 是为了将原始链表的指针置为空,以便输出链表时能够正确地终止。
List Merge(List L1, List L2)
{
List L;
L = malloc(sizeof(struct Node));
List p; // 用P做游标遍历链表
p = L;
List p1 = L1->Next; // 头插法
List p2 = L2->Next;
while (p1 && p2)
{
if (p1->Data < p2->Data)
{
p->Next = p1;
p = p1;
p1 = p1->Next;
}
else
{
p->Next = p2;
p = p2;
p2 = p2->Next;
}
}
p->Next = p1 ? p1 : p2;
L1->Next = NULL; // 为了输出
L2->Next = NULL;
return L;
}
总结:
无论是代码1还是代码2,它们都是通过移动指针来操作链表的,而不是直接对原始链表进行修改。这样做是为了保持链表的完整性,并确保函数能够正确返回合并后的链表。