📄 list.cpp
字号:
#include "list.h"
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;
}
nodetype* List::creatlist (int n) //创建链表
{
nodetype *h=NULL, *s, *t;
int i=1;
for(int j=0; j<n; j++)
{
if(i==1) //创建第一个节点
{
h=(nodetype*)malloc(sizeof(nodetype));
h->next=NULL;
t=h;
}
else //创建其余节点
{
s=(nodetype*)malloc(sizeof(nodetype));
s->next=NULL;
t->next=s;
t=s; //t 始终指向生成的单链表的最后一个节点
}
i++;
}
head=h;
return h;
}
void List::readstr(FILE *f,char *string)
{
do
{
//先读入一行文本
fgets(string, 256, f); //fgets(): 从文件 f 读入长度为 256-1 的字符串,并存入到 string 中
} while ((string[0] == '/') || (string[0] == '\n'));
return;
}
nodetype* List::load() //将硬盘里的文件载入到内存中(程序当中调用)
{
FILE *fp;
nodetype *p;
char c[256];
int num;
if((fp=fopen("通信录.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->pe.name, c);
readstr(fp, c);
strcpy(p->pe.sex, c);
readstr(fp, c);
strcpy(p->pe.address, c);
readstr(fp, c);
strcpy(p->te.mobill, c);
readstr(fp, c);
strcpy(p->te.JTtel, c);
p=p->next;
}
fclose(fp);
return p;
}
void List::dispnode(nodetype* p) //显示一个成员的所有信息
{
if(p!=NULL)
{
dispperson(p);
disptelephone(p);
}
}
void List::dispname() //显示所有成员姓名
{
nodetype* p=head;
cout<<"通信录中现有的成员: "<<endl;
if(p==NULL)
cout<<"通信录中没有任何成员数据!"<<endl;
while(p!=NULL)
{
cout<<"姓名: "<<p->pe.name;
p=p->next;
}
}
int List::listlen() //返回链表长度
{
int i=0;
nodetype* p=head;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
nodetype* List::findnode (int i) //通过查找序号返回节点的指针
{
nodetype* 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;
}
}
nodetype* List::find1(char c[]) //通过查找姓名返回节点的指针
{
nodetype* p=head;
int j=1;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->pe.name))) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return p;
}
int List::find2(char c[]) //通过查找姓名返回节点的序号
{
nodetype* p=head;
int j=1;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->pe.name))) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return j;
}
nodetype* List::insnode(int i) //插入第i个结点
{
nodetype *h=head, *p, *s;
s=(nodetype*)malloc(sizeof(nodetype)); //创建节点 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<<"输入的值不正确!"<<endl;
}
head=h;
return s;
}
void List::delnode(int i) //删除第 i 个节点
{
nodetype *h=head, *p=head, *s;
int j=1;
if(i==1) //删除第一个节点
{
cout<<"通信录中该成员记录已成功删除!"<<endl;
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<<"通信录中无此人!"<<endl;
}
head=h;
}
void List::editperson(nodetype* p) //编辑个人信息
{
char c[100];
cout<<"请输入姓名: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.name, c);
cout<<"请输入性别(男/女):"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.sex, c);
cout<<"请输入家庭住址:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pe.address, c);
dispperson(p);
edittelephone(p);
cout<<"完成个人信息的编辑!"<<endl;
cout<<endl;
}
void List::edittelephone(nodetype* p) //编辑联系方式
{
char c[50];
cout<<"请输入手机号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->te.mobill, c);
cout<<"请输入家庭电话号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->te.JTtel, c);
cout<<"完成联系方式的编辑!"<<endl;
cout<<endl;
disptelephone(p);
}
void List::dispperson(nodetype* p) //显示个人信息
{
cout<<"*****************************************"<<endl;
cout<<"姓名: "<<p->pe.name;
cout<<"性别: "<<p->pe.sex;
cout<<"家庭住址: "<<p->pe.address;
cout<<"*****************************************"<<endl;
}
void List::disptelephone(nodetype* p) //显示联系方式的电话
{
cout<<"*****************************************"<<endl;
cout<<"手机号码是: "<<p->te.mobill;
cout<<"家庭电话是: "<<p->te.JTtel;
cout<<"*****************************************"<<endl;
}
void List::help()
{
cout<<endl;
cout<<"*********************************************************"<<endl;
cout<<" 1.编辑个人信息"<<endl;
cout<<" 2.编辑联系方式"<<endl;
cout<<" 3.显示个人信息"<<endl;
cout<<" 4.显示联系方式"<<endl;
cout<<" 5.显示该成员所有信息"<<endl;
cout<<" 6.帮助菜单"<<endl;
cout<<" 7.返回上一级菜单"<<endl;
cout<<"*********************************************************"<<endl;
}
List::~List()
{
nodetype *pa=head, *pb;
if(pa!=NULL)
{
pb=pa->next;
if(pb==NULL)
free(pa);
else
{
while(pb!=NULL)
{
free(pa);
pa=pb;
pb=pb->next;
}
free(pa);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -