别别别啊 2023-12-18 22:23 采纳率: 100%
浏览 7
已结题

合并有序链表遇到的问题

合并两个有序链表,学号如果相同就保留分高的一个,调试通过不了,而且感觉我写的有没有头结点这个地方就很混乱,麻烦指出错误修改程序,讲解详细一点
样例输入:
5
20303 62
20304 75
20307 87
20311 89
20320 79
6
20301 99
20302 65
20307 92
20311 87
20322 83
20323 88
样例输出
20301 99
20302 65
20303 62
20304 75
20307 92
20311 89
20320 79
20322 83
20323 88

#include<stdio.h>
#include<string.h>
#include <stdlib.h>


struct  data_array{
   long num;
   int score;
 };
typedef  struct student{
  long num;
  int score;
  struct student *next;
} NODE;
NODE * create(int n)
{
    int i;
    NODE *head,*p,*tail;
    head=(NODE*)malloc(sizeof(NODE));//创建头结点
    tail=head;
    p=head;
    head->num=0;
    head->score=0;
    for(i=0;i<n;i++)
    {
        p=(NODE*)malloc(sizeof(NODE));//申请下一个节点
        scanf("%ld %d",&p->num,&p->score);
        tail->next=p;
        tail=p;
    }
    tail->next=NULL;
    return head;
}
void display (NODE *head)
{
    NODE *p;
    p=head->next;//原先是p=head就不行
    while(p!=NULL)
    {
        printf("%ld %d\n",p->num,p->score);
        p=p->next;
    }
    printf("----\n");
}
NODE* merge(NODE *head1, NODE *head2)
{
    NODE *head=NULL;
    NODE *l1=NULL,*l2=NULL;
    head = (NODE*)malloc(sizeof(NODE));
    l1=head1->next;
    l2=head2->next;
    
    if(l1->num<l2->num)
    {
        head=l1;
        l1=l1->next;
    }
    else
    {
        head=l2;
        l2=l2->next;
    }
    NODE *tail=head;
    while(l1!=NULL&&l2!=NULL)//?
    {
        if(l1->num<l2->num)
        {
            tail->next=l1;
            l1=l1->next;
        }
        else if(l1->num>l2->num)
        {
            tail->next=l2;
            l2=l2->next;
        }
        else
        {
            if(l1->score>=l2->score)
            {
                tail->next=l1;
            }
            else
            {
                tail->next=l2;
            }
            l1=l1->next;
            l2=l2->next;
        }
        tail=tail->next;
    }
    if (l1!=NULL)
        tail->next = l1;    
    if (l2!=NULL)
        tail->next = l2;
    NODE *first=head->next;
    free(head);
    return first;
}
//void del(NODE *head1, NODE *head2)



    

int main(void)
{
    NODE *head1,*head2;
    NODE *head;
    int num1,num2;
    scanf("%d",&num1);
    getchar();
    head1=create(num1);
    scanf("%d",&num2);
    getchar();
    head2=create(num2);
    display(head1);
    display(head2);
    head=merge(head1,head2);
    display(head);
}


  • 写回答

7条回答 默认 最新

  • 社区专家-Monster-XH 2023-12-18 22:52
    关注

    要不就重写一个,要不就在你的代码上修改,怎么说

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 创建了问题 12月18日

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件