数据结构之链表常见操作C++实现

基本的链表增删改查移步到上一篇:

https://blog.csdn.net/q466547450/article/details/89408637

视频讲解:https://www.bilibili.com/video/av52129100/

回顾:上篇写了链表的创建,删除,头插法,头删法,元素查询,链表输出等基本实现。尾插法和头插法不一样的地方在于需要循环遍历到尾部。

以下内容都是链表操作函数以及main函数里面的测试调用,main函数往上一篇找。

//链表逆序
void reverseLinkList(LinkNode& head){
    LinkNode newhead=NULL;
    LinkNode l=head->next;
    if(createLinkList(newhead)){
        while(l){
            LinkNode lnext=l->next;
            l->next=newhead->next;
            newhead->next=l;
            newhead->data++;
            l=lnext;
        }
    }
    free(head);
    head=newhead;
}
//链表拼接,一条链表的尾端接上另一条链表的第一个数据域。
void joinLinkList(LinkNode ahead,LinkNode bhead,LinkNode& newhead){
    createLinkList(newhead);
    LinkNode h=ahead;
    newhead->next=h->next;
    while(h->next){
        h=h->next;
    }
    h->next=bhead->next;
    newhead->data=ahead->data+bhead->data;
}

以下提供两种链表排序方法,一种是插入排序,涉及到链表结点的插入,一种是选择排序,只操作链表的元素域。
//链表排序(插入排序)
void sortLinkListInset(LinkNode& head){
    LinkNode l=head->next;
    while(l->next){
        LinkNode k=head;
        while(k!=l){
            if(l->next->data<=k->next->data){
                LinkNode lnext=l->next;
                l->next=lnext->next;
                lnext->next=k->next;
                k->next=lnext;
                break;
            }
            k=k->next;
        }
        if(k==l){
            l=l->next;
        }
    }
}
//链表排序(选择排序)
void sortLinkListSelect(LinkNode& head){
    LinkNode l=head->next;
    LinkNode k=NULL;
    LinkNode min=NULL;
    while(l){
        k=l->next;
        min=l;
        while(k){
            if(min->data>k->data){
                min=k;
            }
            k=k->next;
        }
        Element temp=l->data;
        l->data=min->data;
        min->data=temp;
        l=l->next;
    }
}
//有序链表合并
void mergeLinkList(LinkNode ahead,LinkNode bhead,LinkNode& newhead){
     createLinkList(newhead);
     LinkNode la=ahead->next,lb=bhead->next,lc=newhead;
     while(la&&lb){
         if(la->data<lb->data){
             lc->next=(LinkNode)malloc(sizeof(Lnode)); //这操作慎用。
             lc=lc->next;
             lc->data=la->data;
             newhead->data++;
             la=la->next;
         }
        else{
            lc->next=(LinkNode)malloc(sizeof(Lnode));
            lc=lc->next;
            lc->data=lb->data;
            newhead->data++;
            lb=lb->next;
        }
    }
         while(lb){
             lc->next=(LinkNode)malloc(sizeof(Lnode));
             lc=lc->next;
            lc->data=lb->data;
            newhead->data++;
            lb=lb->next;
         }
         while(la){
             lc->next=(LinkNode)malloc(sizeof(Lnode));
             lc=lc->next;
            lc->data=la->data;
            newhead->data++;
            la=la->next;
         }
}

Main函数测试:

    insertNode(lb,2);
    insertNode(lb,13);
    insertNode(lb,1);
    insertNode(lb,16);
    insertNode(lb,12);
    //joinLinkList(head,lb,lc); //谨慎测试,因为lc这个链表只有头结点,其余下的结点都是参照前两条链表的
    sortLinkListSelect(lb);
    sortLinkListSelect(head);
    mergeLinkList(head,lb,lc);
    printLinkList(lc);
    reverseLinkList(lc);
    printLinkList(lc);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值