LOCATE操作(双向链表的建立+双向链表值的移动)

本文介绍了一种双向链表的创建与维护方法,包括节点的插入、移动及搜索等功能。通过具体的C语言代码示例,详细展示了如何利用双向链表进行数据存储和操作。

LOCATE操作(双向链表的建立+双向链表值的移动)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
    char data;
    int freq;
    struct node *next;
    struct node *prev;
}LNode,*LinkList;
void CreateLink(LinkList *L,int n)
{
    int i;
    LinkList p,s;
    *L=(LinkList)malloc(sizeof(LNode));
    p=*L;
    p->next=NULL;
    p->prev=NULL;
    for(i=0;i<n-1;i++)
    {
        s=(LinkList)malloc(sizeof(LNode));
        scanf("%c ",&(s->data));
        s->freq=0;        //结构体在外部赋值,不要在内部赋值
        s->next=NULL;
        p->next=s;
        s->prev=p;     //创建双链表的时候前后同时写
        p=s;
    }
        s=(LinkList)malloc(sizeof(LNode));
        scanf("%c",&(s->data));
        s->next=NULL;
        p->next=s;
        s->prev=p;
        p=s;
        return;
}
void MoveLink(LinkList *L,char temp)
{
    LinkList head1=*L;    //head1每次都从头开始。
    LinkList head2;
    while(head1->next)
    {
        if(temp==head1->next->data)
        {
            (head1->next->freq)++;
             head2=head1->next;  //head2为head1->next->next就是为了构建一个头结点,这个头结点的data与正式数据无关
            while(head2->prev->prev) //但head->next->next对取最后一个元素是会发生段错误的,所以用head2表示当前结点
          {                          //因为逆回去是有头结点的,所以head2->prev->prev
             if(head2->freq>head2->prev->freq)
             {
                  int  tmd;
                  char tmc;
                  tmd=head2->prev->freq;
                  tmc=head2->prev->data;
                  head2->prev->freq=head2->freq; //啊,感觉交换结点太乱,所以用了值的交换
                  head2->prev->data=head2->data;
                  head2->freq=tmd;
                  head2->data=tmc;
             }
             head2=head2->prev;   //同样head2的移动也是必写的
          }
          return;
        }
        head1=head1->next;
    }
        return;
}
void SearchLink(LinkList *L,int m)
{


    int i;
    char str;
    LinkList head=*L;
    for(i=0;i<m-1;i++)
    {
        scanf("%c ",&str);
        MoveLink(&head,str);
    }
    scanf("%c",&str);
    MoveLink(&head,str);
    while(head->next)
    {
        if(head->next->next==NULL)
        printf("%c\n",head->next->data);
        else
        printf("%c ",head->next->data);
        head=head->next;
    }
    return;
}
int main()
{
    int n,m;
    LinkList a;
    scanf("%d %d",&n,&m);
    getchar();   //两个getcahr()是承接两个有字符行之前的换行的
    CreateLink(&a,n);
    getchar();
    SearchLink(&a,m);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值