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;
}
本文介绍了一种双向链表的创建与维护方法,包括节点的插入、移动及搜索等功能。通过具体的C语言代码示例,详细展示了如何利用双向链表进行数据存储和操作。
&spm=1001.2101.3001.5002&articleId=79617506&d=1&t=3&u=d026b4de8bfa433483bd681ec0dbdb40)
259

被折叠的 条评论
为什么被折叠?



