PTA 6-2 入侵者围剿第二关2情报解密

经过上一步,已经创建了2个分队的情报信息链,现在需要将2个分队的情报进行合并,并删除重复值,合并后的情报信息确保唯一性。
假定上一步输入的情报信息是有序的,现在是合并2个有序链表。

函数接口定义:

第一个函数是: 
ptr add(ptr ha,ptr hb); 
//创建一个有序新链表,值从两个有序链表ha,hb中复制 
第二个函数是: 
ptr createnode(ptr p,ptr last) 
//生成新结点s,新结点的值从p复制,然后将结点串接到链表尾部 
第三个函数是: 
void addremaining(ptr p,ptr q,ptr last) 
//两个链表有一个先结束,还没有结束的链表要整体复制到新链表中 

add功能:两个有序链表ha,hb进行合并运算,构成一个新的链表返回,原链表ha,hb保留。
add需要调用createnode和addremaining函数。
思路:p指向ha第一个元素,q指向hb第一个元素,循环条件是p和q都不为空,
每循环一次,判断当前p和q指向的2个结点值,如果p的值小,将p的值复制到新结点,串到新链表中,p指向下一个结点;如果q的值小,……,如果两个值相同,则…..
最后还要判断两个链表,是哪个后结束,还没有结束的链表,要把剩下的元素全部复制一份串到新链表中
createnode提示:
//步骤提示
//1.生成新结点,地址为s 2.将p指向的结点所有值拷贝一份给s指向的结点
//3.将s串接到last后,s变成新的last 4.返回s

裁判测试程序样例:

#include <stdio.h> 
typedef struct snode { 
char name[10]; 
int age; int num; 
struct snode *next; }node,*ptr; 
ptr creat(); 
ptr add(ptr ha,ptr hb); 
ptr createnode(ptr p,ptr last); 
void addremaining(ptr p,ptr q,ptr last); 
void output(ptr h) { ptr p; 
p=h->next; 
while(p!=NULL) { 
printf("%s %d %d; ",p->name,p->age,p->num); 
p=p->next; } 
printf("\n"); } 
ptr creat() { 
ptr head,tail,q; 
char tname[10]; 
int tnum; int tage; 
head=tail=(ptr)malloc(sizeof(node)); 
head->next=NULL; 
scanf("%d%s%d",&tnum,tname,&tage); 
while(tnum!=0) { 
q=(ptr)malloc(sizeof(node)); 
strcpy(q->name,tname); 
q->num=tnum; 
q->age=tage; 
tail->next=q; 
q->next=NULL; 
tail=tail->next; 
scanf("%d%s%d",&tnum,tname,&tage); } 
return head; } 
int main() { 
ptr h1,h2,h3; 
h1=creat(); output(h1); 
h2=creat(); output(h2); 
h3=add(h1,h2); output(h3); 
return 0; } 
/* 请在这里填写答案 */

输入样例:

2 tom 22
3 jim 21
4 lili 21
0 0 0
3 jim 21
5 ni 20
6 ming 23
0 0 0

输出样例:

tom 22 2; jim 21 3; lili 21 4; 
jim 21 3; ni 20 5; ming 23 6; 
tom 22 2; jim 21 3; lili 21 4; ni 20 5; ming 23 6; 

代码实现: 


    ptr add(ptr ha, ptr hb) {  
    ptr h = (ptr)malloc(sizeof(node))=NULL; 
    ptr tail = h; 
  
    ptr pa = ha->next;  
    ptr pb = hb->next; 
  
    while (pa != NULL && pb != NULL) {  
        if (pa->num < pb->num) {  
          
            tail->next = pa;  
            tail = pa;  
            pa = pa->next;  NULL
        } else if (pa->num > pb->num) {  
            
            tail->next = pb;  
            tail = pb;  
            pb = pb->next;  
        } else {  
           
            tail->next = pa;  
            tail = pa;  
            pa = pa->next;  
            pb = pb->next;  
        }  
    }  
  
    while (pa != NULL) {  
        tail->next = pa;  
        tail = pa;  
        pa = pa->next;  
    }  
    while (pb != NULL) {  
        tail->next = pb;  
        tail = pb;  
        pb = pb->next;  
    }  
  
    free(ha);  
    free(hb);
    return h; 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值