|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <stdio.h>
- #include <stdlib.h>
-
- struct Date
- {
- int year;
- int month;
- int day;
- };
-
- struct Event
- {
- char content[128];
- struct Date date;
- struct Event *next;
- };
-
- void getInput(struct Event *event)
- {
- printf("日期(yy-mm-dd):");
- scanf("%d-%d-%d", &event->date.year, &event->date.month, &event->date.day);
- printf("事件:");
- scanf("%s", event->content);
- }
-
- void addEvent(struct Event **memo)
- {
- struct Event *event;
- static struct Event *tail;
-
- event = (struct Event *)malloc(sizeof(struct Event));
- if (event == NULL)
- {
- printf("内存分配失败!\n");
- exit(1);
- }
-
- getInput(event);
-
- if (*memo != NULL)
- {
- tail->next = event;
- event->next = NULL;
- }
- else
- {
- *memo = event;
- event->next = NULL;
- }
-
- tail = event;
- }
-
- void printMemo(struct Event *memo)
- {
- struct Event *event;
-
- event = memo;
- while (event != NULL)
- {
- printf("日期:%d-%d-%d\n", event->date.year, event->date.month, event->date.day);
- printf("事件:%s\n", event->content);
- event = event->next;
- }
- }
-
- void printEvent(struct Event *event)
- {
- printf("日期:%d-%d-%d\n", event->date.year, event->date.month, event->date.day);
- printf("事件:%s\n", event->content);
- }
-
- int cmpDate(struct Date d1, struct Date d2)
- {
- if (d1.year == d2.year && d1.month == d2.month && d1.day == d2.day)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
-
- struct Event *searchEvent(struct Event *memo, struct Date date)
- {
- struct Event *event;
-
- event = memo;
- while (event != NULL)
- {
- if (cmpDate(event->date, date))
- {
- break;
- }
- event = event->next;
- }
-
- return event;
- }
-
- void releaseMemo(struct Event *memo)
- {
- struct Event *temp;
-
- while (memo != NULL)
- {
- temp = memo;
- memo = memo->next;
- free(temp);
- }
- }
-
- int main()
- {
- struct Event *memo = NULL;
- struct Event *event = NULL;
- struct Date date;
- char ch;
-
- printf("\n====== 录入功能测试 ======\n");
- while (1)
- {
- printf("是否添加记录(Y/N):");
- do
- {
- ch = getchar();
- } while (ch != 'Y' && ch != 'N');
-
- if (ch == 'Y')
- {
- addEvent(&memo);
- }
- else
- {
- break;
- }
- }
-
- printf("\n====== 查找功能测试 ======\n");
- printf("请输入日期:");
- scanf("%d-%d-%d", &date.year, &date.month, &date.day);
- event = searchEvent(memo, date);
- if (event == NULL)
- {
- printf("很抱歉,没能找到!\n");
- }
- else
- {
- do
- {
- printf("已经找到该日期的事件...\n");
- printEvent(event);
- } while((event = searchEvent(event->next, date)) != NULL);
- }
-
- printf("\n====== 打印功能测试 ======\n");
- printMemo(memo);
-
- releaseMemo(memo);
-
- return 0;
- }
复制代码
将以上单链表数据结构改成顺序线性表数据结构
要将以上单链表数据结构改为顺序线性表数据结构,需要将链表中的指针改为数组,并且增加一个变量来记录当前列表的长度。
首先,定义一个常量来表示列表的最大容量:
然后,修改`struct Event`结构体,将指针改为数组:
- struct Event
- {
- char content;
- struct Date date;
- };
- struct Event memo[MAX_SIZE];
- int length = 0; // 记录当前列表长度
复制代码
接下来,修改`getInput`函数,使其能够根据当前列表的长度动态获取输入的位置:
- void getInput()
- {
- printf("日期(yy-mm-dd):");
- scanf("%d-%d-%d", &memo[length].date.year, &memo[length].date.month, &memo[length].date.day);
- printf("事件:");
- scanf("%s", &memo[length].content);
- length++;
- }
复制代码
然后,修改`addEvent`函数,使其添加事件到顺序线性表中:
- void addEvent()
- {
- if (length >= MAX_SIZE)
- {
- printf("列表已满,无法添加新事件!\n");
- return;
- }
-
- getInput();
- }
复制代码
接着,修改`printMemo`函数和`printEvent`函数,使其能够打印顺序线性表中的事件:
- void printMemo()
- {
- for (int i = 0; i < length; i++)
- {
- printf("日期:%d-%d-%d\n", memo[i].date.year, memo[i].date.month, memo[i].date.day);
- printf("事件:%s\n", &memo[i].content);
- }
- }
- void printEvent(struct Event event)
- {
- printf("日期:%d-%d-%d\n", event.date.year, event.date.month, event.date.day);
- printf("事件:%s\n", &event.content);
- }
复制代码
最后,根据以上修改,对`main`函数进行相应的调整:
- int main()
- {
- struct Date date;
-
- printf("\n====== 录入功能测试 ======\n");
- char ch;
- while (1)
- {
- printf("是否添加记录(Y/N):");
- do
- {
- ch = getchar();
- } while (ch != 'Y' && ch != 'N');
- if (ch == 'Y')
- {
- addEvent();
- }
- else
- {
- break;
- }
- }
- printf("\n====== 查找功能测试 ======\n");
- printf("请输入日期:");
- scanf("%d-%d-%d", &date.year, &date.month, &date.day);
- int found = 0; // 记录是否找到事件
- for (int i = 0; i < length; i++)
- {
- if (cmpDate(memo[i].date, date))
- {
- found = 1;
- printf("已经找到该日期的事件...\n");
- printEvent(memo[i]);
- }
- }
- if (!found)
- {
- printf("很抱歉,没能找到!\n");
- }
- printf("\n====== 打印功能测试 ======\n");
- printMemo();
- return 0;
- }
复制代码
现在,你就可以使用修改后的顺序线性表数据结构进行录入、查找和打印功能的测试了。注意,由于顺序线性表有固定的最大容量,如果添加事件超过了最大容量会提示错误信息。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
|
|