需求:科研專案屬性增刪改查統計。可參考「鏈表通訊錄」架構擴充:將節點結構改為科研專案欄位,並加入檔案持久化、查詢索引、統計報表。
struct Project {
char id[20]; // 專案編號
char name[50]; // 專案名稱
char leader[20]; // 負責人
double budget; // 經費
int startYear, endYear; // 起訖年份
char status[10]; // 進行中/結案/延期
Project* next;
};
void addProject(Project** head);
void delProject(Project** head, const char* id);
void modifyProject(Project* head, const char* id);
Project* findProject(Project* head, const char* id);
void listProjects(Project* head);
void statByYear(Project* head, int year);
void saveToFile(Project* head, const char* filename);
void loadFromFile(Project** head, const char* filename);
id 不重複。fwrite/fread 整個結構體,或用 CSV/JSON 方便人工閱讀。status、year 分組。free 所有節點,防洩漏。switch 迴圈,輸入選項呼叫對應函數。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Project { ... }; // 如上
void addProject(Project** head) {
Project* p = (Project*)malloc(sizeof(Project));
printf("編號: "); scanf("%19s", p->id);
// 檢查重複
for (Project* cur = *head; cur; cur = cur->next)
if (strcmp(cur->id, p->id) == 0) { puts("編號重複"); free(p); return; }
printf("名稱: "); scanf("%49s", p->name);
printf("負責人: "); scanf("%19s", p->leader);
printf("經費: "); scanf("%lf", &p->budget);
printf("起始年份: "); scanf("%d", &p->startYear);
printf("結束年份: "); scanf("%d", &p->endYear);
strcpy(p->status, "進行中");
p->next = *head;
*head = p;
puts("新增成功");
}
// 其他函數同理...
int main() {
Project* head = NULL;
loadFromFile(&head, "projects.dat");
int opt;
while (1) {
puts("\n1.新增 2.刪除 3.修改 4.查詢 5.列表 6.統計 7.存檔 0.退出");
scanf("%d", &opt);
if (opt == 0) break;
switch (opt) {
case 1: addProject(&head); break;
case 2: { char id[20]; scanf("%19s", id); delProject(&head, id); } break;
case 3: { char id[20]; scanf("%19s", id); modifyProject(head, id); } break;
case 4: { char id[20]; scanf("%19s", id); Project* p=findProject(head,id); if(p) printf("找到: %s\n",p->name); else puts("不存在"); } break;
case 5: listProjects(head); break;
case 6: { int y; scanf("%d",&y); statByYear(head,y); } break;
case 7: saveToFile(head,"projects.dat"); puts("已存檔"); break;
}
}
saveToFile(head,"projects.dat");
// 釋放記憶體略
return 0;
}
以鏈表通訊錄為骨架,替換資料欄位並擴充統計/持久化,即可快速產出符合需求的科研管理系統原型。