一个指针有关问题,求大神看看!

一个指针问题,求大神看看!!
我要建立一个双链表,其中节点包括三个数据域data,prior和next,另外还有一个访问频度域freq,当节点被访问,freq的值就自加一,并将该节点移动到靠近头节点的位置。但是在LocateNode()函数节点交换那一块,我卡了,求大神解释。
#include<iostream>
using namespace std;
typedef struct LinkNode
{
int data;
struct LinkNode *prior,*next;
int frep;
}DLinkNode;

//初始化双链表
void InitLinkNode(DLinkNode *L)
{
L->prior=NULL;
L->next=NULL;
L->frep=0;
}

//创建链表
void CreateDList(DLinkNode *&L,int a[],int n)
{
DLinkNode *s;
int i;
L=(DLinkNode *)malloc(sizeof(DLinkNode));
L->prior=NULL;
L->next=NULL;
for(i=0;i<n;i++)
{
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data=a[i];
s->next=L->next;
if(L->next!=NULL)
L->next->prior=s;
L->next=s;
s->prior=L;
}
}
//输出链表
void dispList(DLinkNode *L)
{
DLinkNode *p = L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//销毁链表
void DestroyDList(DLinkNode *L)
{
DLinkNode *pre=L,*p=pre->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
L=NULL;
}
//访问双链表,将其中节点中的数值等于X的移到靠近表头的地方,
void LocateNode(DLinkNode *L,int x)
{
DLinkNode *s1=L,*p,*r,*s2;
while(s1->next!=NULL)
{
if(s1->next->data=x)
{
s1->frep++;
break;
}
s1=s1->next;
}
s1=L;
int max=s1->frep;
while(s1->next!=NULL)
{
if(s1->next->frep>max)
{
max=s1->next->frep;
p=s1->next;
}
s1=s1->next;
}
//记住原节点的位置
r=p;
s2=p;
p->next->prior=r->prior;
p->prior->next=r->next;

s2->next=L->next;
L->next=p;
s2->prior=L;

}

int main()
{
DLinkNode DL;
DLinkNode *L=&DL;
int a[10];

cout<<"please input ten numbers:";
for(int i=0;i<10;i++)
cin>>a[i];

//初始化链表
InitLinkNode(L);

//创建链表
CreateDList(L,a,10);

//输出链表
dispList(L);

//访问表中的数据
LocateNode(L,2);

//输出链表
dispList(L);

//销毁链表
DestroyDList(L);
return 0;
}

------解决方案--------------------
单步调试,或者参考stl的list源代码
------解决方案--------------------
引用:
我要建立一个双链表,其中节点包括三个数据域data,prior和next,另外还有一个访问频度域freq,当节点被访问,freq的值就自加一,并将该节点移动到靠近头节点的位置。但是在LocateNode()函数节点交换那一块,我卡了,求大神解释。
#include<iostream>
using namespace std;
typedef struct LinkNode
{
int data;
struct LinkNode *prior,*next;
int frep;
}DLinkNode;

//初始化双链表
void InitLinkNode(DLinkNode *L)
{
L->prior=NULL;
L->next=NULL;
L->frep=0;
}

//创建链表
void CreateDList(DLinkNode *&L,int a[],int n)
{
DLinkNode *s;
int i;
L=(DLinkNode *)malloc(sizeof(DLinkNode));
L->prior=NULL;
L->next=NULL;
for(i=0;i<n;i++)
{
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data=a[i];
s->next=L->next;
if(L->next!=NULL)
L->next->prior=s;
L->next=s;
s->prior=L;
}
}
//输出链表
void dispList(DLinkNode *L)
{
DLinkNode *p = L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//销毁链表
void DestroyDList(DLinkNode *L)
{
DLinkNode *pre=L,*p=pre->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
L=NULL;
}
//访问双链表,将其中节点中的数值等于X的移到靠近表头的地方,
void LocateNode(DLinkNode *L,int x)
{
DLinkNode *s1=L,*p,*r,*s2;
while(s1->next!=NULL)
{
if(s1->next->data=x)    //不该有的错误
{
s1->frep++;
break;
}
s1=s1->next;
}
s1=L;
int max=s1->frep;
while(s1->next!=NULL)
{
if(s1->next->frep>max)
{
max=s1->next->frep;
p=s1->next;
}
s1=s1->next;
}
//记住原节点的位置
r=p;
s2=p;
p->next->prior=r->prior;
p->prior->next=r->next;

s2->next=L->next;
L->next=p;
s2->prior=L;

}

int main()
{
DLinkNode DL;
DLinkNode *L=&DL;
int a[10];

cout<<"please input ten numbers:";
for(int i=0;i<10;i++)
cin>>a[i];

//初始化链表