#include <stdio.h>
#include <malloc.h>
typedef struct list
{
struct list * pnext;
int data;
} List , *pList;
int lena = 0;
int lenb = 0;
int pow1, pow2;
pList CreatHeadNode ()
{
pList pNewNode = (pList) malloc (sizeof (List));
if (NULL == pNewNode)
return NULL;
pNewNode->data = 0;
pNewNode->pnext = NULL;
return pNewNode;
}
pList CreatNewNode ()
{
pList pNewNode = (pList) malloc (sizeof (List));
if (NULL == pNewNode)
return NULL;
pNewNode->pnext = NULL;
printf ("enter data : ");
scanf ("%d", &pNewNode->data);
return pNewNode;
}
void InsertNewNode (pList pHead, pList pNewNode)
{
pNewNode->pnext = pHead->pnext;
pHead->pnext = pNewNode;
}
void BuildList (pList pHead, int len)
{
for (int i = 0; i < len; ++i)
{
pList pNewNode = CreatNewNode ();
InsertNewNode (pHead, pNewNode);
}
}
void PrintList (pList pHead)
{
pList p = pHead->pnext;
while (p)
{
printf ("%d ", p->data);
p = p->pnext;
}
printf ("\n");
}
pList FindPow (pList pHead, int pow)
{
pList p = pHead->pnext;
int val = 1;
while (val < pow)
{
val++;
p = p->pnext;
}
return p;
}
void LianJie (pList pHeada, pList pHeadb)
{
printf ("enter pow : ");
scanf ("%d %d", &pow1, &pow2);
pList p = FindPow (pHeada, pow1);
pList q = FindPow (pHeadb, pow2);
q->pnext = p->pnext;
}
void FindCommenNode (pList pHeada, pList pHeadb)
{
int val = 0;
int len = 0;
pList p;
pList q;
if (pow1 > pow2)
{
p = pHeada->pnext;
while (val < pow1-pow2)
{
val++;
p = p->pnext;
}
q = pHeadb->pnext;
}
else
{
p = pHeadb->pnext;
while (val < pow2-pow1)
{
val++;
p = p->pnext;
}
q = pHeada->pnext;
}
printf ("p->data = %d q->data = %d\n", p->data, q->data);
PrintList (p);
while (p->pnext != NULL && q->pnext != NULL)
{
printf ("1\n");
if (p->pnext == q->pnext)
{
len++;
}
p = p->pnext;
q = q->pnext;
}
printf ("len = %d\n", len);
//printf ("no\n");
//return;
}
int main ()
{
printf ("enter lena and lenb : ");
scanf ("%d %d", &lena, &lenb);
pList pHeada = CreatHeadNode ();
BuildList (pHeada, lena);
PrintList (pHeada);
pList pHeadb = CreatHeadNode ();
BuildList (pHeadb, lenb);
PrintList (pHeadb);
LianJie (pHeada, pHeadb);
PrintList (pHeadb);
FindCommenNode (pHeada, pHeadb);
}
第一步建立两个单链表,第二步分别确立公共节点在两个单链表上的位置, 并将这两个节点的指针域指向同一个节点的地址,第三步将长一点的链表节点移动到和短链表长度相同的位置, 两个链表指针同时移动,找到地址相同的节点。