c-牛客-HJ25 数据分类处理

题目

在这里插入图片描述
在这里插入图片描述

思路

用R和I存储各自序列长度,node为I序列合集,head为R序列存储的地方,head_node是用来指向相同R《i》中的元素,具体存储结构为下图所示
在这里插入图片描述
1 先输入,后将R从小到大排序,后将head的各元素初始化。
2 将I序列的数字变成字符存储与其结构体的a数组中为了方便对比当前数字是否含在R中。
3 将每一个head作为链表头节点,便利I序列将元素,将数字相同的元素创建head_node节点,并链表链接,
4 打印

代码

#include <stdio.h>
#include <string.h>
void I1output();
void R1output();
//数据存储节点
int R/*=6*/,I/*=15*/;

//存储I的值
struct node{
    int xb;//初始的下标
    long long data;   
    char a[100];
    int sum;//统计字符个数
}I1[100];//={{0,123},{1,456},{2,786},{3,453},{4,46},{5,7},{6,5},{7,3},{8,665},{9,453456},{10,745},{11,456},{12,786},{13,453},{14,123}};

//存储R的值
struct head_node{
    struct head_node *next;
    struct node *prev;
};
struct head{
    long long data;
    int sum;//统计当前R有多少个I
    int sumrs;
    char a[100];//将data转换成字符存储
    struct head_node *next; //链表头
    struct head_node *prev; //链表尾部
}R1[100]={{6},{3},{6},{3},{0},{45}};

//R1排序从小到大
void R1sort(){
    
    for(int i=0;i<R;i++){
        for (int  j = 0; j < R-1; j++){
            if (R1[j].data > R1[j+1].data)
            {   
                
                long long temp = R1[j].data;
                R1[j].data = R1[j+1].data;
                R1[j+1].data = temp;
            }
        }
    }
    //去掉R1中的重复元素
    for(int i=1;i<R;i++){
        if(R1[i].data==R1[i-1].data){
            for(int j=i;j<R-1;j++)
                R1[j].data=R1[j+1].data;
              R--;  
        }
    }
}

//head_R1初始化
void head_R1init(){
    for(int i=0;i<R;i++){
        R1[i].next = NULL;
        R1[i].prev = NULL;
        R1[i].sumrs=0;
        //将当前数值转换成字符
        if(R1[i].data==0){
             R1[i].a[0]='0';
             R1[i].a[1]='\0';
             R1[i].sum=1;
        }else{
             int j=0;
            int x=R1[i].data;
            while(x!=0){
                R1[i].a[j++]=x%10+'0';
                x/=10;
            }
            R1[i].a[j]='\0';
            R1[i].sum=j;
        }
       

    }
}

//判断R1中的a是否可以在I1中找到对应的a
int check_R1(int a,int b){
    for(int i=I1[b].sum-1;i>=0;i--){
        //当前字符与第一个字符相同
        if(I1[b].a[i]==R1[a].a[R1[a].sum-1]){
            if(R1[a].sum-2>=0){
                int j=R1[a].sum-1;;
                int j1=i;
                while(I1[b].a[j1]==R1[a].a[j]&&j>=0){
                    j--;
                    j1--;
                    
                }
                if(j==-1)return 1;
                else continue;
            }else{
                //当前的R1为个位数
                return 1;
            }
        }
    }
    return 0;
}

//将head_node连接到各点
void head_R1link(){
    /*遍历R将满足条件的存储到R1中*/
    for(int i=0;i<R;i++){
        /*将I中的数据遍历*/
        for(int j=0;j<I;j++){
            //对比成功在I中有找到R相同的
            if(check_R1(i,j)==1){
                R1[i].sumrs++;
                struct head_node *p=(struct head_node *)malloc(sizeof(struct head_node));
                p->next=NULL;
                p->prev=&I1[j];
                if(R1[i].next==NULL){
                    R1[i].next=p;
                    R1[i].prev=p;
                }else{
                    R1[i].prev->next=p;
                    R1[i].prev=p;
                }
            }else{
                continue;
            }
        }
    }
}

//输出R1的各节点以及链表
void head_R1output(){
    for(int i=0;i<R;i++){
        if(R1[i].next!=NULL){
            printf("%lld %d ",R1[i].data,R1[i].sumrs);
            struct head_node *q=R1[i].next;
            while(q!=NULL){
                printf("%d %lld ",q->prev->xb,q->prev->data);
                q=q->next;
            }
        }
    }
}
//将node中longlong转换成char的 a中
void itoa(int a){
    int i=0;
    int x=I1[a].data;
    while(x!=0){
        I1[a].a[i++]=x%10+'0';
        x/=10;
    }
    I1[a].a[i]='\0';
    I1[a].sum=i;
}

//输出函数将字符统计并输出
void output(){
    int sum=0;//统计多少个数字需要打印
    for(int i=0;i<R;i++){
        if(R1[i].next!=NULL){
            sum+=2; //输出R<i> 以及显示多少个
            sum+=R1[i].sumrs*2;//当前的R中有多少个数值需要打印
        }
    }
    printf("%d ",sum);
    head_R1output();
    printf("\n");
}

//输出R1和I1
void I1output(){
    printf("I1 \n");
    for(int i=0;i<I;i++){
        printf("xb=%d,data=%lld a=%s\n",I1[i].xb,I1[i].data,I1[i].a);
    }
    printf("R1 \n");
    for(int i=0;i<R;i++){
        printf("datd=%d a=%s ",R1[i].data,R1[i].a);
    }
    printf("\n");
}

int main(){
   
    scanf("%d",&I);
    for(int i=0;i<I;i++){
        scanf("%lld",&I1[i].data);
        I1[i].xb=i;
    }
    scanf("%d",&R);
    for(int i=0;i<R;i++){
        scanf("%lld",&R1[i].data);
    } 
   
    R1sort(); //将R进行排序
   
    head_R1init();  //将R的数值初始化一个R1都是一个链表头
    for(int i=0;i<I;i++){   //将I的数据字符化
        itoa(i);
    }
    head_R1link(); //创建每一个R元素的链表
    
  
   // head_R1output();
    output(); //输出
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值