zoukankan      html  css  js  c++  java
  • 合并两个单链表(链表方式)

    假设头指针为La、Lb单链表分别为线性表LA、LB的存储结构,现在要合并La、Lb得到单链表Lc

    void MergeList_L(LinkList La, LinkList Lb, LinkList Lc){
        //已知La、Lb的元素按值非递减排列
        //归并La、Lb得到单链表Lc,Lc的元素也是按值非递减排列的
        LinkList pa,pb,pc;
        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;//插入剩余段 
        free(Lb); 
    }

     链表合并实例:

     1 #include<stdio.h>
     2 #include<malloc.h>
     3 #include<stdlib.h>
     4 #include<string.h>
     5 #include<iostream>
     6 using namespace std;
     7 #define OVERFLOW -2
     8 typedef struct Node{
     9     int data;
    10     struct Node *next;
    11 }Node,*LinkList;
    12 
    13 int InitList(LinkList &L){
    14     L = (LinkList)malloc(sizeof(Node));
    15     if(!L)
    16         exit(OVERFLOW);
    17     L->next = NULL;
    18     return 1;
    19 }
    20 
    21 
    22 
    23 void CreatList(LinkList &L, int n){
    24     LinkList p,r;
    25     r = L;
    26     int a;
    27     for(int i = 0; i < n; i++){
    28         p = (LinkList)malloc(sizeof(Node));
    29         scanf("%d",&a);
    30         p->data = a;
    31         r->next = p;
    32         r = p;
    33     }
    34     r->next = NULL;
    35 }
    36 
    37 void PrintList(LinkList &L){//输出单链表 
    38     LinkList q;
    39     q = L->next;
    40     while(q){ 
    41         printf("%d ",q->data);
    42         q = q->next;
    43     }  
    44 }
    45 
    46 void Combine(LinkList La, LinkList Lb, LinkList Lc){
    47     LinkList pa,pb,pc;
    48     pa = La->next;
    49     pb = Lb->next;
    50     Lc = pc = La;
    51     while(pa && pb){
    52         if(pa->data <= pb->data){
    53             pc->next = pa;
    54             pc = pa;
    55             pa = pa->next;
    56         }
    57         else{
    58             pc->next = pb;
    59             pc = pb;
    60             pb = pb->next;
    61         }
    62     }
    63     pc->next = pa? pa:pb;
    64     free(Lb);
    65     PrintList(Lc);
    66 }
    67 
    68 int main(){
    69        int m,n;
    70     LinkList LA,LB;
    71     InitList(LA);
    72     InitList(LB);
    73     cout<<"请输入创建单链表LA的元素个数:";
    74     cin>>m;
    75     CreatList(LA,m);
    76     cout<<"请输入创建单链表LB的元素个数:";
    77     cin>>n;
    78     CreatList(LB,n);
    79     cout<<endl; 
    80     cout<<"     链表LA中的元素"<<endl;
    81     cout<<"-----------------------
    ";
    82     PrintList(LA);
    83     cout<<endl; 
    84     cout<<"
    
         链表LB中的元素"<<endl;
    85     cout<<"-----------------------
    ";
    86     PrintList(LB);
    87     cout<<"
    
    LA、LB合并后的输出结果:"<<endl;
    88     LinkList Lc;
    89     InitList(Lc);
    90     Combine(LA,LB,Lc); 
    91     return 0; 
    92 }

    运行结果:

  • 相关阅读:
    算法学习——贪心篇
    Centos7下搭建LAMP环境,安装wordpress(不会生产博客,只是一名博客搬运工)(菜鸟)
    小白创建网站的曲折之路
    7.2.5 多层嵌套的if语句
    7.2.4 else与if配对
    7.2.3
    7.4 electirc.c -- 计算电费
    oracle数据库命令行查看存储过程
    Linux下如何查看进程准确启动时间
    7.2 if else 语句
  • 原文地址:https://www.cnblogs.com/geziyu/p/9903351.html
Copyright © 2011-2022 走看看