**【题目分析】:
将小于0的节点利用后插法插入Lb中,pre保存着pa的前驱,当节点小于0时,进行pre->next=pa->next,则删除了小于0的元素。当节点大于0时,进行pra=pa,pa=pa->next,pre保存着pa的前驱。**
【算法设计】
void Resolve(Linklist &La, Linklist &Lb)
{
Linklist pre = La;
Linklist pb = Lb;
Linklist pa = La;
pa = pa->next;
while (pa)
{
if (pa->date < 0)
{
Linklist p = new Lnode;
p = pa; //生成新节点
pre->next = pa->next; //删除小于0的节点,pre始终为pa的前驱
pa = pa->next; //pa后移
p->next = NULL; //后插法将元素插入Lb中
pb->next = p;
pb = p; //插入
}
else //大于0
{
pre = pa;
pa = pa->next; //pre为pa的前驱,pa指针后移动。
}
}
}
【具体实现】
#include <iostream>
using namespace std;
//定义存储
typedef struct LNode
{
int date;
struct LNode *next;
} Lnode, *Linklist;
//链表初始化
void init(Linklist &L)
{
L = new Lnode; // 开辟空间
L->next = NULL; //头节点置为空
}
//输出数据
void output(Linklist &T)
{
Linklist p = T;
p = p->next;
while (p)
{
cout << p->date;
p = p->next;
}
}
//后插法构建链表
void CreateLiklist(Linklist &L, int n)
{
Linklist r = L;
for (int i = 0; i < n; i++)
{
Linklist p = new Lnode; //开辟空间,p为节点
printf("请输入%d个数据\n", i + 1);
cin >> p->date;
p->next = NULL;
r->next = p; //将新节点插入r之后
r = p; ////r指向新的尾节点
}
}
void Resolve(Linklist &La, Linklist &Lb)
{
Linklist pre = La;
Linklist pb = Lb;
Linklist pa = La;
pa = pa->next;
while (pa)
{
if (pa->date < 0)
{
Linklist p = new Lnode;
p = pa; //生成新节点
pre->next = pa->next; //删除小于0的节点,pre始终为pa的前驱
pa = pa->next; //pa后移
p->next = NULL; //后插法将元素插入Lb中
pb->next = p;
pb = p; //插入
}
else //大于0
{
pre = pa;
pa = pa->next; //pre为pa的前驱,pa指针后移动。
}
}
}
int main()
{
Linklist La, Lb;
//初始化
init(La);
init(Lb);
int n1;
cout << "请输入请输入链表元素的个数" << endl;
cin >> n1;
CreateLiklist(La, n1);
Resolve(La, Lb);
cout << "La:";
output(La);
cout << endl;
cout << "Lb:";
output(Lb);
}
/**/
运行结果: