合并两个单链表

  (2018-02-14 代码更新)

  marge.h:

#ifndef __MARGELINKLIST_H_
#define __MARGELINKLIST_H_

typedef int Type;

typedef struct Node
{
    struct Node*next;
    Type data;
}Node;

/* 定义函数 */
Node*CreateLinkList_A();
Node*CreateLinkList_B();
Node*Marge();

#endif

  marge.c:

#include <stdio.h>
#include <stdlib.h>
#include "marge.h"

Node*CreateLinkList_A(int length)
{
    Node * A, * t, * s;
    
    A = (Node*)malloc(sizeof(Node));
    t = A;
    for(int i = 0; i < length; i++)
    {
        s = (Node*)malloc(sizeof(Node));
        s->data = i + 1;
        t->next = s;
        t = s;
    }
    t->next = A->next;
    
    return t;  /* 返回尾结点 */
}

Node*CreateLinkList_B(int length)
{
    Node * B, * r, * c;
    
    B = (Node*)malloc(sizeof(Node));
    r = B;
    for(int i = 0; i < length; i++)
    {
        c = (Node*)malloc(sizeof(Node));
        c -> data = 2 * i + 1;
        r -> next = c;
        r = c;
    }
    r -> next = B;/* 注:因为释放时释放的是该链表的头结点,所以尾结点指向头结点(头结点没有数据),如果指向头的后一个,则会缺少第一个数 */
    
    return r;   /* 返回尾结点 */
}

Node*Marge(Node*a, Node*b)
{
    Node*p;
    
    p = a->next;
    a->next = b->next->next;
    free(b->next);
    b->next = p;
    
    return p;   /* 返回连接好的新链表的头结点 */
}

  main.c:

#include <stdio.h>
#include <stdlib.h>
#include "marge.h"

int main()
{
    Node*p;
    
    p = Marge(CreateLinkList_A(5), CreateLinkList_B(6));
    while(p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    
    return 0;
}

  

原文地址:https://www.cnblogs.com/darkchii/p/7347084.html