其他分享
首页 > 其他分享> > 【数据结构】单链表的操作例2-3&4(TQ-P27)

【数据结构】单链表的操作例2-3&4(TQ-P27)

作者:互联网

#include <bits/stdc++.h>

using namespace std;

//定义单链表结点类型
typedef struct LNode
{
    int data;           //每个节点存放一个数据元素
    struct LNode *next; //指针指向下一个节点
} LNode, *LinkList;

//LNode强调返回的是一个结点
//LinkList强调这是一个单链表

//初始化一个单链表(带头结点)
bool InitList(LinkList &L)
{
    L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
    if (L == NULL)
    { //内存不足,分配失败
        return false;
    }
    else
    {
        L->next = NULL; //头结点之后暂时还没有结点
        //养成好习惯,只要是初始化单链表,都先把头指针指向NULL
    }
    return true;
}

//尾插法正向建立单链表
LinkList ListTailInsert(LinkList &L)
{
    InitList(L);      //初始化空表
    LNode *r = L, *s; //r为表尾指针
    int x;
    scanf("%d", &x);
    while (x != 9999)
    {
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;
        //在r结点之后插入元素x
        r = s;
        //r指向新的表尾结点
        //永远保持r指向最后一个结点
        scanf("%d", &x);
    }
    r->next = NULL; //尾结点指针置空
    return L;
}

//打印函数(带头结点)
void print(LinkList &L)
{
    LNode *p = L->next;

    while (p != NULL)
    {
        if (p->next != NULL)
        {
            printf("%d->", p->data);
        }
        else
        {
            printf("%d", p->data);
        }
        p = p->next;
    }
    printf("\n");
}

//单链表归并操作
void merge(LinkList &A, LinkList &B, LinkList &C)
{
    LNode *p = A->next; //p跟踪A的最小值结点
    LNode *q = B->next; //q跟踪B的最小值结点
    LNode *r = C;       //r始终指向C的终端结点
    while (p != NULL && q != NULL)
    { //当p与q都不空时,取p与q所指结点中较小的插入C的尾部
        if (p->data <= q->data)
        {
            r->next = p;
            p = p->next;
            r = r->next;
        }
        else
        {
            r->next = q;
            q = q->next;
            r = r->next;
        }
    }
    if (p != NULL)
    {
        r->next = p;
    }
    if (q != NULL)
    {
        r->next = q;
    }
}

int main()
{
    LinkList A, B, C;

    InitList(A);
    InitList(B);
    InitList(C);

    ListTailInsert(A);
    ListTailInsert(B);

    print(A);
    print(B);

    merge(A, B, C);

    print(C);

    return 0;
}

input:

1
3
5
9999
2
4
6
8
9999

output:

1->3->5
2->4->6->8
1->2->3->4->5->6->8

标签:结点,单链,LNode,NULL,next,LinkList,P27,TQ
来源: https://www.cnblogs.com/zhulu506/p/15008052.html