diff --git a/线性表/链式实现大题/P41.11.cpp b/线性表/链式实现大题/P41.11.cpp new file mode 100644 index 0000000..90c905d --- /dev/null +++ b/线性表/链式实现大题/P41.11.cpp @@ -0,0 +1,113 @@ +#include +#include +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 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 data{ 1,2,3,4,5,6,7,8 }; + LinkList head; + InitList(head); + head = CreatList(data); + PrintList(head); + Splitting(head); + return 0; +} diff --git a/线性表/链式实现大题/P41.12.cpp b/线性表/链式实现大题/P41.12.cpp new file mode 100644 index 0000000..de20d82 --- /dev/null +++ b/线性表/链式实现大题/P41.12.cpp @@ -0,0 +1,105 @@ +#include +#include +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 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 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; +} diff --git a/线性表/链式实现大题/P41.13.cpp b/线性表/链式实现大题/P41.13.cpp new file mode 100644 index 0000000..5ff14c6 --- /dev/null +++ b/线性表/链式实现大题/P41.13.cpp @@ -0,0 +1,140 @@ +#include +#include +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 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 data1{ 1,3,5,7,9,11 }; + vector 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; +} diff --git a/线性表/链式实现大题/P41.14.cpp b/线性表/链式实现大题/P41.14.cpp new file mode 100644 index 0000000..63b9352 --- /dev/null +++ b/线性表/链式实现大题/P41.14.cpp @@ -0,0 +1,124 @@ +#include +#include +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 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 data1{ 1,3,5,7,9,11 }; + vector 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; +} diff --git a/线性表/链式实现大题/P42.15.cpp b/线性表/链式实现大题/P42.15.cpp new file mode 100644 index 0000000..97434f1 --- /dev/null +++ b/线性表/链式实现大题/P42.15.cpp @@ -0,0 +1,122 @@ +#include +#include +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 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 data1{ 1,3,5,7,9,11 }; + vector 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; +}