📄 david.cpp
字号:
#include <iostream.h> // cin 及 cout
#include <malloc.h> // 用到申请内存函数 malloc() 和释放内存函数 free()
#include <string.h> // 字符串处理
#include <stdio.h> // 文件操作(读文件)
#include <stdlib.h> // system("cls")
struct data //个人档案
{
char birthday[12]; //出生年月
char sex[10] ; //性别
char JD[15]; //家庭电话
char SJ[15]; //手机号码
char address[20]; //家庭住址
char XL[19]; //学历
};
struct score //成绩
{
char english[20];
char computer[20];
char maths[20];
char physics[20];
};
struct room //宿舍信息
{
char room_addr[20]; //宿舍地址
char room_num[15]; //宿舍号码
char room_tel[15]; //宿舍电话
};
typedef struct Node //定义节点的类型
{
char name[20]; //名字
char number[20]; //学号
struct score sc; //成绩
struct data da; //个人档案
struct room ro; //宿舍信息
struct Node* next;
}LinkList;
class List //定义一个List类
{
private:
LinkList* head;
public:
List();
~List();
Node* creatlist(int); //创建链表
int listlen(); //返回链表长度
LinkList* findnode(int); //通过查找序号返回节点的指针
LinkList* find(char c[]); //通过查找姓名返回节点的指针
int find2(char c[]); //通过查找姓名返回节点的序号
LinkList* find3(char c[]); //通过查找学号返回节点的指针
LinkList* insnode(int); //插入节点
void delnode(int); //删除节点
LinkList* load(); //初始化:从外部读入数据
void readstr(FILE *f,char *string); //读行函数
bool check(char *a, char *b); //对比两个字符串是否相等
void menu(); //显示主菜单
void editdata(LinkList*); //编辑个人档案
void editscore(LinkList*); //编辑学科成绩
void editroom(LinkList*); //编辑宿舍信息
void dispname(); //显示所有学生姓名
void dispnode(LinkList*); //显示一个学生的所有信息
void dispdata(LinkList*); //显示一个学生的个人档案
void dispscore(LinkList*); //显示一个学生的学科成绩
void disproom(LinkList*); //显示一个学生的宿舍信息
};
List::List()
{
head = NULL;
}
bool List::check(char *a, char *b) //对比两个字符串是否相等
{
int i;
int j=strlen(b);
for(i=0; i<j; i++)
{
if(*a==*b)
{
a++;
b++;
}
else
return 0;
}
return 1;
}
LinkList * List::creatlist (int n) //创建链表
{
LinkList *h=NULL, *p, *q;
int i=1;
for(int j=0; j<n; j++)
{
if(i==1) //创建第一个节点
{
h=(LinkList*)malloc(sizeof(LinkList));
h->next=NULL;
q=h;
}
else //创建其余节点
{
p=(LinkList*)malloc(sizeof(LinkList));
p->next=NULL;
q->next=p;
q=p; //q 始终指向生成的单链表的最后一个节点
}
i++;
}
head=h;
return h;
}
void List::readstr(FILE *f,char *string)
{
do
{ //先读入一行文本
fgets(string, 255, f); //fgets(): 从文件 f 读入长度为 255-1 的字符串并存入到 string 中
} while ((string[0] == '/') || (string[0] == '\n'));
return;
}
LinkList* List::load()
{
FILE *fp;
LinkList *p;
char c[255];
int num;
if((fp=fopen("student.txt", "r"))==NULL)
{
cout<<"打开文件失败"<<endl;
return 0;
}
readstr(fp, c);
sscanf(c, "The Length Of Link: %d", &num); //获取链表长度
p=creatlist(num); //创建链表
for(int i=0; i<num; i++)
{
readstr(fp, c);
strcpy(p->name, c);
readstr(fp, c);
strcpy(p->number, c);
readstr(fp, c);
strcpy(p->da.birthday, c);
readstr(fp, c);
strcpy(p->da.sex, c);
readstr(fp, c);
strcpy(p->da.JD, c);
readstr(fp, c);
strcpy(p->da.SJ, c);
readstr(fp, c);
strcpy(p->da.address, c);
readstr(fp, c);
strcpy(p->da.XL, c);
readstr(fp, c);
strcpy(p->sc.english, c);
readstr(fp, c);
strcpy(p->sc.computer, c);
readstr(fp, c);
strcpy(p->sc.maths, c);
readstr(fp, c);
strcpy(p->sc.physics, c);
readstr(fp, c);
strcpy(p->ro.room_addr, c);
readstr(fp, c);
strcpy(p->ro.room_num, c);
readstr(fp, c);
strcpy(p->ro.room_tel, c);
p=p->next;
}
fclose(fp);
return p;
}
void List::dispnode(LinkList* p) //显示一个学生的所有信息
{
if(p!=NULL)
{
dispdata(p);
dispscore(p);
disproom(p);
}
}
void List::dispname() //显示所有学生姓名
{
LinkList* p=head;
cout<<"现有的学生: "<<endl;
if(p==NULL)
cout<<"没有任何学生数据"<<endl;
while(p!=NULL)
{
cout<<"姓名: "<<p->name;
p=p->next;
}
}
int List::listlen() //返回链表长度
{
int i=0;
LinkList* p=head;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
LinkList* List::findnode (int i) //通过查找序号返回节点的指针
{
LinkList* p=head;
int j=1;
if( i>listlen()||i<=0 ) // i 上溢或下溢
return NULL;
else
{
while( p!=NULL && j<i ) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return p;
}
}
LinkList* List::find(char c[]) //通过查找姓名返回节点的指针
{
LinkList* p=head;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->name))) //查找第 i 个节点并由 p 指向该节点
p=p->next;
return p;
}
int List::find2(char c[]) //通过查找姓名返回节点的序号
{
LinkList* p=head;
int j=1;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->name))) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return j;
}
LinkList* List::find3(char c[]) //通过查找学号返回节点的指针
{
LinkList* p=head;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->number))) //查找第 i 个节点并由 p 指向该节点
p=p->next;
return p;
}
LinkList* List::insnode(int i)
{
LinkList *h=head, *p, *s;
s=(LinkList*)malloc(sizeof(LinkList)); //创建节点 s
s->next=NULL;
if(i==0) //i=0 时 s 作为该单链表的第一个节点
{
s->next = h;
h=s; //重新定义头节点
}
else
{
p=findnode(i); //查找第 i 个节点,并由 p 指向该节点
if(p!=NULL)
{
s->next=p->next;
p->next=s;
}
else cout<<"输入的 i 值不正确"<<endl;
}
head=h;
return s;
}
void List::delnode(int i) //删除第 i 个节点
{
LinkList *h=head, *p=head, *s;
int j=1;
if(i==1) //删除第一个节点
{
h=h->next;
free(p);
}
else
{
p=findnode(i-1); //查找第 i-1 个节点,并由 p 指向这个节点
if(p!=NULL && p->next!=NULL)
{
s=p->next; // s 指向要删除的节点
p->next=s->next;
free(s);
}
else
cout<<"输入的 i 值不正确"<<endl;
}
head=h;
}
void List::editdata(LinkList* p) //编辑学生档案
{
char c[20];
cout<<"请输入姓名: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->name, c);
cout<<"请输入学号: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->number, c);
cout<<"请输入生日(格式举例:1986-02-17): "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->da.birthday, c);
cout<<"请输入性别:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->da.sex, c);
cout<<"请输入家庭电话:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->da.JD, c);
cout<<"请输入手机号码:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->da.SJ, c);
cout<<"请输入家庭住址(例如:江苏省通州市青年路22号)"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->da.address, c);
cout<<"请输入学历:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->da.XL, c);
cout<<"编辑个人档案完成!"<<endl;
dispdata(p);
}
void List::editscore(LinkList* p) //编辑学生成绩
{
char a[20];
cout<<"请输入英语成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->sc.english, a);
cout<<"请输入计算机成绩: "<<endl;
cin>>a;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -