2021-12-16学习总结

今天主要巩固了单链表的知识,并且学习了双向链表。以下是今天碰到的重点题目和知识点。

1.题目描述

小T昨天很不爽
昨天路过体彩销售点买了2注生日号码玩,当晚开奖后……
小T号码: 8902088
中奖号码:3902888
一个号码不对就差了十几万……
小T想:为什么规则是那样玩的啊……为什么5个号码要连续才能中二等奖啊……
我自己创建个规则,开N个数字,只要数字位置对了不一定要连续就可以有奖。
现在有一个中奖号码,有一个兑奖号码,小T想知道一共有多少个数字位置正确的,N太大了……要求用链表做

输入格式

输入数据第一行包含一个整数T表示有T组测试数据

对于每组测试数据

第一行包含一个整数N,表示有N个数字

第二行包含N个中奖号码

第三行包含N个兑奖号码

输出格式

对于每组测试数据输出有多少个号码位置正确了

样例输入content_copy

2
7
3902888
8902088
10
1234567890
0987654321

样例输出content_copy

5
0

 思路分析:

这道题的主要思路就是输入两个相同长度的链表,然后都从第一个节点开始比较,如果数据域相同,就用个计数器加一,最后输出计数器的值即可

代码实现: 

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int data;
    struct node *next;
}linklist;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {   int n,sum=0,i,j;
         linklist *head1,*head2,*p1,*p2,*q1,*q2;
         p1=head1=(linklist*)malloc(sizeof(linklist));
         p2=head2=(linklist*)malloc(sizeof(linklist));

         char s1[100]={0},s2[100]={0};
         int count1=0,count2=0;

         scanf("%d",&n);
         getchar();
         gets(s1);
         gets(s2);
         for(i=0;i<n;i++)
          {   q1=(linklist*)malloc(sizeof(linklist));
               q1->data=s1[count1++]-'0';
              p1->next=q1;
              p1=p1->next;

          }
          p1->next=NULL;
          for(i=0;i<n;i++)
          {
              q2=(linklist*)malloc(sizeof(linklist));
               q2->data=s2[count2++]-'0';
              p2->next=q2;
              p2=p2->next;
          }
          p2->next=NULL;

          p1=head1->next;
          p2=head2->next;
          while(p1!=NULL&&p2!=NULL)
          {
              if(p1->data==p2->data)
                sum++;
              p1=p1->next;
              p2=p2->next;
          }
          printf("%d\n",sum);
    }
    return 0;
}

2. 

题目描述

(线性表)假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。

输入格式

输入长度n:5

输入数据:1 2 5 6 8

输入长度m:5

输入数据:3 4 7 9 10

输出格式

10 9 8 7 6 5 4 3 2 1

样例输入content_copy

4
7 9 10 11
4
8 12 13 14

样例输出content_copy

14 13 12 11 10 9 8 7 

思路分析: 

这道题的主要思路就是,把两个链表按降序排列,然后都从第一个节点开始比较,看哪个链表的当前节点的数据域更大,就放到新链表中。跳出循环之后,判断如果第一个链表到了空,则证明第二个链表中还有节点没放,就把第二个链表中的剩下节点存入新链表即可。第二个链表到了空的情况也相同。

代码实现: 

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{    int data;
      struct node* next;
}linklist;
int main()
{   int n,m,swap,i,j;
    linklist *head1,*head2,*p1,*p2,*q1,*q2,*head3,*p3,*q3;
    p1=head1=(linklist*)malloc(sizeof(linklist));
    p2=head2=(linklist*)malloc(sizeof(linklist));
    scanf("%d",&m);

    for(i=0;i<m;i++)
    {
        q1=(linklist*)malloc(sizeof(linklist));
        scanf("%d",&q1->data);
        p1->next=q1;
        p1=q1;
    }
    p1->next=NULL;

    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        q2=(linklist*)malloc(sizeof(linklist));
        scanf("%d",&q2->data);
        p2->next=q2;
        p2=q2;
    }
    p2->next=NULL;

    p1=head1->next;
    while(p1!=NULL)
    {
        q1=p1->next;
        while(q1!=NULL)
        {
            if(p1->data<q1->data)
            {
                swap=p1->data;
                p1->data=q1->data;
                q1->data=swap;
            }
            q1=q1->next;
        }
        p1=p1->next;
    }

    p2=head2->next;
    while(p2!=NULL)
    {
        q2=p2->next;
        while(q2!=NULL)
        {
            if(p2->data<q2->data)
            {
                swap=p2->data;
                p2->data=q2->data;
                q2->data=swap;
            }
            q2=q2->next;
        }
        p2=p2->next;
    }
    p3=head3=(linklist*)malloc(sizeof(linklist));

    p1=head1->next;
    p2=head2->next;
    while(p1!=NULL&&p2!=NULL)
    {    q3=(linklist*)malloc(sizeof(linklist));
          if(p1->data>p2->data)
          {
              q3->data=p1->data;
              p1=p1->next;
          }
          else if(p1->data<p2->data)
          {
              q3->data=p2->data;
              p2=p2->next;
          }
          p3->next=q3;
          p3=q3;
    }
    if(p1==NULL)
    {   while(p2!=NULL)
       {
        q3=(linklist*)malloc(sizeof(linklist));
        q3->data=p2->data;
        p2=p2->next;
        p3->next=q3;
        p3=q3;
       }
       p3->next=NULL;
    }

    if(p2==NULL)
    {
        while(p1!=NULL)
        {
            q3=(linklist*)malloc(sizeof(linklist));
            q3->data=p1->data;
            p1=p1->next;
            p3->next=q3;
            p3=q3;
        }
        p3->next=NULL;
    }

    p3=head3->next;
    while(p3!=NULL)
    {   printf("%d ",p3->data);
         p3=p3->next;

    }
    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值