双向链表实现访问频度递减

来源:互联网 发布:买卖域名赚钱 编辑:程序博客网 时间:2024/05/19 12:14
#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;elsep->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);}