链表的合并
- 格式:docx
- 大小:23.38 KB
- 文档页数:7
B.学生模拟题(SC6_6B.cpp)
【题目描述】
有2个从小到大已经排序好的(有序)表,每个结点的数据是1个整数,已知两个表的数据存放在带头结点的单向链表中,将2个有序表合并成1个新的有序表,并要求新的有序表中去掉重复相同的数据。
打开SC6_6B.cpp文件,完成程序的编写。
【输入】
输入文件SC6_6B.in有4行,第1行有1个整数n,即第1个表的结点数,第2行有n 个整数;第3行有1个整数m,即第2个表的结点数,第4行有m个整数。
整数之间用空格隔开。
【输出】
输出文件SC6_6B.out有1行,将上述2个表的数据从小到大排序输出,数据中没有相同项,每个整数之后输出1个空格。
【输入输出样例1】
0≤m,n;1≤m+n;所有数据均为整数。
#include "stdio.h"
const int INF=0x7fffffff; //无穷大整数
struct ND
{ int data;
struct ND *next;
};
ND *createLink( )
{ ND *head, *p;
int n;
head = p = new ND;
scanf("%d", &n);
while( n-- )
{ p->next = new ND;
p = p->next;
scanf("%d", &p->data);
}
p->next = NULL;
return head;
}
void printLink( ND *head )
{ ND *p=head->next;
if( p==NULL )return ;
while( p )
{ printf( "%d ",p->data );
p=p->next;
}
printf("\n");
}
void deleteLink( ND *head)
{ ND *p=head;
while( p )
{ head = p->next;
delete p;
p = head;
}
}
ND * megerLink( ND *ha, ND *hb ) //合并2有序表,返回合并后链表头结点的地址
{ ND *pa=ha->next, *pb=hb->next, *hc, *pc;
int data, lastData=INF; //lastData为上一个结点的数据项,用于判定是否有相同数据hc=pc=new ND;
//************************************************
while(pa||pb){
if(pa&&(pb==NULL||pa->data<=pb->data) ) {
data=pa->data;
pa=pa->next;
}
else if(pb&&(pa==NULL||pb->data<pa->data) ) {
data=pb->data;
pb=pb->next;
}
if(data!=lastData){
pc->next=new ND;
pc=pc->next;
pc->data=data;
lastData=data;
}
}
pc->next=NULL;
//=================================================
return hc;
}
int main()
{ ND *ha, *hb, *hc;
freopen( "sc6_6b.in", "r", stdin);
freopen( "sc6_6b.out", "w", stdout);
ha = createLink();
hb = createLink();
hc = megerLink( ha, hb );
printLink( hc );
deleteLink( ha );
deleteLink( hb );
deleteLink( hc );
return 0;
}
C.拓展题(SC6_6C.cpp)
有2个从小到大已经排序好的(有序)表,每个结点的数据是1个整数,已知两个表的数据存放在带头结点的单向链表中,将2个有序表合并成1个新的有序表,并要求新表中仅包含2个原表的交集。
打开SC6_6C.cpp文件,完成程序的编写。
【输入】
输入文件SC6_6C.in有4行,第1行有1个整数n,即第1个表的结点数,第2行有n 个整数;第3行有1个整数m,即第2个表的结点数,第4行有m个整数。
整数之间用空格隔开。
【输出】
输出文件SC6_6C.out有1行,将上述2个表数据的交集从小到大排序输出,每个整数之后输出1个空格。
【输入输出样例1】
0≤m,n;1≤m+n;所有数据均为整数。
#include "stdio.h"
const int INF=0x7fffffff; //无穷大整数
struct ND
{ int data;
struct ND *next;
};
ND *createLink( )
{ ND *head, *p;
int n;
head = p = new ND;
scanf("%d", &n);
while( n-- )
{ p->next = new ND;
p = p->next;
scanf("%d", &p->data);
}
p->next = NULL;
return head;
}
void printLink( ND *head )
{ ND *p=head->next;
if( p==NULL )return ;
while( p )
{ printf( "%d ",p->data );
p=p->next;
}
printf("\n");
}
void deleteLink( ND *head)
{ ND *p=head;
while( p )
{ head = p->next;
delete p;
p = head;
}
}
ND * megerLink( ND *ha, ND *hb ) //合并2有序表,返回合并后链表头结点的地址
{ ND *pa=ha->next, *pb=hb->next, *hc, *pc;
int data, lastData=INF; //lastData为上一个结点的数据项,用于判定是否有相同数据hc=pc=new ND;
//************************************************
while(pa||pb){
if(pa&&(pb==NULL||pa->data<pb->data) ) {
data=INF;
pa=pa->next;
}
else if(pb&&(pa==NULL||pb->data<pa->data) ) {
data=INF;
pb=pb->next;
}
else{
data=pa->data;
pb=pb->next;
pa=pa->next;
}
if(data!=INF&&data!=lastData){
pc->next=new ND;
pc=pc->next;
pc->data=data;
lastData=data;
}
}
pc->next=NULL;
//================================================= return hc;
}
int main()
{ ND *ha, *hb, *hc;
freopen( "sc6_6c.in", "r", stdin);
freopen( "sc6_6c.out", "w", stdout);
ha = createLink();
hb = createLink();
hc = megerLink( ha, hb );
printLink( hc );
deleteLink( ha );
deleteLink( hb );
deleteLink( hc );
return 0;
}。