数据结构-双向链表-插入排序练习题
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; }
相关文章推荐
- Java数据结构-线性表之双向链表
- 数据结构-有头双向循环链表
- 数据结构JavaScript——双向链表、双向循环链表
- 数据结构(四)——循环链表与双向链表
- 数据结构 将搜索二叉树转换成双向链表
- C语言数据结构----双向链表
- 数据结构:双向链表list的表头/尾添加数据、链表显示、链表清空
- 数据结构学习之双向链表结构
- 数据结构和算法-009 双向链表
- 数据结构-双向链表
- 算法导论第十章数据结构--双向链表
- 数据结构_线性表_链式存储_双向循环链表的基本操作
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- C/C++、JAVA 数据结构 :双向循环链表
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- 数据结构-链表-练习题1
- Linux内核分析--内核中的数据结构双向链表【转】
- 数据结构学习之双向链表
- 《数据结构》 循环链表和双向链表常用操作代码集合
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