链表提高篇编程题

7-1两个有序链表的合并

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;
LinkList creat()
{
    LinkList L,s,p;
    L=(LNode *)malloc(sizeof(LNode));
    p=L;
    int e;
    scanf("%d",&e);
    while(e>=0)
    {
        s=(LinkList)malloc(sizeof(LNode));
        s->data=e;
        p->next=s;
        p=s;
        scanf("%d",&e);
    }
    p->next=NULL;
    return L;
}
LinkList merge(LinkList la,LinkList lb)
{
    LinkList lc,pc,pa,pb;
    pc=lc=la;
    pa=la->next;
    pb=lb->next;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else
        {
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
    }
    if(pa) pc->next=pa;else pc->next=pb;
    free(lb);
    return lc;
}
void print(LinkList lc)
{
    LinkList p=lc->next;
    if(!p) printf("NULL");
    else
    {
        printf("%d",p->data);
        p=p->next;
        while(p)
        {
            printf(" %d",p->data);
            p=p->next;
        }
    }
}
int main()
{
    LinkList la,lb,lc;
    la=creat();
    lb=creat();
    lc=merge(la,lb);
    print(lc);
    return 0;
}

7-2两个有序链表序列的交集

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//一个开始用数组最后一个点总是过不了,就老实写链表了
struct Node{
    int Data;
    struct Node* Next;
};//链表结构体
typedef struct Node* List;
//创建一个链表
List Creat(){
    List head = (List)malloc(sizeof(struct Node)),q;
    head->Next = NULL;
    q = head;//创建头结点的链表 
    int x;
    while(~scanf("%d",&x)&&x!=-1){
        List p = (List)malloc(sizeof(struct Node));
        p->Data = x;
        p->Next = NULL;//赋值操作 
        q->Next = p;//前一个的下一个为新创建的结点 
        q = p;//尾指针指向最后一个 
    } 
    return head;

 
//求交集
List Merge(List a,List b){
    a = a->Next;
    b = b->Next;//分别指向第一个有效结点
    //创建交集链表的表头
    List head = (List)malloc(sizeof(struct Node));
    head->Next = NULL;
    List q = head; 
    while(a&&b){
        if(a==NULL||a->Data > b->Data){
            b = b->Next;//如果a为空,或者a比b大,a不能移动了,b往后移找更大的 
        }
        else if(b==NULL||b->Data > a->Data){
            a = a->Next;//同理 
        }
        else{//相同创建新的交集链表 
            List p = (List)malloc(sizeof(struct Node));
            p->Data = b->Data;
            p->Next = NULL;
            q->Next = p;
            q = p;
            a = a->Next;
            b = b->Next;//同时移动到下一个 
        }
    }
    return head;
}
 
//打印链表 
void printList(List a){
    a = a->Next;
    if(a==NULL){//为空输出NULL; 
        printf("NULL\n");
        return;
    }
    int flag = 0;
    while(a!=NULL){
        if(!flag)printf("%d",a->Data);
        else printf(" %d",a->Data);
        flag = 1;
        a = a->Next;//移动下一个,老是忘。。。。 
    }
    puts("");
    return;

int main(){
    List a = Creat();
    List b = Creat();
    List c = Merge(a,b);
    printList(c);
    return 0;
}

7-3约瑟夫环

 

#include<stdio.h>

#include<string.h>

int a[3000];

int main()

{

    int n,p,cnt=0,flag=0,num=0,i=1;

    scanf("%d %d",&n,&p);

    while(1)

    {

        if(!a[i])

        {

            num++;

            if(num==p)

            {

                a[i]=1;

                if(!flag)

                {

                    printf("%d",i);

                    flag=1;

                }

                else 

                    printf(" %d",i);

                num=0;

                cnt++;

            }

        }

        i++;

        if(i==n+1)

            i=1;

        if(cnt==n)

            break;

    }

    return 0;

}

7-4两个有序序列的中位数

#include <stdio.h>

int main(){

 int n, i, j = 0, k = 0;

 scanf("%d", &n);

 int a[n], b[n];

 for(i = 0; i < n; i++)

  scanf("%d", &a[i]);

 for(i = 0; i < n; i++)

  scanf("%d", &b[i]);

 while(j + k < n - 1)

    {

  if(a[j] >= b[k])

   k++;

  else

   j++;

 }

 printf("%d", a[j]>b[k]?b[k]:a[j]);//三目运算符

 return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值