♻️ 更新习题2.26的注释,顺便将CFree的代码更新为与其他分支一致

This commit is contained in:
康建伟
2020-03-25 10:46:41 +08:00
parent 30305356f6
commit 710839d37e
4 changed files with 153 additions and 122 deletions

View File

@@ -2,81 +2,96 @@
#include "../../../▲课本算法实现/▲01 绪论/Status.h" //**▲01 绪论**//
#include "../../../▲课本算法实现/▲02 线性表/04 SinglyLinkedList/SinglyLinkedList.c" //**▲02 线性表**//
/* 函数原型 */
Status Algo_2_26(LinkList La, LinkList Lb, LinkList Lc);
/*
* 题2.26
*
* 求交集C=A∩B要求新链表另辟空间。
*/
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc);
// 测试函数,打印元素
void PrintElem(LElemType_L e);
//测试函数,打印整型
int main(int argc, char *argv[])
{
LinkList La, Lb, Lc;
int i;
if(InitList_L(&La) && InitList_L(&Lb) && InitList_L(&Lc)) //链表创建成功
{
for(i=1; i<=10; i++) //链表赋值
{
ListInsert_L(La, i, i);
ListInsert_L(Lb, i, 2*i);
}
}
printf("La = ");
ListTraverse_L(La, PrintElem); //输出
printf("\n");
printf("Lb = ");
ListTraverse_L(Lb, PrintElem);
printf("\n\n");
Algo_2_26(La, Lb, Lc);
printf("Lc=La∩Lb= ");
ListTraverse_L(Lc, PrintElem);
printf("\n\n");
return 0;
int main(int argc, char* argv[]) {
LinkList La, Lb, Lc;
int i;
// 0号单元存储的是数组长度
int a[] = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int b[] = {8, 1, 5, 7, 8, 10, 15, 17, 20};
// 准备测试数据,同一表中的元素值各不相同
InitList_L(&La);
InitList_L(&Lb);
for(i = 1; i <= a[0]; i++) {
ListInsert_L(La, i, a[i]);
}
for(i = 1; i <= b[0]; i++) {
ListInsert_L(Lb, i, b[i]);
}
printf("La = ");
ListTraverse_L(La, PrintElem);
printf("\n");
printf("Lb = ");
ListTraverse_L(Lb, PrintElem);
printf("\n");
// 求交集
Algo_2_26(La, Lb, &Lc);
printf("Lc = ");
ListTraverse_L(Lc, PrintElem);
printf("\n");
return 0;
}
/*━━━━━━━┓
┃题2.26C=A∩B┃
┗━━━━━━━*/
Status Algo_2_26(LinkList La, LinkList Lb, LinkList Lc)
{
LinkList pa, pb, pc, s;
if(!La || !Lb)
return ERROR;
pa = La->next;
pb = Lb->next;
pc = Lc;
while(pa && pb)
{
if(pa->data==pb->data)
{
s = (LinkList)malloc(sizeof(LNode));
if(!s)
exit(OVERFLOW);
s->data = pa->data;
s->next = NULL;
pc->next = s;
pc = pc->next;
pa = pa->next;
pb = pb->next;
}
else if(pa->data<pb->data)
pa = pa->next;
else
pb = pb->next;
}
return OK;
// 求交集C=A∩B要求新链表另辟空间。
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
LinkList pa, pb, pc, s;
// 初始化Lc
InitList_L(Lc);
// 确保La和Lb存在
if(La == NULL || Lb == NULL) {
return ERROR;
}
pa = La->next;
pb = Lb->next;
pc = *Lc;
// 只遍历La和Lb的共同部分就行
while(pa != NULL && pb != NULL) {
if(pa->data < pb->data) {
pa = pa->next;
} else if(pa->data > pb->data) {
pb = pb->next;
} else {
// 创建新结点存放交集元素
s = (LinkList) malloc(sizeof(LNode));
if(s == NULL) {
exit(OVERFLOW);
}
s->data = pa->data;
s->next = NULL;
// 将交集元素插入到Lc
pc->next = s;
pc = pc->next;
pa = pa->next;
pb = pb->next;
}
}
return OK;
}
void PrintElem(LElemType_L e)
{
printf("%d ", e);
// 测试函数,打印元素
void PrintElem(LElemType_L e) {
printf("%2d ", e);
}

View File

@@ -5,7 +5,7 @@
/*
* 题2.26
*
* 求交集C=A∩B。
* 求交集C=A∩B,要求新链表另辟空间
*/
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc);
@@ -17,15 +17,18 @@ int main(int argc, char* argv[]) {
LinkList La, Lb, Lc;
int i;
int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12};
int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13};
// 0号单元存储的是数组长度
int a[] = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int b[] = {8, 1, 5, 7, 8, 10, 15, 17, 20};
// 准备测试数据
// 准备测试数据,同一表中的元素值各不相同
InitList(&La);
InitList(&Lb);
for(i = 1; i <= 10; i++) {
ListInsert(La, i, a[i - 1]);
ListInsert(Lb, i, b[i - 1]);
for(i = 1; i <= a[0]; i++) {
ListInsert(La, i, a[i]);
}
for(i = 1; i <= b[0]; i++) {
ListInsert(Lb, i, b[i]);
}
printf("La = ");
ListTraverse(La, PrintElem);
@@ -41,17 +44,19 @@ int main(int argc, char* argv[]) {
return 0;
}
// 求交集C=A∩B
// 求交集C=A∩B要求新链表另辟空间。
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
LinkList pa, pb, pc, s;
// 初始化Lc
InitList(Lc);
// 确保La和Lb存在
if(La == NULL || Lb == NULL) {
return ERROR;
}
InitList(Lc);
pa = La->next;
pb = Lb->next;
pc = *Lc;
@@ -63,16 +68,16 @@ Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
} else if(pa->data > pb->data) {
pb = pb->next;
} else {
// Lc中元素可能重复
// 创建新结点存放交集元素
s = (LinkList) malloc(sizeof(LNode));
if(s == NULL) {
exit(OVERFLOW);
}
s->data = pa->data;
s->next = NULL;
// 将交集元素插入到Lc
pc->next = s;
pc = pc->next;
pa = pa->next;
@@ -85,5 +90,5 @@ Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
// 测试函数,打印元素
void PrintElem(ElemType e) {
printf("%d ", e);
printf("%2d ", e);
}

View File

@@ -5,7 +5,7 @@
/*
* 题2.26
*
* 求交集C=A∩B。
* 求交集C=A∩B,要求新链表另辟空间
*/
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc);
@@ -16,46 +16,51 @@ void PrintElem(ElemType e);
int main(int argc, char* argv[]) {
LinkList La, Lb, Lc;
int i;
int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12};
int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13};
// 准备测试数据
// 0号单元存储的是数组长度
int a[] = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int b[] = {8, 1, 5, 7, 8, 10, 15, 17, 20};
// 准备测试数据,同一表中的元素值各不相同
InitList(&La);
InitList(&Lb);
for(i = 1; i <= 10; i++) {
ListInsert(La, i, a[i - 1]);
ListInsert(Lb, i, b[i - 1]);
for(i = 1; i <= a[0]; i++) {
ListInsert(La, i, a[i]);
}
for(i = 1; i <= b[0]; i++) {
ListInsert(Lb, i, b[i]);
}
printf("La = ");
ListTraverse(La, PrintElem);
printf("Lb = ");
ListTraverse(Lb, PrintElem);
// 求交集
Algo_2_26(La, Lb, &Lc);
printf("Lc = ");
ListTraverse(Lc, PrintElem);
return 0;
}
// 求交集C=A∩B
// 求交集C=A∩B要求新链表另辟空间。
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
LinkList pa, pb, pc, s;
// 初始化Lc
InitList(Lc);
// 确保La和Lb存在
if(La == NULL || Lb == NULL) {
return ERROR;
}
InitList(Lc);
pa = La->next;
pb = Lb->next;
pc = *Lc;
// 只遍历La和Lb的共同部分就行
while(pa != NULL && pb != NULL) {
if(pa->data < pb->data) {
@@ -63,27 +68,28 @@ Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
} else if(pa->data > pb->data) {
pb = pb->next;
} else {
// Lc中元素可能重复
// 创建新结点存放交集元素
s = (LinkList) malloc(sizeof(LNode));
if(s == NULL) {
exit(OVERFLOW);
}
s->data = pa->data;
s->next = NULL;
// 将交集元素插入到Lc
pc->next = s;
pc = pc->next;
pa = pa->next;
pb = pb->next;
}
}
return OK;
}
// 测试函数,打印元素
void PrintElem(ElemType e) {
printf("%d ", e);
printf("%2d ", e);
}

