看看这个代码何处有问题


#include <stdio.h>
#include <stdlib.h>

typedef struct link
{
    int data;
    struct link *pNext;
}Node,*PNode;

PNode Creat()
{
    PNode L=NULL;
    L=(PNode)malloc(sizeof(Node));
    if(!L)
        return NULL;
    L->pNext=NULL;
    return L;
}

PNode Init(int M)
{
    PNode L=NULL,pnew=NULL,prear=NULL;
    int i;
    L=Creat();
    prear=L;
    for(i=0;i<M;i++)
    {
        pnew=(PNode)malloc(sizeof(Node));
        pnew->pNext=NULL;
        pnew->data=i+1;
        prear->pNext=pnew;
        prear=prear->pNext;
    }
    prear->pNext=L->pNext;
    return L;
}

void Insert(PNode L,int e)
{
    PNode prear=NULL,pnew=NULL;
    prear=L->pNext;
    pnew=(PNode)malloc(sizeof(Node));
    if(!pnew)
        exit(-1);
    pnew->data=e;
    pnew->pNext=NULL;
    if(L->pNext==NULL)
        L->pNext=pnew;
    else
    {
        while(prear&&prear->pNext!=NULL)
        {
            prear=prear->pNext;
        }
        prear->pNext=pnew;
        prear=pnew;
    }
    prear->pNext=L->pNext;
}

PNode Append(PNode L1,PNode L2,int N,int K)
{
    PNode prear=NULL,pfront=NULL,ptmp=NULL;
    int i;
    pfront=L1;
    prear=pfront->pNext;
    while(prear->pNext!=prear)
    {
        for(i=1;i<N;i++)
        {
            pfront=pfront->pNext;
            prear=pfront->pNext;
        }
        Insert(L2,prear->data);
        ptmp=prear;
        pfront->pNext=prear->pNext;
        free(ptmp);
        prear=pfront->pNext;
    }
    Insert(L2,prear->data);
    Find(L2,K);
}

void Find(PNode L,int K)
{
    PNode prear=NULL,pfront=NULL,ptmp=NULL;
    int i;
    pfront=L;
    prear=pfront->pNext;
    while(prear->pNext!=prear)
    {
        for(i=1;i<K;i++)
        {
            pfront=pfront->pNext;
            prear=pfront->pNext;
        }
        printf("%4d",prear->data);
        ptmp=prear;
        pfront->pNext=prear->pNext;
        free(ptmp);
        pfront=pfront;
        prear=pfront->pNext;
    }
    printf("%4d",prear->data);

}

int main()
{
    PNode L1=NULL,L2=NULL;
    int M,N,K;
    scanf("%d %d %d",&M,&N,&K);
    L1=Init(M);
    L2=Creat();
    Append(L1,L2,N,K);
    return 0;
}

错误不少呢,目测就发现好几个,Append,没有先链表 L1 是否为空, prear 指针在删除节点之后会野指针,需要重新指向下一个节点。
Find 函数,删除节点时需要先记录下一个节点的地址,删除最后一个节点时需要将 prear 指向链表头节点
还有就是Append返回类型是PNode,但是没有任何返回啊