又做了5道题

This commit is contained in:
Ruvikm
2021-01-10 11:57:25 +08:00
parent adbaa64fb7
commit 50e5ad1e4f
5 changed files with 604 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
#include <iostream>
#include <vector>
using namespace std;
//P41.11
//设C = { a1,b1,a2,b2,…,an,bn }为线性表, 采用带头结点的hc单链表存放, 设计一个就地
//算法, 将其拆分为两个线性表, 使得A = { a1,a2…,an }, B = { bn,…,b2,b1 }
#define ElemType int
#define _for(i,a,b) for(int i=(a);i<(b);i++)
#define INF 0x3f3f3f3f
#pragma region 建立带头结点的链表
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化链表
bool InitList(LinkList& L) {
//分配一个头结点
L = (LNode*)malloc(sizeof(LNode));
//内存不足,分配失败
if (L == NULL) {
return false;
}
//头结点之后暂时还没有节点
L->next = NULL;
return true;
}
//判断是否为空
bool IsEmpty(LinkList L) {
return ((L->next) == NULL);
}
//使用尾插法建表
LinkList CreatList(vector<int> data) {
if (data.size() < 1) {
return NULL;
}
//头结点
LNode* head = (LinkList)malloc(sizeof(LNode));
head->data = NULL;
head->next = NULL;
LinkList p = head;
_for(i, 0, data.size()) {
LNode* s = (LinkList)malloc(sizeof(LNode));
s->data = data[i];
s->next = NULL;
p->next = s;
p = s;
}
return head;
}
//输出链表
void PrintList(LinkList list) {
if (IsEmpty(list)) {
cout << "the list is null" << endl;
return;
}
list = list->next;
while (list != NULL) {
printf("%d ", list->data);
list = list->next;
}
printf("\n");
}
#pragma endregion
//P41.11
//把10题改成头插法就行
void Splitting(LinkList &head) {
LinkList B = (LinkList)malloc(sizeof(LNode));
B->next = NULL;
LinkList p = head->next;
LinkList pre = head;
LinkList Bp=B;
int i = 0;
while (p != NULL) {
i++;
if (i % 2 == 0) {
LNode* q = p;
pre->next = p->next;
q->next = Bp->next;
Bp->next = q;
p = pre->next;
}
else {
pre = p;
p = p->next;
}
}
cout << "A:" << endl;
PrintList(head);
cout << "B:" << endl;
PrintList(B);
}
int main()
{
vector<int> data{ 1,2,3,4,5,6,7,8 };
LinkList head;
InitList(head);
head = CreatList(data);
PrintList(head);
Splitting(head);
return 0;
}

View File

@@ -0,0 +1,105 @@
#include <iostream>
#include <vector>
using namespace std;
//P41.12
//在一个递增有序的线性表中有数值相同的元素存在。若存储方式为单链表, 设计算法
//去掉数值相同的元素, 使表中不再有重复的元素, 例如(7, 10, 10, 21, 30, 42, 42, 42, 51, 70)
//将变为(7, 10, 21, 30, 42, 51, 70)
#define ElemType int
#define _for(i,a,b) for(int i=(a);i<(b);i++)
#define INF 0x3f3f3f3f
#pragma region 建立带头结点的链表
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化链表
bool InitList(LinkList& L) {
//分配一个头结点
L = (LNode*)malloc(sizeof(LNode));
//内存不足,分配失败
if (L == NULL) {
return false;
}
//头结点之后暂时还没有节点
L->next = NULL;
return true;
}
//判断是否为空
bool IsEmpty(LinkList L) {
return ((L->next) == NULL);
}
//使用尾插法建表
LinkList CreatList(vector<int> data) {
if (data.size() < 1) {
return NULL;
}
//头结点
LNode* head = (LinkList)malloc(sizeof(LNode));
head->data = NULL;
head->next = NULL;
LinkList p = head;
_for(i, 0, data.size()) {
LNode* s = (LinkList)malloc(sizeof(LNode));
s->data = data[i];
s->next = NULL;
p->next = s;
p = s;
}
return head;
}
//输出链表
void PrintList(LinkList list) {
if (IsEmpty(list)) {
cout << "the list is null" << endl;
return;
}
list = list->next;
while (list != NULL) {
printf("%d ", list->data);
list = list->next;
}
printf("\n");
}
#pragma endregion
//P41.12
void de_duplication(LinkList& head) {
LinkList p = head->next;
LinkList pre = head;
while (p != NULL) {
if (p->data == pre->data) {
LNode* del = p;
pre->next = p->next;
delete del;
p = pre->next;
}
else {
pre = p;
p = p->next;
}
}
}
int main()
{
vector<int> data{ 7,10,10,21,30,42,42,42,51,70 };
LinkList head;
InitList(head);
head = CreatList(data);
PrintList(head);
de_duplication(head);
PrintList(head);
return 0;
}

