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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyzyfs/article/details/78170780
/*

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

猜你喜欢

转载自blog.csdn.net/cyzyfs/article/details/78170780