mirror of
https://github.com/Ruvikm/Wangdao-Data-Structures.git
synced 2026-10-28 19:05:35 +08:00
又做了5道题
This commit is contained in:
113
线性表/链式实现大题/P41.11.cpp
Normal file
113
线性表/链式实现大题/P41.11.cpp
Normal 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;
|
||||
}
|
||||
105
线性表/链式实现大题/P41.12.cpp
Normal file
105
线性表/链式实现大题/P41.12.cpp
Normal 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;
|
||||
}
|
||||
140
线性表/链式实现大题/P41.13.cpp
Normal file
140
线性表/链式实现大题/P41.13.cpp
Normal 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;
|
||||
}
|
||||
124
线性表/链式实现大题/P41.14.cpp
Normal file
124
线性表/链式实现大题/P41.14.cpp
Normal 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;
|
||||
}
|
||||
122
线性表/链式实现大题/P42.15.cpp
Normal file
122
线性表/链式实现大题/P42.15.cpp
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user