#include<stdio.h> #include<stdlib.h> struct Node; typedef struct Node *ptrToNode ; typedef struct PtrToNode List; typedef struct PtrToNode Position; struct Node{ ElementType Ele; PtrToNode Next; }; void PrintLots(List L, List p) { int bef = 0; ElementType Tmp; Position ptr1,Ptr2; Ptr1 = p; Ptr2 = L; while( Ptr1->Next != NULL ) { int i; Tmp = Ptr1->Next->Ele; for( i = 0; i < Tmp - bef; i++) { Ptr2 = Ptr2->Next; } printf("%d",Ptr2->Ele); Ptr1 = Ptr1->Next; bef = Tmp; } }
运行时间为O(m+n),,m,n分别为两个链表的元素个数,以上是个人算法,没有用到Next和first
下面是标准答案(逻辑性强,信息量大)
void PrintLots( List L, List P ) { Position Ppos,Lpos; Ppos = First(P); Lpos =First(L); int counter = 1; while( Ppos != NULL && Lpos != NULL ) { if( Ppos->Ele == couter++)//counter的值和Lpos所指向位置的序数相等 { Ppos = next( Ppos, P ); printf("%?",Lpos->Ele); } Lpos = next( Lpos,L ); } }
模型建造:上面一排P链表
下面一排L链表
Ppos和Lpos分别指向两链表的头结点
除非指向L中相应的位置,否则绝不挪动Ppos指针
有趣的是counter++后的值与指向L中结点的序号相同