早教吧 育儿知识 作业答案 考试题库 百科 知识分享

创建一个三个域的单链表,data,freq,next指针。freq表示访问该数据元素的频度,每构建一个结点,频度初始化为0,每访问一次频度加1,并将频度按由大到小的顺序排序。这个题目怎么做?

题目详情
创建一个三个域的单链表,data,freq,next指针。freq表示访问该数据元素的频度,每构建一个结点,频度初始化为0,每访问一次频度加1,并将频度按由大到小的顺序排序。这个题目怎么做?
▼优质解答
答案和解析
#include
#include
#define TDATA int
typedef struct _DNode{
struct _DNode *next;
TDATA data;
unsigned int freq;
}*PList;
PList Locate(PList L,TDATA e);
void Display(PList L);
void main()
{
PList LHead=NULL,p;
int i=1;
//creat a list,have a head node
LHead=(PList)malloc(sizeof(struct _DNode));
LHead->data=-1;
LHead->next=NULL;
LHead->freq=0;
do{
p=(PList)malloc(sizeof(struct _DNode));
if(p==NULL)break;
p->freq=0;
p->data=i;
p->next=LHead->next;
LHead->next=p;
}while(i++< 8 );
do{
printf("\nInput a int:");
fflush(stdin);
scanf("%d",&i);
p=Locate(LHead,i);
if(p==NULL)printf("Can't fand the %d\n",i);
else printf("Find the data %d, freq=%d\n",i,p->freq);
Display(LHead);
}while(i>=0);
}
PList Prev(PList L,PList pos)
{
PList p=L;
while((p!=NULL)&&(p->next!=pos)) p=p->next;
return p;
}
void Insert(PList L,PList pos,PList node)
{//insert node before pos
PList p=Prev(L,pos);
if(!p)return;
p->next=node;
node->next=pos;
}
void Delete(PList L,PList pos)
{//delete pos
PList p=Prev(L,pos);
if(!p)return;
p->next=pos->next;
}
PList Locate(PList L,TDATA e)
{
PList p=L->next,q=L->next;
while(p!=NULL&&p->data!=e) p=p->next;
if(p==NULL)return NULL;
p->freq++;
Delete(L,p);
q=L->next;
while(q!=NULL&&(q->freq>p->freq)) q=q->next;
Insert(L,q,p);
return p;
}
void Display(PList L)
{
PList p=L->next;
int i=1;
while(p)
{
printf("No.%d Node:Data:%d,Freq:%d\n",i++,p->data,p->freq);
p=p->next;
}
}