#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct NODE{
struct NODE* pre;
struct NODE* next;
char n;
int freq;
}NODE;
void Output(NODE* head,int m) {//链表的遍历
NODE* p = head->next;
while ((m--)) {
printf("%c ", p->n);
p = p->next;
}
}
void Create(NODE* head, int m) {//尾插法创建双向循环链表
NODE* temp = head;
for (; m > 0; m--) {
NODE* p = (NODE*)malloc(sizeof(NODE));
if (p) {
char s;
s=getchar();
getchar();
p->n = s;
p->freq=0;
temp->next = p;
p->pre=temp;
temp = p;
}
}
temp->next=head;
}
void LinkListSort(NODE* head,NODE* temp){//完成对链表的排序要求
(temp->pre)->next=temp->next;
(temp->next)->pre=temp->pre;//1.将这个结点从表中提溜出来
NODE* q=head->next;
while(q){
if(q->freq==0){
(q->pre)->next=temp;
temp->pre=q->pre;
temp->next=q;
q->pre=temp;
break;
}//1.如果遇到这种情况:除了temp结点以外,所有结点的“被查找频率”都是0
/*else if((q->freq)==(temp->freq)){
(q->pre)->next=temp;
temp->pre=q->pre;
temp->next=q;
q->pre=temp;
break;
}//2.如果遇到这种情况:链表中各节点的“被查找频率”依次为:1、0......,而这个结点也为1
*/else if((q->freq)<(temp->freq)){
(q->pre)->next=temp;
temp->pre=q->pre;
temp->next=q;
q->pre=temp;
break;
}//3.如果遇到这种情况:链表中各结点的“被查找频率”依次为:1、1、0...,而这个结点为2
else{
q=q->next;
}
}
}
void LOCATE(NODE* head,char s){//完成对循环双链表的复杂操作
NODE* temp=head->next;
while(temp){
if((temp->n)==s) break;
else temp=temp->next;
}
if(temp){
temp->freq=temp->freq+1;
LinkListSort(head,temp);
}
}
int main()
{
int m,n;
scanf("%d%d",&m,&n);
getchar();//1.完成题目对第一行输入的要求
NODE* head=(NODE*)malloc(sizeof(NODE));
head->next=head->pre=NULL;
if(head){
Create(head,m);//2.完成题目对第二行输入的要求
}
while((n--)){
char s;
s=getchar();// 3.完成题目对第三行输入的要求
getchar();
LOCATE(head,s);
}
Output(head,m);//4.完成题目对输出的要求
return 0;
}
西工大NOJ数据结构理论——006.LOCATE操作(严2.38)
最新推荐文章于 2023-03-30 13:14:15 发布