View File

@@ -0,0 +1,140 @@
#include <iostream>
#include <vector>
using namespace std;
//P41.13
//假设有两个按元素值递增次序排列的线性表, 均以单链表形式存储。请编写算法将这两
//个单链表归并为一个按元素值递减次序排列的单链表, 并要求利用原来两个单链表的结
//点存放归并后的单链表
#define ElemType int
#define _for(i,a,b) for(int i=(a);i<(b);i++)
#define INF 0x3f3f3f3f
#pragma region 建立带头结点的链表
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化链表
bool InitList(LinkList& L) {
//分配一个头结点
L = (LNode*)malloc(sizeof(LNode));
//内存不足,分配失败
if (L == NULL) {
return false;
}
//头结点之后暂时还没有节点
L->next = NULL;
return true;
}
//判断是否为空
bool IsEmpty(LinkList L) {
return ((L->next) == NULL);
}
//使用尾插法建表
LinkList CreatList(vector<int> data) {
if (data.size() < 1) {
return NULL;
}
//头结点
LNode* head = (LinkList)malloc(sizeof(LNode));
head->data = NULL;
head->next = NULL;
LinkList p = head;
_for(i, 0, data.size()) {
LNode* s = (LinkList)malloc(sizeof(LNode));
s->data = data[i];
s->next = NULL;
p->next = s;
p = s;
}
return head;
}
//输出链表
void PrintList(LinkList list) {
if (IsEmpty(list)) {
cout << "the list is null" << endl;
return;
}
list = list->next;
while (list != NULL) {
printf("%d ", list->data);
list = list->next;
}
printf("\n");
}
int Getlen(LinkList L) {
int len = 0;
while (L != NULL) {
L = L->next;
len++;
}
return len;
}
#pragma endregion
//P41.13
void Consolidation(LinkList& A, LinkList& B) {
LinkList p1 = A->next, p2 = B->next;
LinkList pre1 = A, pre2 = B;
pre1->next = NULL;
while (p1 != NULL && p2 != NULL) {
if (p1->data <= p2->data) { // 将x节点头插到A中
LinkList r = p1->next;
LNode* x = p1;
x->next = pre1->next;
pre1->next = x;
p1 = r;
}
else {
LinkList r = p2->next;
LNode* x = p2;
x->next = pre1->next;
pre1->next = x;
p2 = r;
}
}
//将剩余的接上
while (p1 != NULL) {
LinkList r = p1->next;
LNode* x = p1;
x->next = pre1->next;
pre1->next = x;
p1 = r;
}
while (p2 != NULL) {
LinkList r = p2->next;
LNode* x = p2;
x->next = pre1->next;
pre1->next = x;
p2 = r;
}
}
int main()
{
vector<int> data1{ 1,3,5,7,9,11 };
vector<int> data2{ 2,4,6,8 };
LinkList A;
InitList(A);
LinkList B;
InitList(B);
A = CreatList(data1);
B = CreatList(data2);
PrintList(A);
PrintList(B);
Consolidation(A,B);
PrintList(A);
return 0;
}

View File

