#pragma warning(disable : 4996) #define _CRT_SECURE_NO_WARNINGS #include#include #include // ----- 线性表的链式表示与实现 ------- //单链表的类型声明 typedef int Status; #define OK 1 #define ERROR 0 struct Student { char name[20]; int num; int yw;//语文 int sx;//数学 int yy;//英文 int wl;//物理 double ave;//平均值 }; typedef Student ElemType; typedef struct node { ElemType data; struct node* next; }LNode, * linkList; //初始表 Status InitList(linkList& L) { L = (linkList)malloc(sizeof(LNode)); if (!L) return ERROR; L->next = NULL; return OK; } //指定位置插入元素 Status ListInsert(linkList& L, int i, ElemType e) { linkList p, s; p = L; int j = 0; while (p && j < i - 1) { // 寻找第i-1个结点 p = p->next; ++j; } if (!p || j > i - 1) return ERROR; // i小于1或者大于表长 s = (linkList)malloc(sizeof(LNode)); // 生成新结点 if (!s) return ERROR; s->data = e; s->data.ave = 0; s->next = p->next; // 插入L中 p->next = s; return OK; } //显示内容的算法 void ShowAddress(linkList L) { int i; linkList p = L->next; if (p == NULL) return; for (i = 1; p != NULL; i++) { ElemType e=p->data; printf("%dt%st%dt%dt%dt%dt%.2lfn", e.num, e.name, e.sx, e.wl, e.yw, e.yy, e.ave); p = p->next; } } // 统计平均值 void StatisticalAverage(linkList &L) { int i; linkList p = L->next; if (p == NULL) return; for (i = 1; p != NULL; i++) { ElemType e = p->data; p->data.ave=(double)(e.sx + e.wl + e.yw + e.yy) / 4; p = p->next; } } //查找通过姓名 Status LocateElem(linkList L, char name[]) { linkList p = L->next; while (p) { if (strcmp(p->data.name, name) == 0) { ElemType e = p->data; printf("%dt%st%dt%dt%dt%dt%.2lfn", e.num, e.name, e.sx, e.wl, e.yw, e.yy,e.ave); return OK; } p = p->next; } return ERROR; } void SaveElem(linkList L) { FILE* fstream; fstream = fopen("stu.txt", "w"); if (fstream == NULL) { printf("open file test.txt failed!n"); exit(1); } printf("保存到stu.txtn"); int i; linkList p = L->next; if (p == NULL) return; for (i = 1; p != NULL; i++) { ElemType e = p->data; fprintf(fstream,"%dt%st%dt%dt%dt%dt%.2lfn", e.num, e.name, e.sx, e.wl, e.yw, e.yy, e.ave); p = p->next; } fclose(fstream); } void OpenFile(linkList& L)//尾插法加载数据 { FILE* fstream; fstream = fopen("stu.txt", "r"); if (fstream == NULL) { printf("open file test.txt failed!n"); exit(1); } L = (linkList)malloc(sizeof(LNode)); L->next = NULL; linkList p, last; last = L; while (1) { ElemType e; if (EOF != fscanf(fstream, "%d%s%d%d%d%d%lf", &e.num, e.name, &e.sx, &e.wl, &e.yw, &e.yy, &e.ave)) { p = (linkList)malloc(sizeof(LNode)); // 生成新结点 if (!p)//分配失败 { return; } p->data =e; p->next = NULL; last->next = p; // 尾插法 last = p; p->next = NULL; } else break; } fclose(fstream); } int main() { ElemType e; linkList L; InitList(L); strcpy(e.name, "丁一"); e.num = 1001; e.sx = 90; e.wl = 80; e.yw = 77; e.yy = 67; ListInsert(L,1,e); strcpy(e.name, "丁二"); e.num = 1002; e.sx = 92; e.wl = 80; e.yw = 77; e.yy = 62; ListInsert(L, 1, e); strcpy(e.name, "丁三"); e.num = 1003; e.sx = 93; e.wl = 80; e.yw = 73; e.yy = 67; ListInsert(L, 1, e); strcpy(e.name, "丁四"); e.num = 1004; e.sx = 94; e.wl = 84; e.yw = 77; e.yy = 67; ListInsert(L, 1, e); strcpy(e.name, "丁五"); e.num = 1005; e.sx = 90; e.wl = 85; e.yw = 75; e.yy = 67; ListInsert(L, 1, e); strcpy(e.name, "丁六"); e.num = 1006; e.sx = 90; e.wl = 86; e.yw = 77; e.yy = 67; ListInsert(L, 1, e); strcpy(e.name, "丁七"); e.num = 1007; e.sx = 90; e.wl = 87; e.yw = 77; e.yy = 67; ListInsert(L, 1, e); ShowAddress(L); char name[20]; printf("输入要查找的人的姓名:"); scanf("%s",name); if (LocateElem(L,name) == 0) printf("没有找到相关信息~!n"); printf("统计平均成绩:n"); StatisticalAverage(L); ShowAddress(L); printf("保存到文件中:n"); SaveElem(L); linkList L1; InitList(L1); printf("读取stu.txt中的数据给L1n"); OpenFile(L1); ShowAddress(L); return 0; }



