题目
思路
用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(); //输出
}