(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点

**【题目分析】:

将小于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);
}
/**/

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_47142993/article/details/107748503