View File

@@ -5,7 +5,7 @@
/*
* 题2.26
*
* 求交集C=A∩B。
* 求交集C=A∩B,要求新链表另辟空间
*/
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc);
@@ -17,15 +17,18 @@ int main(int argc, char* argv[]) {
LinkList La, Lb, Lc;
int i;
int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12};
int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13};
// 0号单元存储的是数组长度
int a[] = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int b[] = {8, 1, 5, 7, 8, 10, 15, 17, 20};
// 准备测试数据
// 准备测试数据,同一表中的元素值各不相同
InitList(&La);
InitList(&Lb);
for(i = 1; i <= 10; i++) {
ListInsert(La, i, a[i - 1]);
ListInsert(Lb, i, b[i - 1]);
for(i = 1; i <= a[0]; i++) {
ListInsert(La, i, a[i]);
}
for(i = 1; i <= b[0]; i++) {
ListInsert(Lb, i, b[i]);
}
printf("La = ");
ListTraverse(La, PrintElem);
@@ -41,17 +44,19 @@ int main(int argc, char* argv[]) {
return 0;
}
// 求交集C=A∩B
// 求交集C=A∩B要求新链表另辟空间。
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
LinkList pa, pb, pc, s;
// 初始化Lc
InitList(Lc);
// 确保La和Lb存在
if(La == NULL || Lb == NULL) {
return ERROR;
}
InitList(Lc);
pa = La->next;
pb = Lb->next;
pc = *Lc;
@@ -63,16 +68,16 @@ Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
} else if(pa->data > pb->data) {
pb = pb->next;
} else {
// Lc中元素可能重复
// 创建新结点存放交集元素
s = (LinkList) malloc(sizeof(LNode));
if(s == NULL) {
exit(OVERFLOW);
}
s->data = pa->data;
s->next = NULL;
// 将交集元素插入到Lc
pc->next = s;
pc = pc->next;
pa = pa->next;
@@ -85,5 +90,5 @@ Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
// 测试函数,打印元素
void PrintElem(ElemType e) {
printf("%d ", e);
printf("%2d ", e);
}