第二章 线性表(链表的建立与合并)

1.利用头插法和尾插法建立单链表

1.1利用尾插法建立单链表

typedef struct NODE//定义了一个结点
{
    int data;//数据域
    struct NODE * next ;//指针域

}NODE,*PNODE;

void createListT(PNODE &L,int a[], int n)
{//创建一个链表,在表尾插入
    int i = 0;//计时器的初值为0;
    PNODE pEnd;//创建一个指针时刻指向链表中的最后一个结点
    L = (PNODE)malloc(sizeof(NODE));//创建了一个头结点,并使L指向了头结点
    if(L==NULL)
    {
        printf("结点动态分配失败!!!\n");
        exit(-1);
    }
    L->next = NULL;
    pEnd = L;//使pL指向头结点

    while(i<n)
    {
        PNODE pnew = (PNODE)malloc(sizeof(NODE));//新建一个插入结点
        pnew->data = a[i++];//把数组中的值赋给新的结点的数据域

        pnew->next = pEnd->next;
        pEnd->next = pnew;//把新的结点插入在表尾
        pEnd = pEnd->next;//pEnd指向当前链表的最后一个结点
    }
}

1.2利用尾插法建立单链表

void createListH(PNODE &L, int a[], int n)
{//创建一个链表在表头插入
    int i = 0;//计时器的初值为0;
    L = (PNODE)malloc(sizeof(NODE));//创建一个头结点并使L指向头结点
    if(L == NULL)
    {
        printf("头结点内存分配失败!!!\n");
        exit(-1);
    }
    L->next = NULL;

    while(i<n)
    {
        PNODE pnew = (PNODE)malloc(sizeof(NODE));//创建一个插入结点,并使pnew指向插入节点

        pnew->data = a[i++];

        pnew->next = L->next;//让插入结点的指针域指向头结点的指针域
        L->next = pnew;//让头结点的指针域指向插入的结点,即插入的结点插在表头;
    }
}

2.链表的合并

2.1链表的合并(尾插法)

把两个非递减的链表合成,合成后的链表也是非递减的

void MergeListT(PNODE La,PNODE &Lb,PNODE &Lc)
{//两个非递减的链表的合并,合并后链表还是非递减的
    PNODE pa,pb,pc;
    pa = La->next;//pa指向La的第一个结点
    pb = Lb->next;//pb指向Lb的第一个结点
    free(Lb);//把Lb的头结点释放掉
    Lb = NULL;//Lb指向空
    Lc = La;//Lc利用La的头结点
    Lc->next = NULL;
    pc = Lc;//pc指向Lc头结点

    while (pa != NULL && pb != NULL)//循环结束后必有一个链表的元素全部插入到LC中
    {
        if(pa->data <= pb->data)
        {
            pc->next = pa;//把pa指向的结点链接在Lc中
            pa = pa->next;//pa指向下一个结点
            pc = pc->next;//pc指向下一个结点即链表Lc的当前尾结点
      //    Link(pc,pa);
        }
        else //否则的话将pb指向的结点连接在LC中
        {
            pc->next = pb;
            pb = pb->next;
            pc = pc->next;
          //Link(pc,pb);

        }
    }

由于下面这段代码的重复性过高,所以可以封装为一个函数
pc->next = pa;//把pa指向的结点链接在Lc中
pa = pa->next;//pa指向下一个结点
pc = pc->next;//pc指向下一个结点即链表Lc的当前尾结点

void LinkT(PNODE &pc,PNODE &pw)
{
    pc->next = pw;//把pa指向的结点链接在Lc中
    pw = pw->next;//pa指向下一个结点
    pc = pc->next;//pc指向下一个结点即链表Lc的当前尾结点
}

2.2链表的合并(头插法)

void MergeListH(PNODE La,PNODE &Lb,PNODE &Lc)
{//两个非递减的链表的合并,合并后链表是递减的
    PNODE pa,pb,pt;
    pa = La->next;//pa指向La的第一个结点
    pb = Lb->next;//pb指向Lb的第一个结点
    free(Lb);//把Lb的头结点释放掉
    Lb = NULL;//Lb指向空
    Lc = La;//Lc利用La的头结点
    Lc->next = NULL;

    while (pa != NULL && pb != NULL)//循环结束后必有一个链表的元素全部插入到LC中
    {
        if(pa->data <= pb->data)
        {
//            pt = pa;
//利用pt保存要插入的结点,然后pa指向下一个结点,如果不保存直接插入的话,就会丢失pa后面的结点
//            pa = pa->next;
//            pt->next = Lc->next;
//            Lc->next = pt;
            LinkH(Lc,pa);

        }
        else //否则的话将pb指向的结点连接在LC中
        {
//            pt = pb;
//            pb = pb->next;
//            pt->next = Lc->next;
//            Lc->next = pt;
            LinkH(Lc,pb);
        }
    }

    while(pa != NULL)
    {
//       pt = pa;
//       pa = pa->next;
//       pt->next = Lc->next;
//       Lc->next = pt;
        LinkH(Lc,pa);
    }
    while(pb != NULL)
    {
//        pt = pb;
//        pb = pb->next;
//        pt->next = Lc->next;
//        Lc->next = pt;
        LinkH(Lc,pb);
    }

}

由于下面这段代码的重复性过高,所以可以封装为一个函数
// pt = pa;
// pa = pa->next;
// pt->next = Lc->next;
// Lc->next = pt;

void LinkH(PNODE &Lc,PNODE &pw)
{
    PNODE pt = pw;
    pw = pw->next;
    pt->next = Lc->next;
    Lc->next = pt;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值