#include <cstdlib>
typedef int ElemType;
typedef struct DNode//定义双链表节点类型
{ ElemType data;
ElemType freq;
struct DNode *prior,*next;
}DLinkList;
bool InitList_DuL(DLinkList *&L)
{
L=(DLinkList *)malloc(sizeof(DLinkList));
if(L==NULL)
return false;
L->prior=L->next=L;
return true;
}
bool Creat_DuL(DLinkList *&L,ElemType a[],int n)
{
DLinkList *s;
bool k=InitList_DuL(L);
if (!k)
return false;
for(int i=0;i<n;i++)
{
s=(DLinkList *)malloc(sizeof(DLinkList));
s->data=a[i];
s->next=L;
s->prior=L->prior;
L->prior->next=s;
L->prior=s;
}
return true;
}
bool Locate_DuL(DLinkList *L,ElemType e,DLinkList *&p)
{
p=L->prior;
while(p!=L && p->data!=e)
p=p->prior;
if(p==L)
return false;
else
return true;
}
void Insert_DuL(DLinkList *&L,DLinkList *p,ElemType e1,ElemType e2)
{
DLinkList *s;
s=(DLinkList *)malloc(sizeof(DLinkList));
s->data=e1;
s->next=p;
s->prior=p->prior;
p->prior->next=s;
p->prior=s;
s=(DLinkList *)malloc(sizeof(DLinkList));
s->data=e2;
s->next=p->next;
s->prior=p;
p->next->prior=s;
p->next=s;
}
void Delete_DuL(DLinkList *&L,DLinkList *p)
{
p->prior->next=p->next ;
p->next->prior=p->prior;
free(p);
}
bool symmetry(DLinkList *L)
{
DLinkList *p,*q;
p=L->next;q=L->prior;
while(p!=q && q->next!=p)
if(p->data==q->data)
{
p=p->next;q=q->prior;
}
else
return false;
return true;
}
//实现访问频度递减功能
bool LocateNode(DLinkList *L,ElemType x)
{
DLinkList *p=L->next,*q;
while(p!=NULL&&p->data!=x)
{
p=p->next;
if(p==NULL)
return false;
if(p==NULL)
return false;
else
p->freq++;
q=p->prior;
while(q->freq<p->freq)
{
p->prior=q->prior;p->prior->next=p;
q->next=p->next;
if(q->next!=NULL)
q->next->prior=q;
p->next=q;q->prior=p;
q=p->prior;
}
return true;
}
}
int main()
{
DLinkList *L,*p;
ElemType a[]={11,22,33,44,55,66,77};
bool b=Creat_DuL(L,a,7);
LocateNode(L,33);
LocateNode(L,22);
LocateNode(L,33);
b=symmetry(L);
b=Locate_DuL(L,44,p);
Insert_DuL(L,p,100,200);
Delete_DuL(L,p);
}
双向链表实现访问频度递减
最新推荐文章于 2023-09-20 15:38:42 发布