基础数据结构-线性表-单链表的合并操作

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

#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面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言。 

posted @ 2017-03-02 16:24  Nathaneko  阅读(467)  评论(0编辑  收藏  举报