zoukankan      html  css  js  c++  java
  • 基础数据结构-线性表-单链表的合并操作

    本篇与顺序表的合并题目相同,只不过用了链表的方式实现

    #include <iostream>
    using namespace std;
    #define ok 0
    #define error -1
    
    class ListNode
    {public:
        int data;
        ListNode * next;
        ListNode() {next = NULL;}
     };        //链表结点类定义
     
     class LinkList
     {public:
         ListNode *head;
         int len;
         LinkList();
         //~LinkList();
         ListNode * LL_index(int i);        //返回第i个结点的指针,如果不存在返回NULL 
         int LL_get(int i);        //获取第i个元素的数据 
         int LL_insert(int i,int item);        //把数值item插入第i个位置 
         int LL_del(int i);        //删除第i个节点 
         void LL_display();        //输出单链表的内容 
        int LL_merge(ListNode *La, ListNode *Lb);        //合并链表
      };        //带头节点的单链表类定义
      
      LinkList::LinkList()
      {
          head = new ListNode();
          len = 0;
      }
      
    /*  LinkList::~LinkList()
      {
          ListNode *p,*q;
          p = head;
          while(p != NULL){
              q = p;
              p = p->next;
              delete q;
          }
      }*/
    
      ListNode * LinkList::LL_index(int i)
      {      
        ListNode *p;
          int j = 0;
          p = head;
          while(p!=NULL && j<i){
              p = p->next;
            j++;
        }
        if(!p)  return NULL;
        return p;
      }
      
      int LinkList::LL_get(int i)
      {
          if(i<1||i>len) return error;
        else{
        ListNode *LL;
        LL =  LL_index(i);
        cout << LL->data << endl;
        return ok;
        }
      }
      
      int LinkList::LL_insert(int i,int item)
      {
          if(i>len+1) return error;
        else{
              ListNode *p,*s;
              p = LL_index(i-1);
              s = new ListNode();
              s->next = p->next;
              p->next = s;
              s->data = item;
            len++;
            return ok;
        }
      }
      
      int LinkList::LL_del(int i)
      {
          if(i<1||i>len) return error;
        else{
              ListNode *p;
            p = LL_index(i-1);
            p->next = p->next->next;
              len--;
            return ok;
            }
      }
        
      void LinkList::LL_display()
      {
          ListNode *p;
          p = head->next;
          while(p){
              cout << p->data << ' ';
              p = p->next;
          }
          cout<<endl;
      }
    
    int LinkList::LL_merge(ListNode *La, ListNode *Lb)
      {
        ListNode *pa, *pb, *pc, *Lc,*p;
        pa = La->next;    pb = Lb->next;
        Lc = pc = La;             // 用La的头结点作为Lc的头结点
        while (pa && pb) {
          if (pa->data <= pb->data) 
          {  pc->next = pa;   pc = pa;   pa = pa->next;  }
          else { pc->next = pb;   pc = pb;   pb = pb->next; }
        }
        pc->next = pa ? pa : pb;  // 插入剩余段
        p = Lc->next;
          while(p){
              cout << p->data << ' ';
              p = p->next;
          }
          cout<<endl;
          return 0;
      }
    
      int main()
      {
          int i,it,len;
          LinkList ll_1,ll_2;
        cin >> len;
        for(i=1;i<=len;i++){
            cin >> it;
            ll_1.LL_insert(i,it);
        }
        cin >> len;
        for(i=1;i<=len;i++){
            cin >> it;
            ll_2.LL_insert(i,it);
        }
        ll_2.LL_merge(ll_1.LL_index(0),ll_2.LL_index(0));  
        return 0;
      }

    因为最近笔记本B面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言。 

  • 相关阅读:
    《Linux内核设计与实现》读书笔记 第十八章 调试
    《Linux内核设计与实现》读书笔记 第五章 系统调用
    [题解] LuoguP5488 差分与前缀和
    [题解] LuoguP4655 [CEOI2017]Building Bridges
    [题解] Tenka1 Programmer Contest 2019 E
    [题解] LuoguP4284 [SHOI2014]概率充电器
    长链剖分学习笔记
    [题解] LuoguP4292 [WC2010]重建计划
    [题解] LuoguP6197 [EER1]礼物
    [题解] LuoguP3980 [NOI2008]志愿者招募
  • 原文地址:https://www.cnblogs.com/nathaneko/p/6491238.html
Copyright © 2011-2022 走看看