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

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值