版权声明:本文为博主原创文章,未经博主允许不得转载。 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)