线性链表的合并。设线性表A = (a1, a2, ……, am),B = (b1, b2, ……,bn),试写一个按下列规则合并A,B为线性表C的算法,使得
C = (a1,b1,……,am,bm,bm+1,……,bn),当m<=n时
C = (a1,b1,……,an,bn,an+1,……,am),当m>n时
要求:a)线性表A,B和C均以单链表作存储结构,且C表利用A表和B表中的节点空间构成。
b)能自由输入A,B;输出C
给定测试数据:A:78、29、124、900、76、890。 B:3、567、87、12、29
题目分析
这道题目是八十分的题目,懂得都懂。就说一下会卡在什么地方吧!
- 头插法还是尾插法,尾插法,尾插法代码是否记得 tmp->next = null,r->next = tmp r =tmp;
- 打印从什么时候打印 先拿到next 然后 判断眺 p->next;
- 合并,s->next = p; s = p;p=p->next
注重这几点,基本上可以出炉
答案效果
完整代码
记得要封装,封装之后才会使代码变短;
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode*next;
}LNode,*LinkList;
void InitList(LinkList &A,int m){
LinkList p = A;
for(int i =0;i<m;i++){
LNode* tmp = new LNode;
cin >> tmp->data;
tmp->next = NULL;
p->next = tmp;
p = tmp;
}
}
void print(LinkList A){
LinkList p = A->next;
while(p != NULL){
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void Init(LinkList &A){
A = new LNode;
A->next = NULL;
}
void Merge(LinkList A,LinkList B,LinkList &C){
LinkList p = A->next;
LinkList q = B->next;
LinkList s = C;
int cnt = 0;
while(p != NULL && q != NULL){
if(cnt%2==0){
s->next =p;
s = p;
p = p->next;
}else{
s->next = q;
s= q;
q = q->next;
}
cnt++;
}
s->next = p?p:q;
}
int main(){
int n;
LinkList A,B,C;
int m;
Init(A);
Init(B);
Init(C);
cout << endl << "Please input A num" << endl;
cin >> m; //输入A的m值
InitList(A,m);
cout << endl << "A value :" << endl;
print(A);
cout << endl << "Please input B num" << endl;
cin >> n; //输入B的值
InitList(B,n);
cout << endl << "B value :" << endl;
print(B);
cout << endl << "merged" << endl;
Merge(A,B,C);
print(C);
}