关于求交集的有关问题 肯请各位指教一二

关于求交集的问题 肯请各位指教一二
/************
 输入两组数,并求出它们的交集
************/
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
int date;
struct LNode *next;
}LNode;

void create(LNode *p) //产生数组链表
{
p=(LNode*)malloc(sizeof(LNode));
p->next=NULL;
p=p->next;
while(p->date!=NULL)
{
scanf("%d",&p->date);
p=p->next;
}
}

void askfor(LNode *La,LNode *Lb,LNode *Lc) //求出交集
{
LNode *Pa,*Pb,*Pc;
Pa=La->next; Pb=Lb->next;
Lc=Pc=La;
while(Pa)
{
while(Pb)
{
if(Pb->date==Pa->date)
{
Pc->next=Pa;
Pc=Pc->next;
}
Pb=Pb->next;
}
Pa=Pa->next;
}
free(Lb);
}

void main()
{
LNode *La=NULL,*Lb=NULL,*Lc=NULL;
create(La);
create(Lb);
askfor(La,Lb,Lc);
}

语法上没有什么错应该(调试无错误),运行的时候出现问题,指针已经有所指向,为什么运行的时候出问题?


------解决方案--------------------
// 改了一个程序出来
#include <stdio.h>
#include <malloc.h>
typedef struct LNode{
int date;
struct LNode *next;
}LNode;

//产生数组链表
void create(LNode *p){
LNode *tmp;
// 第一个对象作为链表头,不保存数据
// p=(LNode*)malloc(sizeof(LNode));
p->next = (LNode*)malloc(sizeof(LNode));
tmp = p; // tmp总是保存前一个指针,为的是链表创建结束时释放多申请的最后一个空间
p = p->next;
printf("创建整数链表, 用空格分割每个整数,最少要输入一个整数,^d结束输入:\n");
while(p != NULL){
if (1 == scanf("%d", &(p->date))) {
p->next = (LNode*)malloc(sizeof(LNode));
tmp = p;
p = p->next;
}
else{
free (p);
p = NULL;
tmp->next = NULL;
}
}
}

//求出交集
LNode* askfor(LNode *La, LNode *Lb){
LNode *Pa,*Pb,*Pc, *tmp, *head;
Pa=La->next; 
head=Pc=La;
while(Pa){
Pb = Lb->next;
while(Pb){
if(Pb->date == Pa->date){
Pc->next=Pa;
Pc=Pc->next;
break; // 找到一个相同的,就没必要继续在lb链表中继续寻找了
}
Pb=Pb->next;
}
// 释放La链表中非交集的对象
tmp = Pa->next;
if (Pc != Pa){
free(Pa);
}
Pa = tmp;
}

// 释放Lb链表
Pb = Lb->next;
while(Pb){
tmp = Pb;
free(tmp);
Pb = Pb->next;
}

return head;
}


void printLink(const LNode *link){
link = link->next;
while(link){
printf("%d ", link->date);
link = link->next;
}
printf("\n");
}

int main(void)
{
LNode La,Lb,*Lc;
create(&La);
// printLink(&La);
create(&Lb);
// printLink(&Lb);
Lc = askfor(&La,&Lb);
printLink(Lc);
}