【数据结构】NOJ006—LOCATE操作

问题简述:

解析:

过程比较好想:首先建立一个双向循环链表,然后遍历每个节点,将出现的节点freq值加一,时间复杂度O(mn)。最后根据freq值对链表进行排序。

重点:

(1)创建双向循环链表;创建双向链表后

——头指针pre和尾指针next指向空为双向链表;

——头指针pre指向尾指针,尾指针next指向头指针就为双向循环链表;

(2)双向链表中交换元素顺序;先将元素取下来,然后往前找,找到插进去即可。

——取下来分两步;

——插入分四步;

代码:

#include <iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;

struct LinkNode{
    char value;
    int freq;
    LinkNode *next,*pre;
};

void Create_double_LinkList(LinkNode *head,int m,char *a)
{
    LinkNode *p=head;
    for(int i=0;i<m;i++)
    {
        LinkNode *node=new LinkNode;
        node->value=a[i];
        node->freq=0;

        node->next=NULL;
        p->next=node;
        node->pre=p;
        p=p->next;
    }
    p->next=head;
    head->pre=p;
}

void Change_Freq(LinkNode *head,int n,char *chNode)
{
    for(int i=0;i<n;i++)
    {
        LinkNode *p=head->next;
        for(;p!=head;p=p->next)
        {
            if(p->value==chNode[i])
            {
                //找到该节点,先把该节点拿出来
                p->freq++;
                p->pre->next=p->next;
                p->next->pre=p->pre;

                //往前找,找到插入的位置插入即可
                LinkNode *tmp=p->pre;
                while(tmp->freq<p->freq)
                    tmp=tmp->pre;//此处由于头节点fre=999,所以不会超过头节点
                //查到tmp后面即可

                p->next=tmp->next;
                tmp->next->pre=p;
                tmp->next=p;
                p->pre=tmp;

                break;
            }
        }
    }
}

int main()
{
    int m,n;
    cin>>m>>n;

    //将输入数据先存储下来
    getchar();
    char a[101],chNode[101];
    for(int i=0;i<m;i++)
    {
        cin>>a[i];
        getchar();
    }
    for(int i=0;i<n;i++)
    {
        cin>>chNode[i];
        getchar();
    }

    //创建头节点
    LinkNode *head=NULL;
    head=new LinkNode;
    head->next=NULL;
    head->pre=NULL;
    head->value=0;
    head->freq=999;//这里很重要,用来截住比较

    //创建双向循环链表
    Create_double_LinkList(head,m,a);

    //改变freq值
    Change_Freq(head,n,chNode);


    LinkNode *p=head->next;
    while(p!=head)
    {
        cout<<p->value<<" ";
        p=p->next;
    }
    free(p);
    return 0;
}

总结:

注意双向链表以及双向循环链表的创建,以及双向链表的的插入元素操作四步骤

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值