@@ -0,0 +1,124 @@
#include <iostream>
#include <vector>
using namespace std;
//P41.14
//设A和B是两个单链表(带头结点), 其中元素递增有序。设计一个算法从A和B中的
//公共元素产生单链表C, 要求不破坏A、B的结点
#define ElemType int
#define _for(i,a,b) for(int i=(a);i<(b);i++)
#define INF 0x3f3f3f3f
#pragma region 建立带头结点的链表
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化链表
bool InitList(LinkList& L) {
//分配一个头结点
L = (LNode*)malloc(sizeof(LNode));
//内存不足,分配失败
if (L == NULL) {
return false;
}
//头结点之后暂时还没有节点
L->next = NULL;
return true;
}
//判断是否为空
bool IsEmpty(LinkList L) {
return ((L->next) == NULL);
}
//使用尾插法建表
LinkList CreatList(vector<int> data) {
if (data.size() < 1) {
return NULL;
}
//头结点
LNode* head = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
LinkList p = head;
_for(i, 0, data.size()) {
LNode* s = (LinkList)malloc(sizeof(LNode));
s->data = data[i];
s->next = NULL;
p->next = s;
p = s;
}
return head;
}
//输出链表
void PrintList(LinkList list) {
if (IsEmpty(list)) {
cout << "the list is null" << endl;
return;
}
list = list->next;
while (list != NULL) {
printf("%d ", list->data);
list = list->next;
}
printf("\n");
}
int Getlen(LinkList L) {
int len = 0;
while (L != NULL) {
L = L->next;
len++;
}
return len;
}
#pragma endregion
//P41.14
LinkList FindComonList(LinkList& A, LinkList& B) {
LinkList pa = A->next, pb = B->next;
LinkList C= (LinkList)malloc(sizeof(LNode));
C->next = NULL;
LinkList pc = C;
while (pa && pb) {
if (pa->data < pb->data) {
pa = pa->next;
}
else if (pa->data > pb->data) {
pb = pb->next;
}
else{ // 相等
LNode* r = (LNode*)malloc(sizeof(LNode));
r->data = pa->data;
r->next = NULL;
pc->next = r;
pc = r;
pa = pa->next;
pb = pb->next;
}
}
return C;
}
int main()
{
vector<int> data1{ 1,3,5,7,9,11 };
vector<int> data2{ 1,4,5,9 };
LinkList A;
InitList(A);
LinkList B;
InitList(B);
A = CreatList(data1);
B = CreatList(data2);
PrintList(A);
PrintList(B);
LinkList C =FindComonList(A, B);
PrintList(C);
return 0;
}

View File

@@ -0,0 +1,122 @@
#include <iostream>
#include <vector>
using namespace std;
//P41.15
//已知两个链表A和B分别表示两个集合, 其元素递增排列。编制函数, 求A与B的交
//集, 并存放于A链表中
#define ElemType int
#define _for(i,a,b) for(int i=(a);i<(b);i++)
#define INF 0x3f3f3f3f
#pragma region 建立带头结点的链表
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化链表
bool InitList(LinkList& L) {
//分配一个头结点
L = (LNode*)malloc(sizeof(LNode));
//内存不足,分配失败
if (L == NULL) {
return false;
}
//头结点之后暂时还没有节点
L->next = NULL;
return true;
}
//判断是否为空
bool IsEmpty(LinkList L) {
return ((L->next) == NULL);
}
//使用尾插法建表
LinkList CreatList(vector<int> data) {
if (data.size() < 1) {
return NULL;
}
//头结点
LNode* head = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
LinkList p = head;
_for(i, 0, data.size()) {
LNode* s = (LinkList)malloc(sizeof(LNode));
s->data = data[i];
s->next = NULL;
p->next = s;
p = s;
}
return head;
}
//输出链表
void PrintList(LinkList list) {
if (IsEmpty(list)) {
cout << "the list is null" << endl;
return;
}
list = list->next;
while (list != NULL) {
printf("%d ", list->data);
list = list->next;
}
printf("\n");
}
int Getlen(LinkList L) {
int len = 0;
while (L != NULL) {
L = L->next;
len++;
}
return len;
}
#pragma endregion
//P41.14
void GetComonListToA(LinkList& A, LinkList& B) {
LinkList pa = A->next, pb = B->next;
LinkList pre = A;
pre->next = NULL;
while (pa && pb) {
if (pa->data < pb->data) {
pa = pa->next;
}
else if (pa->data > pb->data) {
pb = pb->next;
}
else { // 相等
LNode* r = (LNode*)malloc(sizeof(LNode));
r->data = pa->data;
r->next = NULL;
pre->next = r;
pre = r;
pa = pa->next;
pb = pb->next;
}
}
}
int main()
{
vector<int> data1{ 1,3,5,7,9,11 };
vector<int> data2{ 1,4,5,9 };
LinkList A;
InitList(A);
LinkList B;
InitList(B);
A = CreatList(data1);
B = CreatList(data2);
PrintList(A);
PrintList(B);
GetComonListToA(A, B);
PrintList(A);
return 0;
}