mirror of
https://github.com/kangjianwei/Data-Structure.git
synced 2026-02-06 16:31:59 +08:00
♻️ 更新习题2.26的注释,顺便将CFree的代码更新为与其他分支一致
This commit is contained in:
@@ -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.26:C=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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user