单链表的合并

代码示例

/*
    function:单链表的合并
    created by : xilong
    date: 2017.2.5
*/

#include "iostream"
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;
typedef struct Node             // 定义结构体
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node* LinkList;

/*
    功能:初始化一个空链表
*/
LinkList LinkList_Init()
{
    LinkList head;
    head = (LinkList)malloc(sizeof(LinkList));      // 申请结点
    head->next = NULL;                              // 头结点的next指向NULL
    return head;
}

/*
    功能:尾插法创建单链表
*/
void LinkList_CreateFormTail(LinkList *head)
{
    LinkList p, s;
    p = *head;
    int flag = 1;
    double number;
    while (flag)
    {
        cin >> number;
        if (number != -99999)
        {
            s = (LinkList)malloc(sizeof(LinkList));
            s->data = number;
            p->next = s;
            p = s;
        }
        else
        {
            flag = 0;
            p->next = NULL;     // 如果到末尾,将末尾结点的next指向NULL
        }
    }
}
/*
    功能:计算链表长度
*/
Status LinkList_Length(LinkList *head)
{
    LinkList p;
    p = *head;
    int count = 0;
    if (p == NULL)
    {
        cout << "空链表!" << endl;
        return ERROR;
    }
    while (p != NULL)
    {
        count++;
        p = p->next;
    }
    return count-1;
}

/*
    功能:两个链表合并
*/
LinkList LinkList_merge(LinkList *LA, LinkList *LB)
{
    LinkList p1, p2;
    p1 = *LA;
    p2 = *LB;
    if (p1->next == NULL)   // 如果第一个链表为空,就直接返回第二个链表的头结点
    {
        return *LB;
    }
    if (p2->next == NULL)   // 如果第二个链表为空,返回第一个链表头结点
    {
        return *LA;
    }

    while (p1 && p1->next)  // 如果第一个链表有元素,将其循环不断指向下一个结点,直到最后一个结点
    {
        p1 = p1->next;
    }
    // 将第一个链表的最后一个结点的next连接到第二个链表头结点的next,将两个链表串成一个链表
    p1->next = (*LB)->next;
    free(*LB);
    return *LA;              // 返回第一个链表的头结点
}
/*
    功能:插入
*/
Status LinkList_Insert(LinkList *head, int i, ElemType e)
{
    LinkList pre, s;
    pre = *head;
    int k = 1;
    while (pre && k < i)
    {
        pre = pre->next;
        k++;
    }
    if (pre == NULL || k > i || i > LinkList_Length(head))
    {
        cout << "插入位置错误!" << endl;
        return ERROR;
    }

    s = (LinkList)malloc(sizeof(LinkList));
    s->data = e;
    s->next = pre->next;
    pre->next = s;
    return OK;
}

/*
    功能:打印单链表中所有数据
*/
Status LinkList_Print(LinkList *head)
{
    LinkList p;
    p = (*head)->next;
    if (p == NULL)
    {
        printf("linklist is empty...\n");
        return ERROR;
    }
    while (p != NULL)
    {
        printf("%3d", p->data);
        p = p->next;
    }
    printf("\n");
    return OK;
}


void main()
{
    LinkList LA, LB, LAB;
    ElemType e;
    cout << "LA链表的初始化以及创建:(输入-99999结束)" << endl;
    LA = LinkList_Init();
    LinkList_CreateFormTail(&LA);
    cout << "打印LA链表数据:";
    LinkList_Print(&LA);
    int count = LinkList_Length(&LA);
    cout << "LA链表的长度为:";
    cout << count << endl;
    cout << "LB链表的初始化以及创建:(输入-99999结束)" << endl;
    LB = LinkList_Init();
    LinkList_CreateFormTail(&LB);
    cout << "打印LB链表数据:";
    LinkList_Print(&LB);
    LAB = LinkList_merge(&LA, &LB);
    cout << "打印合并后的链表:";
    LinkList_Print(&LAB);
    cout << "插入数据,输入插入位置:";
    int insert;
    cin >> insert;
    LinkList_Insert(&LAB, insert, 98);
    cout << "打印的链表:";
    LinkList_Print(&LAB);

    system("pause");
}

程序截图

这里写图片描述

说明

  有关单链表的删除,查找等操作,在前几篇文章都有完整的代码示例和程序截图。
  单链表的基本操作:http://blog.youkuaiyun.com/xilong_666/article/details/54862457

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值