/*
若线性表中各结点的查找概率不等,则可用如下策略提高顺序查找的效率:若找到指定的结点,则将该结点的fre域的值加1,
使得经常被查找的结点位于表的前端。设双向链表的存储结构有四个域:pre,data,next和fre,data域为字符型,fre域为整形。
设计满足该功能的程序。
要求:
(1)首先建立一个不少于4个结点的双向链表;
(2)从键盘输入一个字符,在链表中进行查找。如果找到了,则将fre域的值加1,然后与左边结点的fre域的值进行比较,
比左边结点的fre的值大,则交换结点,直至不大为止;如果没有找到,则建立一个新结点,fre域的值为1,并且将新结点链接到链表的最后。
(3)输入数字字符0,则程序结束。
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct _DNode DNode;
struct _DNode{
DNode * pre;
char ch;
int count;
DNode * next;
};
DNode * CreatDNode(char ch){
DNode * dNode=(DNode *)malloc(sizeof(DNode));
dNode->next=NULL;
dNode->pre=NULL;
dNode->ch=ch;
dNode->count=0;
return dNode;
}
void AddDNode(DNode* dNode,char ch){
DNode * p=dNode;
while (p->next!=NULL)p=p->next;
DNode * dNode1=(DNode *)malloc(sizeof(DNode));
dNode1->ch=ch;
dNode1->count=0;
dNode1->pre=p;
dNode1->next=NULL;
p->next=dNode1;
}
DNode * MoveSetp(DNode * head,DNode * B){
DNode * A=B->pre;
DNode * Zero=A->pre;
DNode * C=B->next;
//Zero(or NULL)<==>B
if(Zero!=NULL){
Zero->next=B;
B->pre=Zero;
}
else{
B->pre=NULL;
}
//B<==>A
B->next=A;
A->pre=B;
//B<==>C(or NULL)
if(C!=NULL){
C->pre=A;
A->next=C;
}
else{
A->next=NULL;
}
if(Zero==NULL){
return B;
}
else{
return head;
}
}
DNode * sortOneself(DNode * head,DNode * p){
while (p->pre!=NULL&&p->count>(p->pre)->count){
head=MoveSetp(head,p);
}
return head;
}
DNode * sortDNode(DNode * head){
DNode * letter=head;
DNode * lcp=head;
// letter=sortOneself(letter,letter->next);
// letter=sortOneself(letter,letter->next->next);
// letter=sortOneself(letter,letter->next->next->next);
// letter=sortOneself(letter,letter->next->next->next->next);
// letter=sortOneself(letter,letter->next->next->next->next->next);
int c=0;
while (lcp->next!=NULL){
c++;
lcp=lcp->next;
letter=sortOneself(letter,lcp);
}
//printf("c=%d",c);
return letter;
}
bool FindChar(DNode * dNode, char ch){
int flag=0;
DNode * p=dNode;
while (1){
if(p->ch==ch){
flag=1;
break;
}
if(p->next==NULL){
break;
}
p=p->next;
}
if(flag==1){
(p->count)++;
return true;
}
else{
return false;
}
}
void ShowDNode(DNode * dNode){
DNode * dNode1=dNode;
printf("|%c;%d|",dNode1->ch,dNode1->count);
while (dNode1->next!=NULL){
dNode1=dNode1->next;
printf("<=>|%c;%d|",dNode1->ch,dNode1->count);
}
printf("\n");
//printf("<=>|%c;%d|\n",dNode1->ch,dNode1->count);
}
void UI(DNode * head){
char ch;
printf("请输入查找字符(0 to quit):");
scanf("%c",&ch);
getchar();
while (ch!='0'){
if(FindChar(head,ch)){
printf("找到了\n");
head=sortDNode(head);
ShowDNode(head);
}
else{
printf("没找到\n");
AddDNode(head,ch);
ShowDNode(head);
}
printf("请输入查找字符(0 to quit):");
scanf("%c",&ch);
getchar();
}
}
int main(void){
DNode * letter =CreatDNode('a');
DNode * lcp=letter;
//产生序列
for(char c='b';c<='h';c++){
AddDNode(letter,c);
}
ShowDNode(letter);
//随机查找(a-z)
// for(int i=0;i<100;i++){
// FindChar(letter,(char)('a'+rand()%25));
// }
UI(letter);
// letter=sortDNode(letter);
// letter=MoveSetp(letter,letter->next);
// ShowDNode(letter);
return 0;
}
数据结构-双向链表-插入排序练习题
最新推荐文章于 2021-09-27 13:15:21 发布