前天帮一个小学妹修改了下代码,用链表实现的,功能估计是最简单的了.没啥技术含量.中间涉及到了指针,结构体,文件操作.对于刚学习完C语言的同学可以练习一下.
直接上代码
#include <stdio.h> #include <stdlib.h> #include <string.h> struct Info { char ID[20]; char name[20]; char sex[10]; int age; //int clanguage; }; typedef struct Stu { struct Info stu; struct Stu *pNext; } Student, *pStudent; /* 链表的操作: 1、创建节点数据结构 2、创建链表头 3、创建节点并在节点中存放学员信息 4、遍历显示 */ /*************************************************************** 功能:创建链表头 传参:无 返回值:需要返回创建头结点的首地址 ***************************************************************/ pStudent CreateHead() { pStudent phead = (pStudent)malloc(sizeof(Student)); phead->pNext = NULL; phead->stu.age = 0; //phead->stu.name = " "; strcpy(phead->stu.ID, " "); strcpy(phead->stu.name, " "); strcpy(phead->stu.sex, " "); return phead; } /*************************************************************** 功能:创建节点并在节点中存放学员信息 传参:传递学员信息结构 返回值:需要返回创建结点的首地址 ***************************************************************/ pStudent CreateInode(struct Info info) { pStudent pnew = (pStudent)malloc(sizeof(Student)); pnew->pNext = NULL; pnew->stu = info; return pnew; } /*************************************************************** 功能:头插法 传参:传递学员信息结构,还需要头结点的首地址 返回值:无返回值 ***************************************************************/ void InsertHead(struct Info info, pStudent head) { pStudent InsertNode = CreateInode(info);//若存在则不存入学员信息// InsertNode->pNext = head->pNext; head->pNext = InsertNode; } /*************************************************************** 功能:尾插法 传参:传递学员信息结构,还需要头结点的首地址 返回值:无返回值 ***************************************************************/ void InsertEnd(struct Info info, pStudent head) { pStudent pmove = head; pStudent InsertNode = CreateInode(info); while (pmove->pNext != NULL) { pmove = pmove->pNext; } pmove->pNext = InsertNode; InsertNode->pNext = NULL; } /*************************************************************** 功能:查找 传参:传递查找学员信息结构,还需要头结点的首地址 返回值:返回查找到的学员信息结构首地址 ***************************************************************/ pStudent SeekInfo(struct Info info, pStudent head) { pStudent pmove = head->pNext; while (pmove != NULL) { if (strcmp(pmove->stu.ID, info.ID) == 0) { break; } pmove = pmove->pNext; } return pmove; } /*************************************************************** 功能:修改信息 传参:传递查找学员信息结构,还需要头结点的首地址,修改信息 返回值:void ***************************************************************/ void ChangeInfo(struct Info info, pStudent head, struct Info info1) { pStudent tmp = SeekInfo(info, head); if(tmp==NULL){ printf("要修改学生的ID不存在,修改失败!\n"); }else{ tmp->stu = info1; printf("修改成功!\n"); } } /*************************************************************** 功能:删除信息 传参:传递查找学员信息结构,还需要头结点的首地址 返回值:void ***************************************************************/ void DeleteInfo(struct Info info, pStudent head) { pStudent pmove = head->pNext; pStudent ptmp = head;//辅助节点. if (pmove == NULL) { printf("学生表为空,无法进行删除操作\n"); return; } while (pmove!=NULL){ if(strcmp(pmove->stu.ID,info.ID)==0){ break; } ptmp = pmove; pmove=pmove->pNext; } if (pmove == NULL){ printf("查无此人,删除失败!\n"); }else{ ptmp->pNext = pmove->pNext; free(pmove); printf("删除成功!\n"); } } /*************************************************************** 功能:打印所有节点的信息 传参:需要头结点的首地址 返回值:无返回值 ***************************************************************/ void Print(pStudent head) { pStudent pmove = head->pNext; while (pmove != NULL) { printf("ID:%s\tname:%s\tsex:%s\tage=%d\n",pmove->stu.ID, pmove->stu.name,pmove->stu.sex, pmove->stu.age); pmove = pmove->pNext; } } /*************************************************************** 功能:将学员信息写入文件 传参:需要头结点的首地址 返回值:无返回值 ***************************************************************/ void SaveFile(pStudent head) { FILE *fp = fopen("student.txt", "a+"); pStudent pmove = head->pNext; while (pmove != NULL) { //ID:%s\tname:%s\tsex:%sage=%d\n fprintf(fp, "ID:%s\tname:%s\tsex:%sage=%d\n", pmove->stu.ID,pmove->stu.name,pmove->stu.sex, pmove->stu.age); pmove = pmove->pNext; } fclose(fp); } void help() { printf("此学员管理系统功能包括学员信息的增删改查\n通过键入1添加学生信息\n键入2查询学生信息\n键入3修改学生信息\n键入4按学号删除信息\n键入5显示学生信息\n键入6保存当前学生信息\n键入7退出系统\n"); } /*************************************************************** 功能:菜单显示 传参:无需传参 返回值:返回选项数字 ***************************************************************/ int menu() { int num; printf("\t -----------------------------------\n"); printf("\t ---------学员信息管理系统----------\n"); printf("\t ------- 1.添加学生信息--------------\n"); printf("\t ---------2.查询学生信息--------------\n"); printf("\t ---------3.修改学生信息------------\n"); printf("\t ---------4.按学号删除信息--------\n"); printf("\t ---------5.显示学生信息---------\n"); printf("\t ---------6.保存当前学生信息-----\n"); printf("\t ---------7.退出菜单-----------\n"); p: printf("请输入操作选项0-7\n"); scanf("%d", &num); if (num >= 8 || num < 0) { printf("请重新输入\n"); goto p; } return num; } int main() { int num = 0; struct Info info, info1; pStudent tmp; pStudent phead = CreateHead(); while (1) { num = menu(); switch (num) { case 0:help(); break; case 1: char ch; printf("请输入学员信息ID---name---sex---age\n"); scanf("%s%s%s%d", info.ID,info.name,info.sex, &info.age); InsertHead(info, phead); break; case 2:printf("请输入查找学员ID\n"); scanf("%s", info.ID); tmp = SeekInfo(info, phead); if(tmp!=NULL){ printf("ID:%s\tname:%s\tsex:%s\tage=%d\n",tmp->stu.ID, tmp->stu.name,tmp->stu.sex, tmp->stu.age); }else{ printf("查无此人!\n"); } //printf("name:%s\tage=%d\n", tmp->stu.name, tmp->stu.age); break; case 3: printf("请输入查找学员学号ID\n"); scanf("%s", info.ID); //scanf("%s%s%s%d", info.ID,info.name,info.sex, &info.age); printf("请输入修改后的学员信息:ID---name---sex---age\n"); //scanf("%s%d", info1.name, &info1.age); scanf("%s%s%s%d", info1.ID,info1.name,info1.sex, &info1.age); ChangeInfo(info, phead, info1); break; case 4:printf("请输入删除学员ID\n"); scanf("%s", info.ID); DeleteInfo(info, phead); break; case 5:Print(phead); break; case 6:SaveFile(phead); break; case 7: return 0; break; } } system("pause"); return 0; }
运行结果: