随机访问表结点

来源:互联网 发布:linux下iscsi服务搭建 编辑:程序博客网 时间:2024/06/05 23:01

原题:试编写如下功能的定们函数Locate(L,e),设有一个双向链表,每个节点中除有prior,data和next三个域外,还有一个访问频度域freq。在链表被起用后,频度域freq初始化为零,而每当对链表进行一次Locate(L,e)的操作后,被访问的结点(即元素值等于e的结点)中的频度域freq的值便增1,并且调整链表中节点之间的次序,使按访问频度非递增的次序顺序排列,以便使始终保持被频繁访问的结点总是靠近表头结点。

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<time.h>#include<windows.h>typedef struct LNode{int freq;//结点的访问频度char data;//结点的值struct LNode *prior,*next;//指向前驱和后继的指针}LNode,*LinkList;int InitList(LinkList &head){LinkList p,q;head=(LinkList)malloc(sizeof(LNode));q=head;//q永远指向表尾head->data='*';head->freq=-1;//访问头结点无意义,故其freq值永远为-1head->next=head->prior=head;//头结点指针初始时指向自己for(int k=0;k<26;k++){p=(LinkList)malloc(sizeof(LNode));p->data=char(65+k);//各个结点的data赋值为不同的大写字母if(head->next==head){//如果链表为空p->next=q->next;q->next=p;p->prior=q;q->prior=p;q=q->next;p->freq=0;//初始化访问频度为0}else{//如果链表不为空,则将p插入在表尾p->next=q->next;q->next=p;p->prior=q;q=q->next;head->prior=q;p->freq=0;//初始化访问频度为0}}return 1;}int DisplayList(LinkList head)//从头到尾依次输出链表中的数据{LinkList p=head;while(p->next != head){printf("(%c,%4d)  ",p->data,p->freq);p=p->next;}printf("(%c,%4d)\n\n",p->data,p->freq);return 1;}int LocateList(LinkList head){LinkList p=head->next,pre=p,lp;srand((unsigned)time(NULL));char q;//q用来记下访问的字符赋while(1)//无限循环访问链表中的结点{Sleep(100);//让程序休眠一段时间p=pre;//从当前位置开始查找q=(char)(rand()%26+65);//q赋值为随机生成的大写字母while(p->data != q){//寻找值等于q的结点p=p->next;}pre=p;//记住p的当前位置p->freq++;//访问频度加1char tem_data;int tem_freq;lp=p->prior;while(lp != head && lp->freq < p->freq){//交换lp与p的数据元素值tem_data=lp->data;lp->data=p->data;p->data=tem_data;//交换lp与p的频度tem_freq=lp->freq;lp->freq=p->freq;p->freq=tem_freq;p=lp;lp=lp->prior;//lp和p依次后移}DisplayList(head);//显示当前链表状态}return 1;}int main(){LinkList head;InitList(head);printf("初始状态时链表的数据如下:\n\n");DisplayList(head);printf("执行LocateList()函数后,链表的变化:\n\n");LocateList(head);return 1;}


 

原创粉丝点击