From d3a731b617807aeb2f0df80588153bf4940dfb36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=B7=E5=BB=BA=E4=BC=9F?= Date: Thu, 7 Nov 2019 12:16:00 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20=E6=9B=B4=E6=96=B0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE=E7=9A=84=E5=BD=95=E5=85=A5=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CourseBook/0204_LinkList/LinkList-main.c | 4 +- CLion/CourseBook/0204_LinkList/LinkList.c | 158 ++++++++++------ CLion/CourseBook/0204_LinkList/LinkList.h | 23 ++- CLion/CourseBook/0205_MergeList/LinkList.c | 158 ++++++++++------ CLion/CourseBook/0205_MergeList/LinkList.h | 23 ++- .../0205_MergeList/MergeList-main.c | 8 +- .../0207_Difference/Difference-main.c | 4 +- CLion/CourseBook/0207_Difference/Difference.c | 66 +++++-- CLion/CourseBook/0207_Difference/Difference.h | 15 +- .../0210_MergeEList/MergeEList-main.c | 75 +++++--- .../0211_Polynomial/Polynomial-main.c | 17 +- CLion/CourseBook/0211_Polynomial/Polynomial.c | 64 +++++-- CLion/CourseBook/0211_Polynomial/Polynomial.h | 13 +- .../0204_LinkList/LinkList-main.cpp | 4 +- Dev-C++/CourseBook/0204_LinkList/LinkList.cpp | 179 +++++++++++------- Dev-C++/CourseBook/0204_LinkList/LinkList.h | 23 ++- .../CourseBook/0205_MergeList/LinkList.cpp | 179 +++++++++++------- Dev-C++/CourseBook/0205_MergeList/LinkList.h | 24 ++- .../0205_MergeList/MergeList-main.cpp | 20 +- .../0207_Difference/Difference-main.cpp | 9 +- .../CourseBook/0207_Difference/Difference.cpp | 97 +++++++--- .../CourseBook/0207_Difference/Difference.h | 16 +- .../0210_MergeEList/MergeEList-main.cpp | 88 ++++++--- .../0211_Polynomial/Polynomial-main.cpp | 46 ++--- .../CourseBook/0211_Polynomial/Polynomial.cpp | 179 ++++++++++-------- .../CourseBook/0211_Polynomial/Polynomial.h | 14 +- .../CourseBook/0204_LinkList/LinkList-main.c | 4 +- VisualC++/CourseBook/0204_LinkList/LinkList.c | 158 ++++++++++------ VisualC++/CourseBook/0204_LinkList/LinkList.h | 23 ++- .../CourseBook/0205_MergeList/LinkList.c | 158 ++++++++++------ .../CourseBook/0205_MergeList/LinkList.h | 23 ++- .../0205_MergeList/MergeList-main.c | 8 +- .../0207_Difference/Difference-main.c | 4 +- .../CourseBook/0207_Difference/Difference.c | 66 +++++-- .../CourseBook/0207_Difference/Difference.h | 15 +- .../0210_MergeEList/MergeEList-main.c | 75 +++++--- .../0211_Polynomial/Polynomial-main.c | 16 +- .../CourseBook/0211_Polynomial/Polynomial.c | 46 ++++- .../CourseBook/0211_Polynomial/Polynomial.h | 13 +- VisualC++/CourseBook/CourseBook.sdf | Bin 3493888 -> 3493888 bytes VisualC++/CourseBook/CourseBook.suo | Bin 90624 -> 91648 bytes 41 files changed, 1399 insertions(+), 716 deletions(-) diff --git a/CLion/CourseBook/0204_LinkList/LinkList-main.c b/CLion/CourseBook/0204_LinkList/LinkList-main.c index c991473..ea2c584 100644 --- a/CLion/CourseBook/0204_LinkList/LinkList-main.c +++ b/CLion/CourseBook/0204_LinkList/LinkList-main.c @@ -149,8 +149,8 @@ int main(int argc, char** argv) { printf("████████ CreateList_Head \n"); { LinkList L; + CreateList_Head(&L, 5, "TestData_Head.txt"); printf("█ 头插法建立单链表 L = "); - CreateList_Head("TestData_Head.txt", &L, 5); ListTraverse(L, PrintElem); } PressEnterToContinue(); @@ -159,8 +159,8 @@ int main(int argc, char** argv) { printf("████████ CreateList_Tail \n"); { LinkList L; + CreateList_Tail(&L, 5, "TestData_Tail.txt"); printf("█ 尾插法建立单链表 L = "); - CreateList_Tail("TestData_Tail.txt", &L, 5); ListTraverse(L, PrintElem); } PressEnterToContinue(); diff --git a/CLion/CourseBook/0204_LinkList/LinkList.c b/CLion/CourseBook/0204_LinkList/LinkList.c index 276c17e..ab8643d 100644 --- a/CLion/CourseBook/0204_LinkList/LinkList.c +++ b/CLion/CourseBook/0204_LinkList/LinkList.c @@ -384,105 +384,149 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)) { * * 头插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 - * 另教材中的算法采用的是头插法,所以此处的实现加了后缀_Head。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Head(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Head(LinkList* L, int n, ...) { int i; LinkList p; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // 是否从控制台读取数据 - // 建立头结点 - *L = (LinkList) malloc(sizeof(LNode)); - if(*L == NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // 打开文件,准备读取测试数据 - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1; i <= n; ++i) { - // 如果成功读取到输入数据 - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("请输入%d个降序元素:", n); + + for(i = 1; i <= n; ++i) { // 生成新结点 p = (LinkList) malloc(sizeof(LNode)); - if(p == NULL) { - fclose(fp); - exit(OVERFLOW); - } // 填充数据,并插入到链表中 - p->data = e; + scanf("%d", &(p->data)); + p->next = (*L)->next; (*L)->next = p; - } else { - fclose(fp); + } + } else { + // 打开文件,准备读取测试数据 + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1; i <= n; ++i) { + // 生成新结点 + p = (LinkList) malloc(sizeof(LNode)); + + // 填充数据,并插入到链表中 + ReadData(fp, "%d", &(p->data)); + + p->next = (*L)->next; + (*L)->next = p; + } + + fclose(fp); } - fclose(fp); - return OK; } /* * 尾插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Tail(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Tail(LinkList* L, int n, ...) { int i; LinkList p, q; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // 是否从控制台读取数据 - // 建立头结点 - *L = (LinkList) malloc(sizeof(LNode)); - if(*L==NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // 打开文件,准备读取测试数据 - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1, q = *L; i <= n; ++i) { - // 如果成功读取到输入数据 - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("请输入%d个升序元素:", n); + + for(i = 1, q = *L; i <= n; ++i) { + // 生成新结点 p = (LinkList) malloc(sizeof(LNode)); - if(p==NULL) { - fclose(fp); - exit(OVERFLOW); - } // 填充数据,并插入到链表中 - p->data = e; + scanf("%d", &(p->data)); + q->next = p; q = q->next; - } else { - fclose(fp); + } + + q->next = NULL; + } else { + // 打开文件,准备读取测试数据 + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1, q = *L; i <= n; ++i) { + // 生成新结点 + p = (LinkList) malloc(sizeof(LNode)); + + // 填充数据,并插入到链表中 + ReadData(fp, "%d", &(p->data)); + + q->next = p; + q = q->next; + } + + q->next = NULL; + + fclose(fp); } - q->next = NULL; - - fclose(fp); - return OK; } diff --git a/CLion/CourseBook/0204_LinkList/LinkList.h b/CLion/CourseBook/0204_LinkList/LinkList.h index 8880c2a..39824b2 100644 --- a/CLion/CourseBook/0204_LinkList/LinkList.h +++ b/CLion/CourseBook/0204_LinkList/LinkList.h @@ -8,7 +8,9 @@ #define LINKLIST_H #include -#include //提供malloc、realloc、free、exit原型 +#include // 提供 malloc、realloc、free、exit 原型 +#include // 提供 strstr 原型 +#include // 提供宏va_list、va_start、va_arg、va_end #include "Status.h" //**▲01 绪论**// /* 单链表元素类型定义 */ @@ -147,22 +149,31 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)); * * 头插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 - * 另教材中的算法采用的是头插法,所以此处的实现加了后缀_Head。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Head(char path[], LinkList* L, int n); +Status CreateList_Head(LinkList* L, int n, ...); /* * 尾插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Tail(char path[], LinkList* L, int n); +Status CreateList_Tail(LinkList* L, int n, ...); #endif diff --git a/CLion/CourseBook/0205_MergeList/LinkList.c b/CLion/CourseBook/0205_MergeList/LinkList.c index 11c3c2a..a533622 100644 --- a/CLion/CourseBook/0205_MergeList/LinkList.c +++ b/CLion/CourseBook/0205_MergeList/LinkList.c @@ -34,105 +34,149 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)) { * * 头插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 - * 另教材中的算法采用的是头插法,所以此处的实现加了后缀_Head。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Head(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Head(LinkList* L, int n, ...) { int i; LinkList p; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // 是否从控制台读取数据 - // 建立头结点 - *L = (LinkList) malloc(sizeof(LNode)); - if(*L == NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // 打开文件,准备读取测试数据 - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1; i <= n; ++i) { - // 如果成功读取到输入数据 - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("请输入%d个降序元素:", n); + + for(i = 1; i <= n; ++i) { // 生成新结点 p = (LinkList) malloc(sizeof(LNode)); - if(p == NULL) { - fclose(fp); - exit(OVERFLOW); - } // 填充数据,并插入到链表中 - p->data = e; + scanf("%d", &(p->data)); + p->next = (*L)->next; (*L)->next = p; - } else { - fclose(fp); + } + } else { + // 打开文件,准备读取测试数据 + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1; i <= n; ++i) { + // 生成新结点 + p = (LinkList) malloc(sizeof(LNode)); + + // 填充数据,并插入到链表中 + ReadData(fp, "%d", &(p->data)); + + p->next = (*L)->next; + (*L)->next = p; + } + + fclose(fp); } - fclose(fp); - return OK; } /* * 尾插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Tail(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Tail(LinkList* L, int n, ...) { int i; LinkList p, q; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // 是否从控制台读取数据 - // 建立头结点 - *L = (LinkList) malloc(sizeof(LNode)); - if(*L==NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // 打开文件,准备读取测试数据 - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1, q = *L; i <= n; ++i) { - // 如果成功读取到输入数据 - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("请输入%d个升序元素:", n); + + for(i = 1, q = *L; i <= n; ++i) { + // 生成新结点 p = (LinkList) malloc(sizeof(LNode)); - if(p==NULL) { - fclose(fp); - exit(OVERFLOW); - } // 填充数据,并插入到链表中 - p->data = e; + scanf("%d", &(p->data)); + q->next = p; q = q->next; - } else { - fclose(fp); + } + + q->next = NULL; + } else { + // 打开文件,准备读取测试数据 + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // 建立头结点 + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1, q = *L; i <= n; ++i) { + // 生成新结点 + p = (LinkList) malloc(sizeof(LNode)); + + // 填充数据,并插入到链表中 + ReadData(fp, "%d", &(p->data)); + + q->next = p; + q = q->next; + } + + q->next = NULL; + + fclose(fp); } - q->next = NULL; - - fclose(fp); - return OK; } diff --git a/CLion/CourseBook/0205_MergeList/LinkList.h b/CLion/CourseBook/0205_MergeList/LinkList.h index 079a7f6..e372f48 100644 --- a/CLion/CourseBook/0205_MergeList/LinkList.h +++ b/CLion/CourseBook/0205_MergeList/LinkList.h @@ -8,7 +8,9 @@ #define LINKLIST_H #include -#include //提供malloc、realloc、free、exit原型 +#include // 提供malloc、realloc、free、exit原型 +#include // 提供 strstr 原型 +#include // 提供宏va_list、va_start、va_arg、va_end #include "Status.h" //**▲01 绪论**// /* 单链表元素类型定义 */ @@ -40,22 +42,31 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)); * * 头插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 - * 另教材中的算法采用的是头插法,所以此处的实现加了后缀_Head。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Head(char path[], LinkList* L, int n); +Status CreateList_Head(LinkList* L, int n, ...); /* * 尾插法创建链表 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -Status CreateList_Tail(char path[], LinkList* L, int n); +Status CreateList_Tail(LinkList* L, int n, ...); #endif diff --git a/CLion/CourseBook/0205_MergeList/MergeList-main.c b/CLion/CourseBook/0205_MergeList/MergeList-main.c index cb1a203..8756356 100644 --- a/CLion/CourseBook/0205_MergeList/MergeList-main.c +++ b/CLion/CourseBook/0205_MergeList/MergeList-main.c @@ -10,15 +10,15 @@ void PrintElem(ElemType e) { int main(int argc, char** argv) { LinkList La, Lb, Lc; - int m = 5; + int n = 5; - printf("作为示例,La长度设定为 %d ,Lb长度设定为 %d ,创建La和Lb...\n", m, m); + printf("作为示例,La长度设定为 %d ,Lb长度设定为 %d ,创建La和Lb...\n", n, n); - CreateList_Head("TestData_Head.txt", &La, m); + CreateList_Head(&La, n, "TestData_Head.txt"); printf("La = "); ListTraverse(La, PrintElem); - CreateList_Tail("TestData_Tail.txt", &Lb, m); + CreateList_Tail(&Lb, n, "TestData_Tail.txt"); printf("Lb = "); ListTraverse(Lb, PrintElem); diff --git a/CLion/CourseBook/0207_Difference/Difference-main.c b/CLion/CourseBook/0207_Difference/Difference-main.c index b7909d0..f805d7e 100644 --- a/CLion/CourseBook/0207_Difference/Difference-main.c +++ b/CLion/CourseBook/0207_Difference/Difference-main.c @@ -11,8 +11,10 @@ int main(int argc, char** argv) { SLinkList space; // 备用空间 int S; // 静态链表 + // S = (A-B)∪(B-A) + difference(space, &S, "TestData.txt"); + printf("S = (A-B)∪(B-A) = "); - difference("TestData.txt", space, &S); ListTraverse(space, S, PrintElem); return 0; diff --git a/CLion/CourseBook/0207_Difference/Difference.c b/CLion/CourseBook/0207_Difference/Difference.c index a630664..0caf549 100644 --- a/CLion/CourseBook/0207_Difference/Difference.c +++ b/CLion/CourseBook/0207_Difference/Difference.c @@ -13,18 +13,33 @@ * * 对集合A和集合B进行(A-B)∪(B-A)计算,计算结果存入静态链表S * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -void difference(char path[], SLinkList space, int* S) { - FILE* fp; +void difference(SLinkList space, int* S, ...) { int m, n; // 集合A和集合B中元素数量 int j; // 循环计数器 int R; // 指向静态链表最后一个结点 int i, k, p; int b; // 临时存储从集合B中读到的数据 + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // 是否从控制台读取数据 + + va_start(ap, S); + path = va_arg(ap, char*); + va_end(ap); + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; // 初始化备用空间 InitSpace(space); @@ -35,14 +50,25 @@ void difference(char path[], SLinkList space, int* S) { // 让R执行静态链表最后的结点 R = *S; - // 打开文件,准备读取测试数据 - fp = fopen(path, "r"); - if(fp == NULL) { - exit(ERROR); + // 读取集合A和集合B的元素个数 + if(readFromConsole) { + printf("请输入集合A的元素个数:"); + scanf("%d", &m); + printf("请输入集合B的元素个数:"); + scanf("%d", &n); + } else { + // 打开文件,准备读取测试数据 + fp = fopen(path, "r"); + if(fp == NULL) { + exit(ERROR); + } + + ReadData(fp, "%d%d", &m, &n); } - // 读取集合A和集合B的元素个数 - ReadData(fp, "%d%d", &m, &n); + if(readFromConsole) { + printf("请输入 %d 个元素存入集合A:", m); + } // 录入集合A的数据 for(j = 1; j <= m; ++j) { @@ -50,7 +76,11 @@ void difference(char path[], SLinkList space, int* S) { i = Malloc(space); // 输入集合A的元素值 - ReadData(fp, "%d", &space[i].data); + if(readFromConsole) { + scanf("%d", &space[i].data); + } else { + ReadData(fp, "%d", &space[i].data); + } // 将新结点插入到表尾 space[R].cur = i; @@ -60,10 +90,18 @@ void difference(char path[], SLinkList space, int* S) { // 尾结点的指针置空 space[R].cur = 0; + if(readFromConsole) { + printf("请输入 %d 个元素存入集合B:", n); + } + // 录入集合B的数据 for(j = 1; j <= n; ++j) { // 输入集合B的元素值 - ReadData(fp, "%d", &b); + if(readFromConsole) { + scanf("%d", &b); + } else { + ReadData(fp, "%d", &b); + } p = *S; // 指向静态链表头结点,后续总是指向k的前一个位置 k = space[*S].cur; // 指向静态链表中的首个元素 @@ -91,5 +129,7 @@ void difference(char path[], SLinkList space, int* S) { } } - fclose(fp); -} \ No newline at end of file + if(!readFromConsole) { + fclose(fp); + } +} diff --git a/CLion/CourseBook/0207_Difference/Difference.h b/CLion/CourseBook/0207_Difference/Difference.h index 06c816c..0ccad94 100644 --- a/CLion/CourseBook/0207_Difference/Difference.h +++ b/CLion/CourseBook/0207_Difference/Difference.h @@ -8,8 +8,10 @@ #define DIFFERENCE_H #include -#include "Status.h" //**▲01 绪论**// -#include "SLinkList.h" //**▲02 线性表**// +#include // 提供 strstr 原型 +#include // 提供宏va_list、va_start、va_arg、va_end +#include "Status.h" //**▲01 绪论**// +#include "SLinkList.h" //**▲02 线性表**// /* * ████████ 算法2.17 ████████ @@ -18,11 +20,16 @@ * * 对集合A和集合B进行(A-B)∪(B-A)计算,计算结果存入静态链表S * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -void difference(char path[], SLinkList space, int* S); +void difference(SLinkList space, int* S, ...); #endif diff --git a/CLion/CourseBook/0210_MergeEList/MergeEList-main.c b/CLion/CourseBook/0210_MergeEList/MergeEList-main.c index dfc2a84..c84baf0 100644 --- a/CLion/CourseBook/0210_MergeEList/MergeEList-main.c +++ b/CLion/CourseBook/0210_MergeEList/MergeEList-main.c @@ -1,5 +1,7 @@ #include -#include "MergeEList.h" //**▲02 线性表**// +#include // 提供 strstr 原型 +#include // 提供宏va_list、va_start、va_arg、va_end +#include "MergeEList.h" //**▲02 线性表**// // 测试函数,打印元素 void PrintElem(ElemType e) { @@ -21,32 +23,61 @@ int Cmp(ElemType e1, ElemType e2) { /* * 尾插法创建链表 * + * *【备注】 + * * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件fp中读取测试数据。 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -void CreateList_Tail(char path[], ELinkList* L) { - FILE* fp; +void CreateList_Tail(ELinkList* L, ...) { int i, n; ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // 是否从控制台读取数据 - fp = fopen(path, "r"); - if(fp == NULL) { - printf("文件打开失败...\n"); - exit(ERROR); + va_start(ap, L); + path = va_arg(ap, char*); + va_end(ap); + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + + if(readFromConsole) { + // 读取指定集合中元素的数量 + printf("请输入元素数量:"); + scanf("%d", &n); + + InitList(L); + + printf("请输入 %d 个元素:", n); + for(i = 1; i <= n; i++) { + scanf("%d", &e); + ListInsert(L, i, e); + } + } else { + fp = fopen(path, "r"); + if(fp == NULL) { + printf("文件打开失败...\n"); + exit(ERROR); + } + + // 读取指定集合中元素的数量 + ReadData(fp, "%d", &n); + + InitList(L); + + for(i = 1; i <= n; i++) { + ReadData(fp, "%d", &e); + ListInsert(L, i, e); + } + + fclose(fp); } - - // 读取指定集合中元素的数量 - ReadData(fp, "%d", &n); - - InitList(L); - - for(i = 1; i <= n; i++) { - ReadData(fp, "%d", &e); - ListInsert(L, i, e); - } - - fclose(fp); } @@ -55,11 +86,11 @@ int main(int argc, char** argv) { printf("创建La和Lb以待测试...\n"); - CreateList_Tail("TestData_La.txt", &La); + CreateList_Tail(&La, "TestData_La.txt"); printf("La= "); ListTraverse(La, PrintElem); - CreateList_Tail("TestData_Lb.txt", &Lb); + CreateList_Tail(&Lb, "TestData_Lb.txt"); printf("Lb= "); ListTraverse(Lb, PrintElem); diff --git a/CLion/CourseBook/0211_Polynomial/Polynomial-main.c b/CLion/CourseBook/0211_Polynomial/Polynomial-main.c index ff14ee8..ebe78e2 100644 --- a/CLion/CourseBook/0211_Polynomial/Polynomial-main.c +++ b/CLion/CourseBook/0211_Polynomial/Polynomial-main.c @@ -10,10 +10,10 @@ int main(int argc, char **argv) { printf("████████ CreatPolyn \n"); { printf("█ 作为示范,创建项数为 %d 的多项式Pa...\n", m); - CreatPolyn("TestData_Pa.txt", &Pa, m); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); printf("█ 作为示范,创建项数为 %d 的多项式Pb...\n", n); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); } PressEnterToContinue(); @@ -38,8 +38,8 @@ int main(int argc, char **argv) { printf("████████ AddPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); AddPolyn(&Pa, &Pb); @@ -51,8 +51,8 @@ int main(int argc, char **argv) { printf("████████ SubtractPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); SubtractPolyn(&Pa, &Pb); @@ -64,8 +64,8 @@ int main(int argc, char **argv) { printf("████████ MultiplyPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); MultiplyPolyn(&Pa, &Pb); @@ -76,4 +76,3 @@ int main(int argc, char **argv) { return 0; } - diff --git a/CLion/CourseBook/0211_Polynomial/Polynomial.c b/CLion/CourseBook/0211_Polynomial/Polynomial.c index 954b507..5da9dfd 100644 --- a/CLion/CourseBook/0211_Polynomial/Polynomial.c +++ b/CLion/CourseBook/0211_Polynomial/Polynomial.c @@ -16,17 +16,32 @@ * * 根据输入的系数和指数,创建项数为m的一元多项式 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -void CreatPolyn(char path[], Polynomial* P, int m) { - FILE* fp; +void CreatPolyn(Polynomial* P, int m, ...) { int i; ElemType e; Position h, q; Link s; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // 是否从控制台读取数据 + + va_start(ap, m); + path = va_arg(ap, char*); + va_end(ap); + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; // 初始化一个线性链表存放一元多项式 InitList(P); @@ -39,16 +54,27 @@ void CreatPolyn(char path[], Polynomial* P, int m) { e.expn = -1; SetCurElem(h, e); - // 打开文件,准备读取测试数据 - fp = fopen(path, "r"); - if(fp == NULL) { - exit(ERROR); + if(!readFromConsole) { + // 打开文件,准备读取测试数据 + fp = fopen(path, "r"); + if(fp == NULL) { + exit(ERROR); + } + } + + if(readFromConsole) { + printf("请输入 %d 个元素:\n", m); } // 依次录入m个有效项 for(i = 1; i <= m; i++) { // 读取系数和指数信息,临时存入e - ReadData(fp, "%f%d", &(e.coef), &(e.expn)); + if(readFromConsole) { + printf("请输入第 %d 组系数和指数:", i); + scanf("%f%d", &(e.coef), &(e.expn)); + } else { + ReadData(fp, "%f%d", &(e.coef), &(e.expn)); + } // 如果当前链表中不存在该指数项 if(LocateElem(*P, e, &q, Cmp) == FALSE && q != NULL) { @@ -60,7 +86,9 @@ void CreatPolyn(char path[], Polynomial* P, int m) { } } - fclose(fp); + if(!readFromConsole) { + fclose(fp); + } } /* @@ -116,9 +144,9 @@ void AddPolyn(Polynomial* Pa, Polynomial* Pb) { ha = qa; qa = NextPos(*Pa, qa); } - break; + break; - // 两者数值相等 + // 两者数值相等 case 0: { sum = a.coef + b.coef; @@ -146,9 +174,9 @@ void AddPolyn(Polynomial* Pa, Polynomial* Pb) { qa = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; + break; - // 多项式Pb中当前结点的指数值较小 + // 多项式Pb中当前结点的指数值较小 case 1: { // 摘下Pb当前结点 DelFirst(Pb, hb, &qb); @@ -159,7 +187,7 @@ void AddPolyn(Polynomial* Pa, Polynomial* Pb) { ha = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; + break; }//switch }//while @@ -212,7 +240,7 @@ void SubtractPolyn(Polynomial* Pa, Polynomial* Pb) { } break; - // 两者数值相等 + // 两者数值相等 case 0: { sum = a.coef - b.coef; @@ -240,9 +268,9 @@ void SubtractPolyn(Polynomial* Pa, Polynomial* Pb) { qa = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; + break; - // 多项式Pb中当前结点的指数值较小 + // 多项式Pb中当前结点的指数值较小 case 1: { // 摘下Pb当前结点 DelFirst(Pb, hb, &qb); @@ -256,7 +284,7 @@ void SubtractPolyn(Polynomial* Pa, Polynomial* Pb) { ha = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; + break; }//switch }//while diff --git a/CLion/CourseBook/0211_Polynomial/Polynomial.h b/CLion/CourseBook/0211_Polynomial/Polynomial.h index 2f533db..efdcf7f 100644 --- a/CLion/CourseBook/0211_Polynomial/Polynomial.h +++ b/CLion/CourseBook/0211_Polynomial/Polynomial.h @@ -8,7 +8,9 @@ #define POLYNOMIAL_H #include -#include //提供malloc、realloc、free、exit原型 +#include // 提供malloc、realloc、free、exit原型 +#include // 提供 strstr 原型 +#include // 提供宏va_list、va_start、va_arg、va_end #include "ELinkList.h" //**▲02 线性表**// /* 一元多项式类型定义 */ @@ -24,12 +26,17 @@ typedef ELinkList Polynomial; * * 根据输入的系数和指数,创建项数为m的一元多项式 * + * *【备注】 + * * 教材中默认从控制台读取数据。 * 这里为了方便测试,避免每次运行都手动输入数据, - * 因而选择了从预设的文件path中读取测试数据 + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则不需要填写可变参数, + * 如果需要从文件中读取数据,则需要在可变参数中填写文件名信息(文件名中需要包含子串"TestData")。 */ -void CreatPolyn(char path[], Polynomial *P, int m); +void CreatPolyn(Polynomial* P, int m, ...); /* * 销毁 diff --git a/Dev-C++/CourseBook/0204_LinkList/LinkList-main.cpp b/Dev-C++/CourseBook/0204_LinkList/LinkList-main.cpp index c2790e2..f9eddbb 100644 --- a/Dev-C++/CourseBook/0204_LinkList/LinkList-main.cpp +++ b/Dev-C++/CourseBook/0204_LinkList/LinkList-main.cpp @@ -149,8 +149,8 @@ int main(int argc, char** argv) { printf(" CreateList_Head \n"); { LinkList L; + CreateList_Head(&L, 5, "TestData_Head.txt"); printf(" ͷ巨 L = "); - CreateList_Head("TestData_Head.txt", &L, 5); ListTraverse(L, PrintElem); } PressEnterToContinue(); @@ -159,8 +159,8 @@ int main(int argc, char** argv) { printf(" CreateList_Tail \n"); { LinkList L; + CreateList_Tail(&L, 5, "TestData_Tail.txt"); printf(" β巨 L = "); - CreateList_Tail("TestData_Tail.txt", &L, 5); ListTraverse(L, PrintElem); } PressEnterToContinue(); diff --git a/Dev-C++/CourseBook/0204_LinkList/LinkList.cpp b/Dev-C++/CourseBook/0204_LinkList/LinkList.cpp index d87e5b5..cae6434 100644 --- a/Dev-C++/CourseBook/0204_LinkList/LinkList.cpp +++ b/Dev-C++/CourseBook/0204_LinkList/LinkList.cpp @@ -384,105 +384,150 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)) { * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Head(LinkList* L, int n, ...) { int i; LinkList p; - ElemType e; - - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L == NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; - - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } - - for(i = 1; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1; i <= n; ++i) { // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p == NULL) { - fclose(fp); - exit(OVERFLOW); - } - + // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + p->next = (*L)->next; (*L)->next = p; - } else { - fclose(fp); + } + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + p->next = (*L)->next; + (*L)->next = p; + } + + fclose(fp); } - - fclose(fp); - + return OK; } /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Tail(LinkList* L, int n, ...) { int i; LinkList p, q; - ElemType e; - - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L==NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; - - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } - - for(i = 1, q = *L; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1, q = *L; i <= n; ++i) { + // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p==NULL) { - fclose(fp); - exit(OVERFLOW); - } - + // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + q->next = p; q = q->next; - } else { - fclose(fp); + } + + q->next = NULL; + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1, q = *L; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + q->next = p; + q = q->next; + } + + q->next = NULL; + + fclose(fp); } - - q->next = NULL; - - fclose(fp); - + return OK; } + diff --git a/Dev-C++/CourseBook/0204_LinkList/LinkList.h b/Dev-C++/CourseBook/0204_LinkList/LinkList.h index a71bff6..6b0de85 100644 --- a/Dev-C++/CourseBook/0204_LinkList/LinkList.h +++ b/Dev-C++/CourseBook/0204_LinkList/LinkList.h @@ -8,7 +8,9 @@ #define LINKLIST_H #include -#include //ṩmallocreallocfreeexitԭ +#include // ṩ mallocreallocfreeexit ԭ +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end #include "Status.h" //**01 **// /* ԪͶ */ @@ -147,22 +149,31 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)); * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n); +Status CreateList_Head(LinkList* L, int n, ...); /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n); +Status CreateList_Tail(LinkList* L, int n, ...); #endif diff --git a/Dev-C++/CourseBook/0205_MergeList/LinkList.cpp b/Dev-C++/CourseBook/0205_MergeList/LinkList.cpp index 1fc32b4..1963a0d 100644 --- a/Dev-C++/CourseBook/0205_MergeList/LinkList.cpp +++ b/Dev-C++/CourseBook/0205_MergeList/LinkList.cpp @@ -34,105 +34,150 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)) { * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Head(LinkList* L, int n, ...) { int i; LinkList p; - ElemType e; - - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L == NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; - - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } - - for(i = 1; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1; i <= n; ++i) { // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p == NULL) { - fclose(fp); - exit(OVERFLOW); - } - + // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + p->next = (*L)->next; (*L)->next = p; - } else { - fclose(fp); + } + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + p->next = (*L)->next; + (*L)->next = p; + } + + fclose(fp); } - - fclose(fp); - + return OK; } /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Tail(LinkList* L, int n, ...) { int i; LinkList p, q; - ElemType e; - - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L==NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; - - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } - - for(i = 1, q = *L; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1, q = *L; i <= n; ++i) { + // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p==NULL) { - fclose(fp); - exit(OVERFLOW); - } - + // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + q->next = p; q = q->next; - } else { - fclose(fp); + } + + q->next = NULL; + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1, q = *L; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + q->next = p; + q = q->next; + } + + q->next = NULL; + + fclose(fp); } - - q->next = NULL; - - fclose(fp); - + return OK; } + diff --git a/Dev-C++/CourseBook/0205_MergeList/LinkList.h b/Dev-C++/CourseBook/0205_MergeList/LinkList.h index 2272cf7..6d9218d 100644 --- a/Dev-C++/CourseBook/0205_MergeList/LinkList.h +++ b/Dev-C++/CourseBook/0205_MergeList/LinkList.h @@ -8,7 +8,9 @@ #define LINKLIST_H #include -#include //ṩmallocreallocfreeexitԭ +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end #include "Status.h" //**01 **// /* ԪͶ */ @@ -40,22 +42,32 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)); * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n); +Status CreateList_Head(LinkList* L, int n, ...); /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n); +Status CreateList_Tail(LinkList* L, int n, ...); #endif + diff --git a/Dev-C++/CourseBook/0205_MergeList/MergeList-main.cpp b/Dev-C++/CourseBook/0205_MergeList/MergeList-main.cpp index fbf6614..4e4278c 100644 --- a/Dev-C++/CourseBook/0205_MergeList/MergeList-main.cpp +++ b/Dev-C++/CourseBook/0205_MergeList/MergeList-main.cpp @@ -9,23 +9,23 @@ void PrintElem(ElemType e) { int main(int argc, char** argv) { LinkList La, Lb, Lc; - - int m = 5; - - printf("ΪʾLa趨Ϊ %d Lb趨Ϊ %d LaLb...\n", m, m); - - CreateList_Head("TestData_Head.txt", &La, m); + + int n = 5; + + printf("ΪʾLa趨Ϊ %d Lb趨Ϊ %d LaLb...\n", n, n); + + CreateList_Head(&La, n, "TestData_Head.txt"); printf("La = "); ListTraverse(La, PrintElem); - - CreateList_Tail("TestData_Tail.txt", &Lb, m); + + CreateList_Tail(&Lb, n, "TestData_Tail.txt"); printf("Lb = "); ListTraverse(Lb, PrintElem); - + printf("鲢LaLbΪLc = "); MergeList(&La, &Lb, &Lc); ListTraverse(Lc, PrintElem); - + return 0; } diff --git a/Dev-C++/CourseBook/0207_Difference/Difference-main.cpp b/Dev-C++/CourseBook/0207_Difference/Difference-main.cpp index f4a0208..b96d93c 100644 --- a/Dev-C++/CourseBook/0207_Difference/Difference-main.cpp +++ b/Dev-C++/CourseBook/0207_Difference/Difference-main.cpp @@ -10,10 +10,13 @@ void PrintElem(ElemType e) { int main(int argc, char** argv) { SLinkList space; // ÿռ int S; // ̬ - + + // S = (A-B)(B-A) + difference(space, &S, "TestData.txt"); + printf("S = (A-B)(B-A) = "); - difference("TestData.txt", space, &S); ListTraverse(space, S, PrintElem); - + return 0; } + diff --git a/Dev-C++/CourseBook/0207_Difference/Difference.cpp b/Dev-C++/CourseBook/0207_Difference/Difference.cpp index 3327485..d3ef829 100644 --- a/Dev-C++/CourseBook/0207_Difference/Difference.cpp +++ b/Dev-C++/CourseBook/0207_Difference/Difference.cpp @@ -13,74 +13,112 @@ * * ԼAͼB(A-B)(B-A)㣬뾲̬S * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void difference(char path[], SLinkList space, int* S) { - FILE* fp; +void difference(SLinkList space, int* S, ...) { int m, n; // AͼBԪ int j; // ѭ int R; // ָ̬һ int i, k, p; int b; // ʱ洢ӼBж - + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, S); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + // ʼÿռ InitSpace(space); - + // ȡ̬ͷ *S = Malloc(space); - + // Rִо̬Ľ R = *S; - - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - exit(ERROR); - } - + // ȡAͼBԪظ - ReadData(fp, "%d%d", &m, &n); - + if(readFromConsole) { + printf("뼯AԪظ"); + scanf("%d", &m); + printf("뼯BԪظ"); + scanf("%d", &n); + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { + exit(ERROR); + } + + ReadData(fp, "%d%d", &m, &n); + } + + if(readFromConsole) { + printf(" %d Ԫش뼯A", m); + } + // ¼뼯A for(j = 1; j <= m; ++j) { // i = Malloc(space); - + // 뼯AԪֵ - ReadData(fp, "%d", &space[i].data); - + if(readFromConsole) { + scanf("%d", &space[i].data); + } else { + ReadData(fp, "%d", &space[i].data); + } + // ½뵽β space[R].cur = i; R = i; } - + // βָÿ space[R].cur = 0; - + + if(readFromConsole) { + printf(" %d Ԫش뼯B", n); + } + // ¼뼯B for(j = 1; j <= n; ++j) { // 뼯BԪֵ - ReadData(fp, "%d", &b); - + if(readFromConsole) { + scanf("%d", &b); + } else { + ReadData(fp, "%d", &b); + } + p = *S; // ָ̬ͷ㣬ָkǰһλ k = space[*S].cur; // ָ̬е׸Ԫ - + // ڵǰ̬вǷbԪ while(k != space[R].cur && space[k].data != b) { p = k; k = space[k].cur; } - + // Ԫزڣ뾲̬ if(k == space[R].cur) { i = Malloc(space); space[i].data = b; space[i].cur = space[R].cur; space[R].cur = i; - + // ԪѴڣҪƳ } else { space[p].cur = space[k].cur; @@ -90,6 +128,9 @@ void difference(char path[], SLinkList space, int* S) { } } } - - fclose(fp); -} \ No newline at end of file + + if(!readFromConsole) { + fclose(fp); + } +} + diff --git a/Dev-C++/CourseBook/0207_Difference/Difference.h b/Dev-C++/CourseBook/0207_Difference/Difference.h index b7d9164..4a8dae8 100644 --- a/Dev-C++/CourseBook/0207_Difference/Difference.h +++ b/Dev-C++/CourseBook/0207_Difference/Difference.h @@ -8,8 +8,10 @@ #define DIFFERENCE_H #include -#include "Status.h" //**01 **// -#include "SLinkList.h" //**02 Ա**// +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end +#include "Status.h" //**01 **// +#include "SLinkList.h" //**02 Ա**// /* * 㷨2.17 @@ -18,11 +20,17 @@ * * ԼAͼB(A-B)(B-A)㣬뾲̬S * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void difference(char path[], SLinkList space, int* S); +void difference(SLinkList space, int* S, ...); #endif + diff --git a/Dev-C++/CourseBook/0210_MergeEList/MergeEList-main.cpp b/Dev-C++/CourseBook/0210_MergeEList/MergeEList-main.cpp index b5fbcd5..4848224 100644 --- a/Dev-C++/CourseBook/0210_MergeEList/MergeEList-main.cpp +++ b/Dev-C++/CourseBook/0210_MergeEList/MergeEList-main.cpp @@ -1,5 +1,7 @@ #include -#include "MergeEList.h" //**02 Ա**// +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end +#include "MergeEList.h" //**02 Ա**// // ԺӡԪ void PrintElem(ElemType e) { @@ -21,51 +23,81 @@ int Cmp(ElemType e1, ElemType e2) { /* * β巨 * + * *ע + * * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļfpжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void CreateList_Tail(char path[], ELinkList* L) { - FILE* fp; +void CreateList_Tail(ELinkList* L, ...) { int i, n; ElemType e; - - fp = fopen(path, "r"); - if(fp == NULL) { - printf("ļʧ...\n"); - exit(ERROR); + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, L); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + + if(readFromConsole) { + // ȡָԪص + printf("Ԫ"); + scanf("%d", &n); + + InitList(L); + + printf(" %d Ԫأ", n); + for(i = 1; i <= n; i++) { + scanf("%d", &e); + ListInsert(L, i, e); + } + } else { + fp = fopen(path, "r"); + if(fp == NULL) { + printf("ļʧ...\n"); + exit(ERROR); + } + + // ȡָԪص + ReadData(fp, "%d", &n); + + InitList(L); + + for(i = 1; i <= n; i++) { + ReadData(fp, "%d", &e); + ListInsert(L, i, e); + } + + fclose(fp); } - - // ȡָԪص - ReadData(fp, "%d", &n); - - InitList(L); - - for(i = 1; i <= n; i++) { - ReadData(fp, "%d", &e); - ListInsert(L, i, e); - } - - fclose(fp); } int main(int argc, char** argv) { ELinkList La, Lb, Lc; - + printf("LaLbԴ...\n"); - - CreateList_Tail("TestData_La.txt", &La); + + CreateList_Tail(&La, "TestData_La.txt"); printf("La= "); ListTraverse(La, PrintElem); - - CreateList_Tail("TestData_Lb.txt", &Lb); + + CreateList_Tail(&Lb, "TestData_Lb.txt"); printf("Lb= "); ListTraverse(Lb, PrintElem); - + MergeEList(&La, &Lb, &Lc, Cmp); printf("ϲLaLbΪ Lc = "); ListTraverse(Lc, PrintElem); - + return 0; } + diff --git a/Dev-C++/CourseBook/0211_Polynomial/Polynomial-main.cpp b/Dev-C++/CourseBook/0211_Polynomial/Polynomial-main.cpp index ab64e6e..a4466a3 100644 --- a/Dev-C++/CourseBook/0211_Polynomial/Polynomial-main.cpp +++ b/Dev-C++/CourseBook/0211_Polynomial/Polynomial-main.cpp @@ -3,56 +3,56 @@ int main(int argc, char **argv) { Polynomial Pa, Pb; int m, n; - + m = 5; n = 6; - + printf(" CreatPolyn \n"); { printf(" ΪʾΪ %d ĶʽPa...\n", m); - CreatPolyn("TestData_Pa.txt", &Pa, m); - + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + printf(" ΪʾΪ %d ĶʽPb...\n", n); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); } PressEnterToContinue(); - - + + printf(" PrintPolyn \n"); { printf(" һԪʽ Pa = "); PrintPolyn(Pa); - + printf(" һԪʽ Pb = "); PrintPolyn(Pb); } PressEnterToContinue(); - - + + printf(" PolynLength \n"); { printf(" La Ϊ %d Lb Ϊ %d\n", PolynLength(Pa), PolynLength(Pb)); } PressEnterToContinue(); - + printf(" AddPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); - + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); + AddPolyn(&Pa, &Pb); - + printf(" Pa = Pa + Pb = "); PrintPolyn(Pa); } PressEnterToContinue(); - - + + printf(" SubtractPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); SubtractPolyn(&Pa, &Pb); @@ -61,11 +61,11 @@ int main(int argc, char **argv) { } PressEnterToContinue(); - + printf(" MultiplyPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); MultiplyPolyn(&Pa, &Pb); @@ -73,7 +73,7 @@ int main(int argc, char **argv) { PrintPolyn(Pa); } PressEnterToContinue(); - + return 0; } diff --git a/Dev-C++/CourseBook/0211_Polynomial/Polynomial.cpp b/Dev-C++/CourseBook/0211_Polynomial/Polynomial.cpp index b575b3f..cd6e0b3 100644 --- a/Dev-C++/CourseBook/0211_Polynomial/Polynomial.cpp +++ b/Dev-C++/CourseBook/0211_Polynomial/Polynomial.cpp @@ -16,40 +16,66 @@ * * ϵָΪmһԪʽ * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void CreatPolyn(char path[], Polynomial* P, int m) { - FILE* fp; +void CreatPolyn(Polynomial* P, int m, ...) { int i; ElemType e; Position h, q; Link s; - + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, m); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + // ʼһһԪʽ InitList(P); - + // ȡʽͷָ h = GetHead(*P); - + // Ϊͷ e.coef = 0.0f; e.expn = -1; SetCurElem(h, e); - - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - exit(ERROR); + + if(!readFromConsole) { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { + exit(ERROR); + } } - + + if(readFromConsole) { + printf(" %d Ԫأ\n", m); + } + // ¼mЧ for(i = 1; i <= m; i++) { // ȡϵָϢʱe - ReadData(fp, "%f%d", &(e.coef), &(e.expn)); - + if(readFromConsole) { + printf(" %d ϵָ", i); + scanf("%f%d", &(e.coef), &(e.expn)); + } else { + ReadData(fp, "%f%d", &(e.coef), &(e.expn)); + } + // ǰвڸָ if(LocateElem(*P, e, &q, Cmp) == FALSE && q != NULL) { // ½ @@ -59,8 +85,10 @@ void CreatPolyn(char path[], Polynomial* P, int m) { } } } - - fclose(fp); + + if(!readFromConsole) { + fclose(fp); + } } /* @@ -94,21 +122,21 @@ void AddPolyn(Polynomial* Pa, Polynomial* Pb) { Position qa, qb; ElemType a, b; float sum; - + // hahbֱָPaPbͷ ha = GetHead(*Pa); hb = GetHead(*Pb); - + // qaqbֱָPaPbĵǰ qa = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); - + // qaqbǿ while(qa && qb) { // abΪеǰȽԪ a = GetCurElem(qa); b = GetCurElem(qb); - + //ȽϵǰԪصָС switch(Cmp(a, b)) { // ʽPaеǰֵָС @@ -116,19 +144,19 @@ void AddPolyn(Polynomial* Pa, Polynomial* Pb) { ha = qa; qa = NextPos(*Pa, qa); } - break; - - // ֵ + break; + + // ֵ case 0: { sum = a.coef + b.coef; - + // ӲܵʱPaϵֵ if(sum != 0.0) { // SetCurElem()ʣֱӸֵ qa->data.coef = sum; // ha ha = qa; - + //ӵʱɾPaеǰ } else { // ɾhaĽ㣨ʵɾľqa @@ -136,41 +164,41 @@ void AddPolyn(Polynomial* Pa, Polynomial* Pb) { // ͷűɾռռ FreeNode(&qa); } - + // ɾPbɨĽ DelFirst(Pb, hb, &qb); // ͷűɾռռ FreeNode(&qb); - + // qaqb qa = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; - - // ʽPbеǰֵָС + break; + + // ʽPbеǰֵָС case 1: { // ժPbǰ DelFirst(Pb, hb, &qb); - + // ժ½Pa InsFirst(Pa, ha, qb); - + ha = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; + break; }//switch }//while - + // Pbδɨ꣬ʣӵPa if(qb != NULL) { Append(Pa, qb); } - + // ͷPbͷ FreeNode(&hb); - + // PbΪ״̬ (*Pb).head = (*Pb).tail = NULL; (*Pb).len = 0; @@ -188,21 +216,21 @@ void SubtractPolyn(Polynomial* Pa, Polynomial* Pb) { Position r; ElemType a, b; float sum; - + // hahbֱָPaPbͷ ha = GetHead(*Pa); hb = GetHead(*Pb); - + // qaqbֱָPaPbĵǰ qa = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); - + // qaqbǿ while(qa && qb) { // abΪеǰȽԪ a = GetCurElem(qa); b = GetCurElem(qb); - + // ȽϵǰԪصָС switch(Cmp(a, b)) { // ʽPaеǰֵָС @@ -211,18 +239,18 @@ void SubtractPolyn(Polynomial* Pa, Polynomial* Pb) { qa = NextPos(*Pa, ha); } break; - - // ֵ + + // ֵ case 0: { sum = a.coef - b.coef; - + // ܵʱPaϵֵ if(sum != 0.0) { // ϵ qa->data.coef = sum; // ha ha = qa; - + // ʱɾPaеǰ } else { // ɾhaĽ㣨ʵɾľqa @@ -230,49 +258,49 @@ void SubtractPolyn(Polynomial* Pa, Polynomial* Pb) { // ͷűɾռռ FreeNode(&qa); } - + // ɾPbɨĽ DelFirst(Pb, hb, &qb); // ͷűɾռռ FreeNode(&qb); - + // qaqb qa = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; - - // ʽPbеǰֵָС + break; + + // ʽPbеǰֵָС case 1: { // ժPbǰ DelFirst(Pb, hb, &qb); - + // ı䵱ǰ qb->data.coef = -qb->data.coef; - + // ժ½Pa InsFirst(Pa, ha, qb); - + ha = NextPos(*Pa, ha); qb = NextPos(*Pb, hb); } - break; + break; }//switch }//while - + // Pbδɨ꣬ʣϵȡӵPa if(qb != NULL) { // ıʣķ for(r = qb = 0; r != NULL; r = r->next) { r->data.coef = -r->data.coef; } - + Append(Pa, qb); } - + // ͷPbͷ FreeNode(&hb); - + // PbΪ״̬ (*Pb).head = (*Pb).tail = NULL; (*Pb).len = 0; @@ -291,45 +319,45 @@ void MultiplyPolyn(Polynomial* Pa, Polynomial* Pb) { Position qa, qb; Link s; ElemType e; - + // ȡʽij la = PolynLength(*Pa); lb = PolynLength(*Pb); - + // hahbֱָPaPbͷ ha = GetHead(*Pa); hb = GetHead(*Pb); - + // ۼӼ InitList(&Pc); - + // PaеԪ for(i = 1; i <= la; i++) { // 洢ʱ InitList(&Ptmp); - + // ժPaеĽ DelFirst(Pa, ha, &qa); - + // Pbн㣬PaժµĽ for(j = 1, qb = NextPos(*Pb, hb); j <= lb; j++, qb = NextPos(*Pb, qb)) { e.coef = qa->data.coef * qb->data.coef; //ϵ e.expn = qa->data.expn + qb->data.expn; //ָ - + // ½洢 MakeNode(&s, e); - + // ӵʱʽ Append(&Ptmp, s); } - + // µĶʽۼӵPc AddPolyn(&Pc, &Ptmp); } - + // нӵPa AddPolyn(Pa, &Pc); - + // ٶʽPb DestroyPolyn(Pb); } @@ -345,13 +373,13 @@ void MultiplyPolyn(Polynomial* Pa, Polynomial* Pb) { void PrintPolyn(Polynomial P) { int i; Link p; - + p = P.head->next; for(i = 1; i <= P.len; i++) { if(p->data.coef == 0.0f) { continue; } - + if(i == 1) { printf("%g", p->data.coef); } else { @@ -363,18 +391,18 @@ void PrintPolyn(Polynomial P) { printf("%g", -p->data.coef); } } - + if(p->data.expn) { printf("x"); - + if(p->data.expn != 1) { printf("^%d", p->data.expn); } } - + p = p->next; } - + printf("\n"); } @@ -386,7 +414,7 @@ void PrintPolyn(Polynomial P) { int Cmp(ElemType c1, ElemType c2) { // ָ int i = c1.expn - c2.expn; - + if(i < 0) { return -1; } else if(i == 0) { @@ -395,3 +423,4 @@ int Cmp(ElemType c1, ElemType c2) { return 1; } } + diff --git a/Dev-C++/CourseBook/0211_Polynomial/Polynomial.h b/Dev-C++/CourseBook/0211_Polynomial/Polynomial.h index 8a6204a..6aaedaa 100644 --- a/Dev-C++/CourseBook/0211_Polynomial/Polynomial.h +++ b/Dev-C++/CourseBook/0211_Polynomial/Polynomial.h @@ -8,7 +8,9 @@ #define POLYNOMIAL_H #include -#include //ṩmallocreallocfreeexitԭ +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end #include "ELinkList.h" //**02 Ա**// /* һԪʽͶ */ @@ -24,12 +26,17 @@ typedef ELinkList Polynomial; * * ϵָΪmһԪʽ * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void CreatPolyn(char path[], Polynomial *P, int m); +void CreatPolyn(Polynomial* P, int m, ...); /* * @@ -89,3 +96,4 @@ void PrintPolyn(Polynomial P); int Cmp(ElemType c1, ElemType c2); #endif + diff --git a/VisualC++/CourseBook/0204_LinkList/LinkList-main.c b/VisualC++/CourseBook/0204_LinkList/LinkList-main.c index c2790e2..f9eddbb 100644 --- a/VisualC++/CourseBook/0204_LinkList/LinkList-main.c +++ b/VisualC++/CourseBook/0204_LinkList/LinkList-main.c @@ -149,8 +149,8 @@ int main(int argc, char** argv) { printf(" CreateList_Head \n"); { LinkList L; + CreateList_Head(&L, 5, "TestData_Head.txt"); printf(" ͷ巨 L = "); - CreateList_Head("TestData_Head.txt", &L, 5); ListTraverse(L, PrintElem); } PressEnterToContinue(); @@ -159,8 +159,8 @@ int main(int argc, char** argv) { printf(" CreateList_Tail \n"); { LinkList L; + CreateList_Tail(&L, 5, "TestData_Tail.txt"); printf(" β巨 L = "); - CreateList_Tail("TestData_Tail.txt", &L, 5); ListTraverse(L, PrintElem); } PressEnterToContinue(); diff --git a/VisualC++/CourseBook/0204_LinkList/LinkList.c b/VisualC++/CourseBook/0204_LinkList/LinkList.c index d87e5b5..14890d0 100644 --- a/VisualC++/CourseBook/0204_LinkList/LinkList.c +++ b/VisualC++/CourseBook/0204_LinkList/LinkList.c @@ -384,105 +384,149 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)) { * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Head(LinkList* L, int n, ...) { int i; LinkList p; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L == NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1; i <= n; ++i) { // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p == NULL) { - fclose(fp); - exit(OVERFLOW); - } // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + p->next = (*L)->next; (*L)->next = p; - } else { - fclose(fp); + } + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + p->next = (*L)->next; + (*L)->next = p; + } + + fclose(fp); } - fclose(fp); - return OK; } /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Tail(LinkList* L, int n, ...) { int i; LinkList p, q; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L==NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1, q = *L; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1, q = *L; i <= n; ++i) { + // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p==NULL) { - fclose(fp); - exit(OVERFLOW); - } // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + q->next = p; q = q->next; - } else { - fclose(fp); + } + + q->next = NULL; + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1, q = *L; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + q->next = p; + q = q->next; + } + + q->next = NULL; + + fclose(fp); } - q->next = NULL; - - fclose(fp); - return OK; } diff --git a/VisualC++/CourseBook/0204_LinkList/LinkList.h b/VisualC++/CourseBook/0204_LinkList/LinkList.h index a71bff6..6b0de85 100644 --- a/VisualC++/CourseBook/0204_LinkList/LinkList.h +++ b/VisualC++/CourseBook/0204_LinkList/LinkList.h @@ -8,7 +8,9 @@ #define LINKLIST_H #include -#include //ṩmallocreallocfreeexitԭ +#include // ṩ mallocreallocfreeexit ԭ +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end #include "Status.h" //**01 **// /* ԪͶ */ @@ -147,22 +149,31 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)); * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n); +Status CreateList_Head(LinkList* L, int n, ...); /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n); +Status CreateList_Tail(LinkList* L, int n, ...); #endif diff --git a/VisualC++/CourseBook/0205_MergeList/LinkList.c b/VisualC++/CourseBook/0205_MergeList/LinkList.c index 1fc32b4..11f31cb 100644 --- a/VisualC++/CourseBook/0205_MergeList/LinkList.c +++ b/VisualC++/CourseBook/0205_MergeList/LinkList.c @@ -34,105 +34,149 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)) { * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Head(LinkList* L, int n, ...) { int i; LinkList p; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L == NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1; i <= n; ++i) { // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p == NULL) { - fclose(fp); - exit(OVERFLOW); - } // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + p->next = (*L)->next; (*L)->next = p; - } else { - fclose(fp); + } + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + p->next = (*L)->next; + (*L)->next = p; + } + + fclose(fp); } - fclose(fp); - return OK; } /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n) { - FILE* fp; +Status CreateList_Tail(LinkList* L, int n, ...) { int i; LinkList p, q; - ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ - // ͷ - *L = (LinkList) malloc(sizeof(LNode)); - if(*L==NULL) { - exit(OVERFLOW); - } - (*L)->next = NULL; + va_start(ap, n); + path = va_arg(ap, char*); + va_end(ap); - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - return ERROR; - } + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; - for(i = 1, q = *L; i <= n; ++i) { - // ɹȡ - if(ReadData(fp, "%d", &e) == 1) { + if(readFromConsole) { + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + printf("%dԪأ", n); + + for(i = 1, q = *L; i <= n; ++i) { + // ½ p = (LinkList) malloc(sizeof(LNode)); - if(p==NULL) { - fclose(fp); - exit(OVERFLOW); - } // ݣ뵽 - p->data = e; + scanf("%d", &(p->data)); + q->next = p; q = q->next; - } else { - fclose(fp); + } + + q->next = NULL; + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { return ERROR; } + + // ͷ + *L = (LinkList) malloc(sizeof(LNode)); + (*L)->next = NULL; + + for(i = 1, q = *L; i <= n; ++i) { + // ½ + p = (LinkList) malloc(sizeof(LNode)); + + // ݣ뵽 + ReadData(fp, "%d", &(p->data)); + + q->next = p; + q = q->next; + } + + q->next = NULL; + + fclose(fp); } - q->next = NULL; - - fclose(fp); - return OK; } diff --git a/VisualC++/CourseBook/0205_MergeList/LinkList.h b/VisualC++/CourseBook/0205_MergeList/LinkList.h index 2272cf7..e486466 100644 --- a/VisualC++/CourseBook/0205_MergeList/LinkList.h +++ b/VisualC++/CourseBook/0205_MergeList/LinkList.h @@ -8,7 +8,9 @@ #define LINKLIST_H #include -#include //ṩmallocreallocfreeexitԭ +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end #include "Status.h" //**01 **// /* ԪͶ */ @@ -40,22 +42,31 @@ void ListTraverse(LinkList L, void(Visit)(ElemType)); * * ͷ巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ - * ̲е㷨õͷ巨Դ˴ʵּ˺׺_Head + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Head(char path[], LinkList* L, int n); +Status CreateList_Head(LinkList* L, int n, ...); /* * β巨 * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -Status CreateList_Tail(char path[], LinkList* L, int n); +Status CreateList_Tail(LinkList* L, int n, ...); #endif diff --git a/VisualC++/CourseBook/0205_MergeList/MergeList-main.c b/VisualC++/CourseBook/0205_MergeList/MergeList-main.c index fbf6614..09fd3cf 100644 --- a/VisualC++/CourseBook/0205_MergeList/MergeList-main.c +++ b/VisualC++/CourseBook/0205_MergeList/MergeList-main.c @@ -10,15 +10,15 @@ void PrintElem(ElemType e) { int main(int argc, char** argv) { LinkList La, Lb, Lc; - int m = 5; + int n = 5; - printf("ΪʾLa趨Ϊ %d Lb趨Ϊ %d LaLb...\n", m, m); + printf("ΪʾLa趨Ϊ %d Lb趨Ϊ %d LaLb...\n", n, n); - CreateList_Head("TestData_Head.txt", &La, m); + CreateList_Head(&La, n, "TestData_Head.txt"); printf("La = "); ListTraverse(La, PrintElem); - CreateList_Tail("TestData_Tail.txt", &Lb, m); + CreateList_Tail(&Lb, n, "TestData_Tail.txt"); printf("Lb = "); ListTraverse(Lb, PrintElem); diff --git a/VisualC++/CourseBook/0207_Difference/Difference-main.c b/VisualC++/CourseBook/0207_Difference/Difference-main.c index f4a0208..dc132b0 100644 --- a/VisualC++/CourseBook/0207_Difference/Difference-main.c +++ b/VisualC++/CourseBook/0207_Difference/Difference-main.c @@ -11,8 +11,10 @@ int main(int argc, char** argv) { SLinkList space; // ÿռ int S; // ̬ + // S = (A-B)(B-A) + difference(space, &S, "TestData.txt"); + printf("S = (A-B)(B-A) = "); - difference("TestData.txt", space, &S); ListTraverse(space, S, PrintElem); return 0; diff --git a/VisualC++/CourseBook/0207_Difference/Difference.c b/VisualC++/CourseBook/0207_Difference/Difference.c index 3327485..58f10e3 100644 --- a/VisualC++/CourseBook/0207_Difference/Difference.c +++ b/VisualC++/CourseBook/0207_Difference/Difference.c @@ -13,18 +13,33 @@ * * ԼAͼB(A-B)(B-A)㣬뾲̬S * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void difference(char path[], SLinkList space, int* S) { - FILE* fp; +void difference(SLinkList space, int* S, ...) { int m, n; // AͼBԪ int j; // ѭ int R; // ָ̬һ int i, k, p; int b; // ʱ洢ӼBж + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, S); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; // ʼÿռ InitSpace(space); @@ -35,14 +50,25 @@ void difference(char path[], SLinkList space, int* S) { // Rִо̬Ľ R = *S; - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - exit(ERROR); + // ȡAͼBԪظ + if(readFromConsole) { + printf("뼯AԪظ"); + scanf("%d", &m); + printf("뼯BԪظ"); + scanf("%d", &n); + } else { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { + exit(ERROR); + } + + ReadData(fp, "%d%d", &m, &n); } - // ȡAͼBԪظ - ReadData(fp, "%d%d", &m, &n); + if(readFromConsole) { + printf(" %d Ԫش뼯A", m); + } // ¼뼯A for(j = 1; j <= m; ++j) { @@ -50,7 +76,11 @@ void difference(char path[], SLinkList space, int* S) { i = Malloc(space); // 뼯AԪֵ - ReadData(fp, "%d", &space[i].data); + if(readFromConsole) { + scanf("%d", &space[i].data); + } else { + ReadData(fp, "%d", &space[i].data); + } // ½뵽β space[R].cur = i; @@ -60,10 +90,18 @@ void difference(char path[], SLinkList space, int* S) { // βָÿ space[R].cur = 0; + if(readFromConsole) { + printf(" %d Ԫش뼯B", n); + } + // ¼뼯B for(j = 1; j <= n; ++j) { // 뼯BԪֵ - ReadData(fp, "%d", &b); + if(readFromConsole) { + scanf("%d", &b); + } else { + ReadData(fp, "%d", &b); + } p = *S; // ָ̬ͷ㣬ָkǰһλ k = space[*S].cur; // ָ̬е׸Ԫ @@ -91,5 +129,7 @@ void difference(char path[], SLinkList space, int* S) { } } - fclose(fp); -} \ No newline at end of file + if(!readFromConsole) { + fclose(fp); + } +} diff --git a/VisualC++/CourseBook/0207_Difference/Difference.h b/VisualC++/CourseBook/0207_Difference/Difference.h index b7d9164..047968d 100644 --- a/VisualC++/CourseBook/0207_Difference/Difference.h +++ b/VisualC++/CourseBook/0207_Difference/Difference.h @@ -8,8 +8,10 @@ #define DIFFERENCE_H #include -#include "Status.h" //**01 **// -#include "SLinkList.h" //**02 Ա**// +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end +#include "Status.h" //**01 **// +#include "SLinkList.h" //**02 Ա**// /* * 㷨2.17 @@ -18,11 +20,16 @@ * * ԼAͼB(A-B)(B-A)㣬뾲̬S * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void difference(char path[], SLinkList space, int* S); +void difference(SLinkList space, int* S, ...); #endif diff --git a/VisualC++/CourseBook/0210_MergeEList/MergeEList-main.c b/VisualC++/CourseBook/0210_MergeEList/MergeEList-main.c index b5fbcd5..cf736b9 100644 --- a/VisualC++/CourseBook/0210_MergeEList/MergeEList-main.c +++ b/VisualC++/CourseBook/0210_MergeEList/MergeEList-main.c @@ -1,5 +1,7 @@ #include -#include "MergeEList.h" //**02 Ա**// +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end +#include "MergeEList.h" //**02 Ա**// // ԺӡԪ void PrintElem(ElemType e) { @@ -21,32 +23,61 @@ int Cmp(ElemType e1, ElemType e2) { /* * β巨 * + * *ע + * * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļfpжȡݡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void CreateList_Tail(char path[], ELinkList* L) { - FILE* fp; +void CreateList_Tail(ELinkList* L, ...) { int i, n; ElemType e; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - printf("ļʧ...\n"); - exit(ERROR); + va_start(ap, L); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; + + if(readFromConsole) { + // ȡָԪص + printf("Ԫ"); + scanf("%d", &n); + + InitList(L); + + printf(" %d Ԫأ", n); + for(i = 1; i <= n; i++) { + scanf("%d", &e); + ListInsert(L, i, e); + } + } else { + fp = fopen(path, "r"); + if(fp == NULL) { + printf("ļʧ...\n"); + exit(ERROR); + } + + // ȡָԪص + ReadData(fp, "%d", &n); + + InitList(L); + + for(i = 1; i <= n; i++) { + ReadData(fp, "%d", &e); + ListInsert(L, i, e); + } + + fclose(fp); } - - // ȡָԪص - ReadData(fp, "%d", &n); - - InitList(L); - - for(i = 1; i <= n; i++) { - ReadData(fp, "%d", &e); - ListInsert(L, i, e); - } - - fclose(fp); } @@ -55,11 +86,11 @@ int main(int argc, char** argv) { printf("LaLbԴ...\n"); - CreateList_Tail("TestData_La.txt", &La); + CreateList_Tail(&La, "TestData_La.txt"); printf("La= "); ListTraverse(La, PrintElem); - CreateList_Tail("TestData_Lb.txt", &Lb); + CreateList_Tail(&Lb, "TestData_Lb.txt"); printf("Lb= "); ListTraverse(Lb, PrintElem); diff --git a/VisualC++/CourseBook/0211_Polynomial/Polynomial-main.c b/VisualC++/CourseBook/0211_Polynomial/Polynomial-main.c index ab64e6e..dd757aa 100644 --- a/VisualC++/CourseBook/0211_Polynomial/Polynomial-main.c +++ b/VisualC++/CourseBook/0211_Polynomial/Polynomial-main.c @@ -10,10 +10,10 @@ int main(int argc, char **argv) { printf(" CreatPolyn \n"); { printf(" ΪʾΪ %d ĶʽPa...\n", m); - CreatPolyn("TestData_Pa.txt", &Pa, m); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); printf(" ΪʾΪ %d ĶʽPb...\n", n); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); } PressEnterToContinue(); @@ -38,8 +38,8 @@ int main(int argc, char **argv) { printf(" AddPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); AddPolyn(&Pa, &Pb); @@ -51,8 +51,8 @@ int main(int argc, char **argv) { printf(" SubtractPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); SubtractPolyn(&Pa, &Pb); @@ -64,8 +64,8 @@ int main(int argc, char **argv) { printf(" MultiplyPolyn \n"); { - CreatPolyn("TestData_Pa.txt", &Pa, m); - CreatPolyn("TestData_Pb.txt", &Pb, n); + CreatPolyn(&Pa, m, "TestData_Pa.txt"); + CreatPolyn(&Pb, n, "TestData_Pb.txt"); MultiplyPolyn(&Pa, &Pb); diff --git a/VisualC++/CourseBook/0211_Polynomial/Polynomial.c b/VisualC++/CourseBook/0211_Polynomial/Polynomial.c index b575b3f..7cf13c1 100644 --- a/VisualC++/CourseBook/0211_Polynomial/Polynomial.c +++ b/VisualC++/CourseBook/0211_Polynomial/Polynomial.c @@ -16,17 +16,32 @@ * * ϵָΪmһԪʽ * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void CreatPolyn(char path[], Polynomial* P, int m) { - FILE* fp; +void CreatPolyn(Polynomial* P, int m, ...) { int i; ElemType e; Position h, q; Link s; + va_list ap; + FILE* fp; + char* path = NULL; + int readFromConsole; // Ƿӿ̨ȡ + + va_start(ap, m); + path = va_arg(ap, char*); + va_end(ap); + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strstr(path, "TestData") == NULL; // ʼһһԪʽ InitList(P); @@ -39,16 +54,27 @@ void CreatPolyn(char path[], Polynomial* P, int m) { e.expn = -1; SetCurElem(h, e); - // ļ׼ȡ - fp = fopen(path, "r"); - if(fp == NULL) { - exit(ERROR); + if(!readFromConsole) { + // ļ׼ȡ + fp = fopen(path, "r"); + if(fp == NULL) { + exit(ERROR); + } + } + + if(readFromConsole) { + printf(" %d Ԫأ\n", m); } // ¼mЧ for(i = 1; i <= m; i++) { // ȡϵָϢʱe - ReadData(fp, "%f%d", &(e.coef), &(e.expn)); + if(readFromConsole) { + printf(" %d ϵָ", i); + scanf("%f%d", &(e.coef), &(e.expn)); + } else { + ReadData(fp, "%f%d", &(e.coef), &(e.expn)); + } // ǰвڸָ if(LocateElem(*P, e, &q, Cmp) == FALSE && q != NULL) { @@ -60,7 +86,9 @@ void CreatPolyn(char path[], Polynomial* P, int m) { } } - fclose(fp); + if(!readFromConsole) { + fclose(fp); + } } /* diff --git a/VisualC++/CourseBook/0211_Polynomial/Polynomial.h b/VisualC++/CourseBook/0211_Polynomial/Polynomial.h index 8a6204a..c0037c5 100644 --- a/VisualC++/CourseBook/0211_Polynomial/Polynomial.h +++ b/VisualC++/CourseBook/0211_Polynomial/Polynomial.h @@ -8,7 +8,9 @@ #define POLYNOMIAL_H #include -#include //ṩmallocreallocfreeexitԭ +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include // ṩva_listva_startva_argva_end #include "ELinkList.h" //**02 Ա**// /* һԪʽͶ */ @@ -24,12 +26,17 @@ typedef ELinkList Polynomial; * * ϵָΪmһԪʽ * + * *ע + * * ̲Ĭϴӿ̨ȡݡ * Ϊ˷ԣÿжֶݣ - * ѡ˴Ԥļpathжȡ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣҪдɱ + * ҪļжȡݣҪڿɱдļϢ(ļҪӴ"TestData") */ -void CreatPolyn(char path[], Polynomial *P, int m); +void CreatPolyn(Polynomial* P, int m, ...); /* * diff --git a/VisualC++/CourseBook/CourseBook.sdf b/VisualC++/CourseBook/CourseBook.sdf index e9c6980414692a80f8ff45ffd5bf0a665c3e654d..dba22fe21727e1275d874fd750a83e9de2ff01f7 100644 GIT binary patch delta 31235 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
;D+F> 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 QS$6trcKUiY`g%3}Ka8>3OaK4? delta 38438 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 diff --git a/VisualC++/CourseBook/CourseBook.suo b/VisualC++/CourseBook/CourseBook.suo index 1b0aa7f260b15f1101b2d5ccfbe8e4d39c272e2c..1375e7692b10029628f544d4a975828a3d761289 100644 GIT binary patch delta 1839 zcmY*Zdr*@{5dSv$0s&%5LaG4~5hA7~eaFcAkI_^5R-_5FwytfQ!q zRSuMD2dzb<^7vZQ+UfwoiViAjZLQOp+UX2ab(~rSAN>Qm7lYH@%zn4O-M!!L?cIIO zHiff8(Xd+dv;32^VAx@)P~0t7?hpiF7fF*cMHV2qNDCyvX1h^x1lknJfrM23mhQJY zWy&%_K|Tw1Ypn_py(q_Y!Vx0+ogy$lMA|&)iX1)a$&z!hQKMv!}OKRWp|?Xxrwb!2dy;4d>vFpw7$2mudjxa>f=ic9GoFg=X0E;x!$KY z(%eFV?eXt=13d&TlUySCfrKw^_syL&qcI^;$&Fnc*b;1B@RWm^1fv&3fgnhC6aEyj zb(t0qyi#l6{TJWfIkWKQsK~NMH@+73iB!GI_AVSk7?LbGC#Hz#5ywc~lWh@VET?MD zF`*;ZiYd8cU_18YW^jK{ExFE<(7?X2(abOj!tr8|pK=6Q;<%N%9#l+9f0X8VESmC0 zYJNXAcWOuKq=^HziYL@Fcis)B0u(ERb%F!?>`XKFUf%v^(jU5Ozv)_v(yKOW$c?s6 zKeQ~X&|Djuwk5@Uq3iCwWk*MOrtkLSYv&6qgmT=uWQXL;YgV9TrCwu^-wEyb^_Ic@ zFjik2Ef&6stLAY~LEl|$<5(DoN0!H+bB!VV;f31I4^|!@_MTb)@Z%sT_xor2_O9gSZXz3=Sdw@@g}2XRfVKq zWd>~5QfpT`16wJUA1qPyt}sMz&0tR$`4$c~lj?WTu>-qiTKP>mJZ|>b6R}|4fu3HVl^qz<5eE znWv-u!folJO+iqe3r1F&2@zNqJuoC+s6VyscJDXIM;?Fb>DJu6xi6SAHuUHzUCe7% z$+@LnCT93(B*%6uphr6fyLVK@@^=zLuVDmZw94UBbf;>P- zBeLl}LUa`UC}zE3FYZ)eYN;6=`@CHY>LE{m(;9EYN~V&zvj6TuuX&ZW=kc+hjz8%6 zEaSAw^I$hWH_SL1hT#Vd{H#8y#H$vyUOx7_A=_s}|MfCE0k&ivIPFiwyi`|dsxp&w ztFHvb1D+8#?Vw9pTCJQxXs*wNjxwiyIBlha41DnQ{R365M0Ad}paqX$71FgAO_P&s@C7S&IYCY-fF zbwe<=o=?KI=2?=ud9#00dz)UlnD{n$Iq47FeZOj$_m=T8ScMD>0sI;9zaDGMoCK#t z(7BA`@Z#lZtV9pvu)7A0$lqdf*lHn2o{_PTGnc&I9C>}pv#=)jo?}acf>RGBFJO1!9=ZF2=(+5_EUa! ze+}K)pps+Wok(1ENAKR61<%F*C+}hwJFGd}06KPH5yW{Bn=<}2^kaE>V3Y~MzmKYx AH2?qr delta 1585 zcmYLIeN0nV6z_Sw!Yf5=OQRhUhNWU1h1FJ(ImK#C*cd6*VAzC-ZgC?M6@u7*;3Fj~Q(Ck-22a%x3KT&&|qWmgvr_uk0o#=lp)>o{x9# zdET2!@1!!+$fxER{_$--DK_)RQiP}S85f+K3c3{vMJ5S)V`kBl?p7xJ8A&ESJIdkO zTr0+PRVqa~(X(XNX-^iPIznJtC$`SLo}vPtfLiv7o_R~O+BH7!KZUEM$pt#G%sK@b$*v@g23v>eGs^Ti$rB>JARUzL5b3kBjn`}| zOy3Z=EE88qe=FP9NMDz2G~4rpACkarcMJEEAYeBOk7OX;w*Sea*A)@HFFAR1<}McF zE8V#`S!YF0T@_yD7efFa)wxt4^;tw=(%jTzWPC+J2cIs@XQr1S2PZO9g@wcvODx@* zb%qT2mSO;*wjHgb8a(+pQ#*Qk$gw@_YP*;kD2+ybyUOFPSQUJnxD$P-*S@p+ugG`z z?shB7jvafm^WbSM&i~^%blh)1?}Kd0qSxLI95{NZ{I$_wf2aD^(D}|B>4xat98sd9 zzE3;<7>-7!kt6~pR$vqePaCQA**0L1l;Hh^DpcgOgs>i&BYUL&B^ddg4 zU4+98-z%@qAmb6EU?WsYlKAi&WK59ILG5%AMn?=dHKfaGP>8?wOjTaEWtgb=<$$ki zq%Khr9ozau!!|4M%cTe!3VIs7=}`jGYZ3Kin+c7})}v>82Mj0M)8P$ACXVdL!Tm9Z zzqYZr1YVHlCXVbJZ44qh4o=3-;%8yj!Y8eTts8Dv;taez1S#0(iFO z3rU+v7Rk7fv_-ayNxvxDi%Hu^>=N$Y;uJOQcKZKbrR3}70_ZvNBmc@wwWCp`P(^6V zjQa$QM%v+OnNb@lS#la@ZxxA_j%v>DYs64RHjd@fhks{e>HRIPN4T6hG?~%$&Bah$dpD%n$Xq1HYabOBha4IHwA?m>`44^niuUSp*f~LuP18W8)PRIB10++ff7b zBupznA?vSzJE%LO59@8PM9a^SI|zH6(2;uH1qEr$wF%y1c{Si-19o@|H@h_9j7?xv zss%;Y4&T;ksdH9X35OXs4=B;=aE4PUI*Iisv&A<;MhXkQ4G&mz4dk$4J8bG11QW~K k3dR3ZcxQu#l`W$_qcgm%gsQuXfoF|YusypwV1>c|00YoL*8l(j