#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,但是没有任何返回啊