您的位置:首页 > 理论基础 > 数据结构算法

数据结构-双向链表-插入排序练习题

2017-10-07 18:17 351 查看
/*

若线性表中各结点的查找概率不等,则可用如下策略提高顺序查找的效率:若找到指定的结点,则将该结点的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);

9640
}

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: