Skip to content

Commit 710839d

Browse files
committed
♻️ 更新习题2.26的注释,顺便将CFree的代码更新为与其他分支一致
1 parent 3030535 commit 710839d

File tree

4 files changed

+153
-122
lines changed

4 files changed

+153
-122
lines changed

CFree/▼配套习题解析/▼02 线性表/▼习题测试文档-02/Question-2.26-main.c

Lines changed: 85 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,96 @@
22
#include "../../../▲课本算法实现/▲01 绪论/Status.h" //**▲01 绪论**//
33
#include "../../../▲课本算法实现/▲02 线性表/04 SinglyLinkedList/SinglyLinkedList.c" //**▲02 线性表**//
44

5-
/* 函数原型 */
6-
Status Algo_2_26(LinkList La, LinkList Lb, LinkList Lc);
7-
5+
/*
6+
* 题2.26
7+
*
8+
* 求交集:C=A∩B,要求新链表另辟空间。
9+
*/
10+
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc);
11+
12+
// 测试函数,打印元素
813
void PrintElem(LElemType_L e);
9-
//测试函数,打印整型
1014

11-
int main(int argc, char *argv[])
12-
{
13-
LinkList La, Lb, Lc;
14-
int i;
15-
16-
if(InitList_L(&La) && InitList_L(&Lb) && InitList_L(&Lc)) //链表创建成功
17-
{
18-
for(i=1; i<=10; i++) //链表赋值
19-
{
20-
ListInsert_L(La, i, i);
21-
ListInsert_L(Lb, i, 2*i);
22-
}
23-
}
24-
25-
printf("La = ");
26-
ListTraverse_L(La, PrintElem); //输出
27-
printf("\n");
28-
printf("Lb = ");
29-
ListTraverse_L(Lb, PrintElem);
30-
printf("\n\n");
31-
32-
Algo_2_26(La, Lb, Lc);
33-
printf("Lc=La∩Lb= ");
34-
ListTraverse_L(Lc, PrintElem);
35-
printf("\n\n");
36-
37-
return 0;
15+
16+
int main(int argc, char* argv[]) {
17+
LinkList La, Lb, Lc;
18+
int i;
19+
20+
// 0号单元存储的是数组长度
21+
int a[] = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
22+
int b[] = {8, 1, 5, 7, 8, 10, 15, 17, 20};
23+
24+
// 准备测试数据,同一表中的元素值各不相同
25+
InitList_L(&La);
26+
InitList_L(&Lb);
27+
for(i = 1; i <= a[0]; i++) {
28+
ListInsert_L(La, i, a[i]);
29+
}
30+
for(i = 1; i <= b[0]; i++) {
31+
ListInsert_L(Lb, i, b[i]);
32+
}
33+
printf("La = ");
34+
ListTraverse_L(La, PrintElem);
35+
printf("\n");
36+
printf("Lb = ");
37+
ListTraverse_L(Lb, PrintElem);
38+
printf("\n");
39+
40+
// 求交集
41+
Algo_2_26(La, Lb, &Lc);
42+
43+
printf("Lc = ");
44+
ListTraverse_L(Lc, PrintElem);
45+
printf("\n");
46+
47+
return 0;
3848
}
3949

40-
/*━━━━━━━┓
41-
┃题2.26:C=A∩B┃
42-
┗━━━━━━━*/
43-
Status Algo_2_26(LinkList La, LinkList Lb, LinkList Lc)
44-
{
45-
LinkList pa, pb, pc, s;
4650

47-
if(!La || !Lb)
48-
return ERROR;
49-
50-
pa = La->next;
51-
pb = Lb->next;
52-
pc = Lc;
53-
54-
while(pa && pb)
55-
{
56-
if(pa->data==pb->data)
57-
{
58-
s = (LinkList)malloc(sizeof(LNode));
59-
if(!s)
60-
exit(OVERFLOW);
61-
s->data = pa->data;
62-
s->next = NULL;
63-
64-
pc->next = s;
65-
66-
pc = pc->next;
67-
pa = pa->next;
68-
pb = pb->next;
69-
}
70-
else if(pa->data<pb->data)
71-
pa = pa->next;
72-
else
73-
pb = pb->next;
74-
}
75-
76-
return OK;
51+
// 求交集:C=A∩B,要求新链表另辟空间。
52+
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
53+
LinkList pa, pb, pc, s;
54+
55+
// 初始化Lc
56+
InitList_L(Lc);
57+
58+
// 确保La和Lb存在
59+
if(La == NULL || Lb == NULL) {
60+
return ERROR;
61+
}
62+
63+
pa = La->next;
64+
pb = Lb->next;
65+
pc = *Lc;
66+
67+
// 只遍历La和Lb的共同部分就行
68+
while(pa != NULL && pb != NULL) {
69+
if(pa->data < pb->data) {
70+
pa = pa->next;
71+
} else if(pa->data > pb->data) {
72+
pb = pb->next;
73+
} else {
74+
// 创建新结点存放交集元素
75+
s = (LinkList) malloc(sizeof(LNode));
76+
if(s == NULL) {
77+
exit(OVERFLOW);
78+
}
79+
s->data = pa->data;
80+
s->next = NULL;
81+
82+
// 将交集元素插入到Lc
83+
pc->next = s;
84+
pc = pc->next;
85+
86+
pa = pa->next;
87+
pb = pb->next;
88+
}
89+
}
90+
91+
return OK;
7792
}
7893

79-
void PrintElem(LElemType_L e)
80-
{
81-
printf("%d ", e);
94+
// 测试函数,打印元素
95+
void PrintElem(LElemType_L e) {
96+
printf("%2d ", e);
8297
}

CLion/ExerciseBook/02.26/02.26.c

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/*
66
* 题2.26
77
*
8-
* 求交集:C=A∩B。
8+
* 求交集:C=A∩B,要求新链表另辟空间
99
*/
1010
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc);
1111

@@ -17,15 +17,18 @@ int main(int argc, char* argv[]) {
1717
LinkList La, Lb, Lc;
1818
int i;
1919

20-
int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12};
21-
int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13};
20+
// 0号单元存储的是数组长度
21+
int a[] = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
22+
int b[] = {8, 1, 5, 7, 8, 10, 15, 17, 20};
2223

