PAT : 数据结构与算法题目集(中文)7-52 两个有序链表序列的交集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/87038515

目录

1.结构体指针构建(C ++ 11)

2.结构体数组构建(C)


1.结构体指针构建(C ++ 11)

#include <iostream>
#include <string>
#include <vector>
using namespace std;
using Link = struct LinkNode *;
struct LinkNode
{
    int Value;
    Link Next;
};
int getdigit(void)
{
    int digit{0}, symbol{1};
    bool isp{true};
    while (1)
    {
        char ch = getchar();
        if (ch == ' ' || ch == '\n' || ch == EOF || ch == '\t')
        {
            if (isp)
                continue;
            return digit * symbol;
        }
        isp = false;
        if (ch == '-')
            symbol = -1;
        else
            digit = digit * 10 + ch - '0';
    }
}
void putdigit(int digit)
{
    if (digit < 0)
    {
        putchar('-');
        putdigit(-digit);
    }
    if (digit >= 10)
        putdigit(digit / 10);
    putchar(digit % 10 + '0');
}
Link CreatLink(void)
{
    int temp = getdigit();
    if (temp == -1)
        return nullptr;
    Link L = static_cast<Link>(malloc(sizeof(LinkNode)));
    Link T = L;
    T->Value = temp;
    temp = getdigit();
    while (temp != -1)
    {
        T->Next = static_cast<Link>(malloc(sizeof(LinkNode)));
        T = T->Next;
        T->Value = temp;
        temp = getdigit();
    }
    T->Next = nullptr;
    return L;
}
Link NewLinkNode(int value)
{
    Link L = static_cast<Link>(malloc(sizeof(LinkNode)));
    L->Value = value;
    L->Next = nullptr;
    return L;
}
Link AssumeLink(Link a, Link b)
{
    if (a == nullptr || b == nullptr)
        return nullptr;
    Link T{NewLinkNode(0)}, Tem = T;
    while (a != nullptr)
    {
        while (b->Next != nullptr && b->Value < a->Value)
            b = b->Next;
        if (b->Value == a->Value)
        {
            Tem->Next = NewLinkNode(a->Value);
            Tem = Tem->Next;
            if (b->Next != nullptr)
                b = b->Next;
        }
        if (b->Next == nullptr && b->Value < a->Value)
            break;
        a = a->Next;
    }
    Tem->Next = nullptr;
    Tem = T;
    T = T->Next;
    free(Tem);
    return T;
}
void PrintLink(Link L)
{
    if (L == nullptr)
        puts("NULL");
    else
    {
        putdigit(L->Value);
        L = L->Next;
        while (L != nullptr)
        {
            putchar(' ');
            putdigit(L->Value);
            L = L->Next;
        }
        putchar('\n');
    }
}
void FreeLink(Link &L)
{
    while (L != nullptr)
    {
        Link Del = L;
        L = L->Next;
        free(Del);
    }
    L = nullptr;
}
int main(int argc, char *argv[])
{
    Link Add1{CreatLink()}, Add2{CreatLink()};
    Link Ass = AssumeLink(Add1, Add2);
    PrintLink(Ass);
    // FreeLink(Ass);
    // FreeLink(Add1);
    // FreeLink(Add2);
    return EXIT_SUCCESS;
}

与7-51题相同,稍加改动合并函数即可〜

 2.结构体数组构建(C)

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

#define CursorMax 1100000

typedef struct node
{
    int Element;
    int Next;
} Node;
Node CursorSpace[CursorMax];

int getdigit(void);
void putdigit(int temp);

static int CursorAlloc(void)
{
    int P;
    P = CursorSpace[0].Next;
    if (!P)
        return -1;
    CursorSpace[0].Next = CursorSpace[P].Next;
    return P;
}
static void CursorFree(int P)
{
    if (!P)
        return;
    CursorSpace[P].Next = CursorSpace[0].Next;
    CursorSpace[0].Next = P;
    return;
}
int LinkGet(void)
{
    int re = 0, temp = 0, sp = 0, in;
    while ((in = getdigit()) != -1)
    {
        temp = CursorAlloc();
        CursorSpace[temp].Element = in;
        CursorSpace[temp].Next = 0;
        if (!re)
            sp = re = temp;
        else
        {
            CursorSpace[sp].Next = temp;
            sp = temp;
        }
    }
    return re;
}
void LinkPrint(int P)
{
    if (!P)
    {
        putchar('N');
        putchar('U');
        putchar('L');
        putchar('L');
        putchar('\n');
        return;
    }
    putdigit(CursorSpace[P].Element);
    P = CursorSpace[P].Next;
    while (P)
    {
        putchar(' ');
        putdigit(CursorSpace[P].Element);
        P = CursorSpace[P].Next;
    }
    putchar('\n');
    return;
}
static void CursorInit(void)
{
    CursorSpace[CursorMax - 1].Next = 0;
    for (int i = 0; i < CursorMax - 1; i++)
        CursorSpace[i].Next = i + 1;
    return;
}
int LinkAssum(int a, int b)
{
    if (!a)
        return a;
    if (!b)
        return b;
    int sp, re = 0, temp = 0;
    while (a && b)
    {
        if (CursorSpace[a].Element == CursorSpace[b].Element)
        {
            sp = CursorAlloc();
            CursorSpace[sp].Element = CursorSpace[a].Element;
            a = CursorSpace[a].Next;
            b = CursorSpace[b].Next;
            if (!re)
                re = temp = sp;
            else
            {
                CursorSpace[temp].Next = sp;
                temp = sp;
            }
        }
        else if (CursorSpace[a].Element < CursorSpace[b].Element)
            a = CursorSpace[a].Next;
        else
            b = CursorSpace[b].Next;
    }
    if (temp)
        CursorSpace[temp].Next = 0;
    return re;
}
void LinkDel(int P)
{
    if (!P)
        return;
    while (P)
    {
        int temp = P;
        P = CursorSpace[P].Next;
        CursorFree(temp);
    }
    return;
}
int main(int argc, char **argv)
{
    CursorInit();
    int link1 = LinkGet();
    int link2 = LinkGet();
    link1 = LinkAssum(link1, link2);
    LinkPrint(link1);
    //LinkDel(link1);
    //LinkDel(link2);
    return EXIT_SUCCESS;
}

int getdigit(void)
{
    int temp = 0;
    int symbol = 1;
    char ch;
    bool isfis = true;
    while (1)
    {
        ch = getchar();
        if (ch == ' ' || ch == '\n' || ch == EOF)
        {
            if (isfis)
                continue;
            return temp * symbol;
        }
        if (ch == '-')
            symbol = -1;
        else
            temp = temp * 10 + ch - '0';
        isfis = false;
    }
}
void putdigit(int temp)
{
    if (temp < 0)
    {
        putchar('-');
        temp = -temp;
    }
    if (temp >= 10)
        putdigit(temp / 10);
    putchar(temp % 10 + '0');
}

同7-51,稍加改动合并函数即可。结构体数组最小大概是1100000,初始化的时间缩短了些。

和7-51得出的结果相同,在小数据规模下,数组下标法的初始化需要很长时间;但是在大规模下,数组下标法的耗时略有优势,内存消耗上很有优势(毕竟链表的指针和malloc的的索引数据需要很大空间〜2333)

结束

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/87038515