经过上一步,已经创建了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;
}