前天帮一个小学妹修改了下代码,用链表实现的,功能估计是最简单的了.没啥技术含量.中间涉及到了指针,结构体,文件操作.对于刚学习完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;
}
运行结果: