函数接口定义:
PtrToNode Suffix( List L1, List L2 );
其中List结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L1和L2都是给定的带头结点的单链表。函数Suffix应返回L1和L2的公共后缀的起点位置。
PtrToNode Suffix( List L1, List L2 )
{
List p1=L1;
List p2=L2;
/*用num1 num2 记录链表长度,
因为是共享后缀链表,所以应将
两个链表长度后对齐。
*/
int num1=0,num2=0;
while(p1)
{
p1=p1->Next;
num1++;
}
while(p2)
{
p2=p2->Next;
num2++;
}
p1=L1->Next;
p2=L2->Next;
//链表对齐,
while(p2&&num1<num2)
{
p2=p2->Next;
num2--;
}
while(p1&&num1>num2)
{
p1=p1->Next;
num1--;
}
while(p1&&p2)
{
if(p1->Data==p2->Data&&p1->Next==p2->Next)
/*当p1 p2指针指向的Data值相同时,
再判断指针指向的下一个节点位置是否相同
即可找到正确的起点位置。
*/
return p1;
p1=p1->Next;
p2=p2->Next;
}
return NULL;
}