23-
// 准备测试数据
24+
// 准备测试数据,同一表中的元素值各不相同
2425
InitList(&La);
2526
InitList(&Lb);
26-
for(i = 1; i <= 10; i++) {
27-
ListInsert(La, i, a[i - 1]);
28-
ListInsert(Lb, i, b[i - 1]);
27+
for(i = 1; i <= a[0]; i++) {
28+
ListInsert(La, i, a[i]);
29+
}
30+
for(i = 1; i <= b[0]; i++) {
31+
ListInsert(Lb, i, b[i]);
2932
}
3033
printf("La = ");
3134
ListTraverse(La, PrintElem);
@@ -41,17 +44,19 @@ int main(int argc, char* argv[]) {
4144
return 0;
4245
}
4346

44-
// 求交集:C=A∩B
47+
48+
// 求交集:C=A∩B,要求新链表另辟空间。
4549
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
4650
LinkList pa, pb, pc, s;
4751

52+
// 初始化Lc
53+
InitList(Lc);
54+
4855
// 确保La和Lb存在
4956
if(La == NULL || Lb == NULL) {
5057
return ERROR;
5158
}
5259

53-
InitList(Lc);
54-
5560
pa = La->next;
5661
pb = Lb->next;
5762
pc = *Lc;
@@ -63,16 +68,16 @@ Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
6368
} else if(pa->data > pb->data) {
6469
pb = pb->next;
6570
} else {
66-
// Lc中元素可能重复
71+
// 创建新结点存放交集元素
6772
s = (LinkList) malloc(sizeof(LNode));
6873
if(s == NULL) {
6974
exit(OVERFLOW);
7075
}
7176
s->data = pa->data;
7277
s->next = NULL;
73-
78+
79+
// 将交集元素插入到Lc
7480
pc->next = s;
75-
7681
pc = pc->next;
7782

7883
pa = pa->next;
@@ -85,5 +90,5 @@ Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
8590

8691
// 测试函数,打印元素
8792
void PrintElem(ElemType e) {
88-
printf("%d ", e);
93+
printf("%2d ", e);
8994
}

Dev-C++/ExerciseBook/02.26/02.26.cpp

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/*
66
* 题2.26
77
*
8-
* 求交集:C=A∩B。
8+
* 求交集:C=A∩B,要求新链表另辟空间
99
*/
1010
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc);
1111

