代码

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <stdlib.h>enum
{READ_ONLY,HIDE,SYSTEM = 55,TEST
};typedef struct SUser
{int nNumb;char sName[20];float fMath;
}DATA;typedef struct SNode
{DATA data;SNode* pNext;
}NODE,*PNODE;SNode* g_pHead = NULL;void Save();
void Print();
//void SortByNumb();void AddTail(DATA data)
{SNode* pNew = (SNode*)malloc(sizeof(SNode));pNew->data = data;pNew->pNext = NULL;if (!g_pHead){g_pHead = pNew;return;}SNode* p = g_pHead;while (p->pNext)p = p->pNext;p->pNext = pNew;
}void AddHead(DATA data)
{SNode* p = (SNode*)malloc(sizeof(SNode));p->data = data;p->pNext = g_pHead;g_pHead = p;
}void Modify()
{int nNumb;printf("请输入要修改的学号:");scanf_s("%d", &nNumb);SNode* p = g_pHead;while (p){if (p->data.nNumb == nNumb)break;p = p->pNext;}if (!p){puts("你输入的学号不存在!");system("pause");return;}printf("%d\t%s\t%0.1f\n", p->data.nNumb, p->data.sName, p->data.fMath);printf("请输入姓名和成绩:");scanf_s("%s", p->data.sName, sizeof(p->data.sName));scanf_s("%f", &p->data.fMath);Save();Print();
}int DelNumber(int nNumb)
{SNode* p = g_pHead, *p1 = NULL;if (!p)return 0;if (p->data.nNumb == nNumb){g_pHead = p->pNext;free(p);return 1;}while (p){if (p->data.nNumb == nNumb){p1->pNext = p->pNext;free(p);return 1;}p1 = p;p = p->pNext;}return 0;
}void Delete()
{char c;do{int nNumb;printf("请输入要删除的学号:");scanf_s("%d", &nNumb);if (DelNumber(nNumb)){Save();Print();}else{puts("你输入的学号不存在!");}printf("是否继续删除?[y/n]");//setbuf(stdin, NULL);rewind(stdin);c = getchar();} while (c == 'y' || c == 'Y');
}void Load()
{DATA data;FILE* pf = fopen("stud.lv", "r");if (!pf){puts("加载信息时失败!");return;}while (fread(&data, 1, sizeof(DATA), pf) == sizeof(DATA)){AddTail(data);}fclose(pf);
}void Save()
{SNode* p = g_pHead;FILE* pf = fopen("stud.lv", "w");if (!pf){puts("保存文件时失败!");return;}while (p){fwrite(p, 1, sizeof(p->data), pf);//fwrite(&p->data, 1, sizeof(p->data), pf);p = p->pNext;}fclose(pf);
}void Print()
{system("cls");puts("学号\t姓名\t成绩");int i = 0;SNode* p = g_pHead;while (p){printf("%d\t%s\t%0.1f\n", p->data.nNumb,p->data.sName,p->data.fMath);p = p->pNext;++i;}printf("\t总共有 %d 条记录\n", i);system("pause");
}void Input(int nDir)
{int nNumb;printf("请输入学号:");scanf_s("%d", &nNumb);DATA data;data.nNumb = nNumb;printf("请输入姓名:");scanf_s("%s", data.sName, sizeof(data.sName));printf("请输入成绩:");scanf_s("%f", &data.fMath);if (1 == nDir)AddHead(data);elseAddTail(data);Save();Print();
}int AddMenu()
{puts("1.向头部插入");puts("2.向尾部插入");puts("0.返回主菜单");int i = 0;scanf_s("%d", &i);switch (i){case 1:case 2:Input(i);break;}return i;
}int Judge(SNode* q, SNode* m, int nIndex)
{if (1 == nIndex)return q->data.nNumb < m->data.nNumb;if (2 == nIndex)return strcmp(q->data.sName, m->data.sName) < 0;if (3 == nIndex)return q->data.fMath > m->data.fMath;return 0;
}/*
void Sort(int nIndex)
{SNode* p = g_pHead;if (!p)return;while (p->pNext){SNode* q = p->pNext;SNode* m = p;while (q){if (Judge(q,m,nIndex))m = q;q = q->pNext;}if (m != p){DATA t = p->data;p->data = m->data;m->data = t;} p = p->pNext;}
}
*/void PrintS(SNode* *ps)
{system("cls");puts("学号\t姓名\t成绩");int i = 0;while (ps[i]){SNode* p = ps[i]; // ps[i]都是SNode*类型printf("%d\t%s\t%0.1f\n", p->data.nNumb, p->data.sName, p->data.fMath);++i;}printf("\t总共有 %d 条记录\n", i);system("pause");}void Sort(int nIndex)
{SNode* p = g_pHead;if (!p)return;SNode* ps[100] = { 0 }; // 链表节点指针int n = 0, i = 0;while (p){ps[n] = p;p = p->pNext;++n;}while (i < n-1){int j = i + 1;int m = i;while (j < n){//if (ps[j]->data.nNumb < ps[m]->data.nNumb)if(Judge(ps[j],ps[m],nIndex))m = j;++j;}if (m != i) // 链表外排序{SNode* t = ps[i];ps[i] = ps[m];ps[m] = t;}++i;}PrintS(ps);
}int SortMenu()
{system("cls");puts("1.按学号排序");puts("2.按姓名排序");puts("3.按成绩排序");puts("4.不排序");puts("0.返回主菜单");int i = 0;scanf_s("%d", &i);switch (i){case 1:case 2:case 3:Sort(i);break;case 4:Print();default:return i;}return i;
}int Menu()
{int i = 0;system("cls");puts("1.浏览所有信息");puts("2.添加信息");puts("3.删除信息");puts("4.修改信息");puts("5.查找信息");puts("6.颜色设置");puts("0.退出");printf("请选择:");scanf_s("%d", &i);switch (i){case 0:break;case 1:while (SortMenu());break;case 2:while (AddMenu());break;case 3:Delete();break;case 4:Modify();break;}return i;
}int main()
{Load();//int i = SYSTEM;//int j = TEST;//int k = HIDE;while (Menu());return 0;
}

C语言实用算法系列之学生管理系统_单向链表外排序_栈内数组存储链表节点指针相关推荐

  1. C语言实用算法系列之学生管理系统_单向链表内操作_选择排序

    单向链表实现 #include <stdio.h> #include <malloc.h>typedef int DATA;struct SNode {DATA data;SN ...

  2. C语言实用算法系列之学生管理系统_单向链表内操作_提取排序规则

    代码 后续文章的排序均采用速度较快的选择排序算法. #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <strin ...

  3. C语言实用算法系列之学生管理系统_对整个结构体操作_冒泡排序_提取排序规则

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <st ...

  4. C语言实用算法系列之学生管理系统_对整个结构体操作_选择排序_提取排序规则

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <st ...

  5. C语言实用算法系列之学生管理系统_对整个结构体操作_冒泡排序

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> void Save();str ...

  6. 【终极完美高效】C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针_函数指针数组

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <st ...

  7. C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针_函数指针+switch

    函数指针简介 #include <stdio.h>int add(int a, int b) {return a + b; }int dec(int a, int b)

  8. C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针

    代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <st ...

  9. 【总结】C语言实用算法系列之知识点梳理_附学生管理系统各模块代码

    1.内存四区特点 a)全局区变量空间缺省每个字节为00,栈空间缺省是cc,堆缺省是cd b)堆.全局区(静态区).字符串常量区,与栈区空间的位置距离很大,栈区访问速度可能最快: 2.C语言与C++编译 ...

最新文章

  1. linux系统版本间的区别是什么?内核又是什么
  2. C# 利用反射调用类下的方法
  3. 《LeetCode力扣练习》第21题 合并两个有序链表 Java
  4. oracle rman 架构图,图解Oracle RMAN备份入门
  5. 使用Tomcat Native提升Tomcat IO效率
  6. html 登陆sql server,jsp实现注册与登录页面+sqlsever2008
  7. Scrapy 教程(十)-管道与数据库
  8. Mybatis 一对多关联查询collection用法
  9. 5 万人在家办公,如何高效协同?字节跳动提供了一份指南
  10. chrome 打印布局_在打印预览模式下使用Chrome的Element Inspector?
  11. 区块链 solidity 快排
  12. 猫癣病毒躲猫猫移师广东东莞月入百万作者
  13. vs2017激活密钥
  14. 百度贴吧一键签到工具(android版)
  15. 陪集分解和J.Lagrange定理的一些应用
  16. 淘宝运营 淘宝客的模式 、优点以及推广方案
  17. sklearn实现决策树,随机森林,逻辑回归,KNN,贝叶斯,SVM,以葡萄干数据集为例
  18. 大牛手把手教你!Service有几种启动方式?吐血整理
  19. 自动驾驶之车辆运动学与动力学模型
  20. 斐波那契数列的前N项和

热门文章

  1. Devoxx 2012:Java 8 Lambda和并行性,第1部分
  2. JSON用于多态Java对象序列化
  3. Java并发教程–重入锁
  4. python win10 桌面_Python3如何实现Win10桌面自动切换
  5. macOS如何使用命令启动服务/停止服务/查看服务
  6. Sublime Text 设置在标签页中打开文件
  7. window部署python项目_Django在Window下的部署
  8. 反射与泛型 java_Java的反射 和 泛型的一个问题
  9. oracle数据库sqlloader,sql loader ---ORACLE SQLLDR
  10. 计算机网络技术教法改革方案,计算机网络技术专业教学模式改革探索