@@ -16,74 +16,80 @@ void PrintElem(ElemType e);
1616
int main(int argc, char* argv[]) {
1717
LinkList La, Lb, Lc;
1818
int i;
19-
20-
int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12};
21-
int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13};
22-
23-
// 准备测试数据
19+
20+
// 0号单元存储的是数组长度
21+
int a[] = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
22+
int b[] = {8, 1, 5, 7, 8, 10, 15, 17, 20};
23+
24+
// 准备测试数据,同一表中的元素值各不相同
2425
InitList(&La);
2526
InitList(&Lb);
26-
for(i = 1; i <= 10; i++) {
27-
ListInsert(La, i, a[i - 1]);
28-
ListInsert(Lb, i, b[i - 1]);
27+
for(i = 1; i <= a[0]; i++) {
28+
ListInsert(La, i, a[i]);
29+
}
30+
for(i = 1; i <= b[0]; i++) {
31+
ListInsert(Lb, i, b[i]);
2932
}
3033
printf("La = ");
3134
ListTraverse(La, PrintElem);
3235
printf("Lb = ");
3336
ListTraverse(Lb, PrintElem);
34-
37+
3538
// 求交集
3639
Algo_2_26(La, Lb, &Lc);
37-
40+
3841
printf("Lc = ");
3942
ListTraverse(Lc, PrintElem);
40-
43+
4144
return 0;
4245
}
4346

44-
// 求交集:C=A∩B
47+
48+
// 求交集:C=A∩B,要求新链表另辟空间。
4549
Status Algo_2_26(LinkList La, LinkList Lb, LinkList* Lc) {
4650
LinkList pa, pb, pc, s;
47-
51+
52+
// 初始化Lc
53+
InitList(Lc);
54+
4855
// 确保La和Lb存在
4956
if(La == NULL || Lb == NULL) {
5057
return ERROR;
5158
}
52-
53-
InitList(Lc);
54-
59+
5560
pa = La->next;
5661
pb = Lb->next;
5762
pc = *Lc;
58-
63+
5964
// 只遍历La和Lb的共同部分就行
6065
while(pa != NULL && pb != NULL) {
6166
if(pa->data < pb->data) {
6267
pa = pa->next;
6368
} else if(pa->data > pb->data) {
6469
pb = pb->next;
6570
} else {
66-
// Lc中元素可能重复
71+
// 创建新结点存放交集元素
6772
s = (LinkList) malloc(sizeof(LNode));
6873
if(s == NULL) {
6974
exit(OVERFLOW);
7075
}
7176
s->data = pa->data;
7277
s->next = NULL;
73-
78+
79+
// 将交集元素插入到Lc
7480
pc->next = s;
75-
7681
pc = pc->next;
77-
82+
7883
pa = pa->next;
7984
pb = pb->next;
8085
}
8186
}
82-
87+
8388
return OK;
8489
}
8590

8691
// 测试函数,打印元素
8792
void PrintElem(ElemType e) {
88-
printf("%d ", e);
93+
printf("%2d ", e);
8994
}
95+

0 commit comments

Comments
 (0)