📄 5-5.cpp
字号:
}
current_ptr=temp_ptr;
}
else
{
cout << "没有找到记录\n";
cout << "按回车键继续\n";
cin.get(pause);
system("cls");
}
}
// 从链表中删除某个节点的功能函数
void friend_node::delete_record()
{
system("cls");
char search_string[20];
friend_node *previous_ptr;
previous_ptr = NULL; // 初始化previous_ptr指针,使其指向NULL.
current_ptr = head_ptr; // 使current_ptr指向链首从而开始找欲删除的节点
cin.ignore(20,'\n');
cout << "\n请输入你想删除的联系人的姓: ";
cin.getline(search_string,20);
// 循环至找到对应记录
while((current_ptr != NULL) &&
(strcmp(current_ptr->last_name, search_string) != 0))
{
previous_ptr = current_ptr; // 保持一指针指向正欲删除的节点
current_ptr = current_ptr->next;
}
if(current_ptr != NULL) // 若current_ptr所指并非NULL, 则找到对应记录
{
cout << "\n找到记录\n";
cout << current_ptr->last_name << ' '
<< current_ptr->first_name << endl;
cout << current_ptr->phone_num << endl;
if(verify_delete()) // 询问用户是否确认删除
{ // 若是
delete_node(previous_ptr); // 则删除previous_ptr指针所指向的下一个节点
cout << "\n纪录已删除\n";
}
else // 否则,什么也不做
{
cout << "\n记录未被删除\n";
}
}
else // 若未找到记录,显示此信息
{
cout << "\n未找到对应信息,记录未被删除.\n";
}
system("cls");
}
void friend_node:: help_me()
{
help:
int choice2;
system("cls");
cout << "\n欢迎使用帮助系统,请选择你想知道的\n";
cout << "1: 我的记录将有何变化\n";
cout << "\n2: 怎样删除所有记录\n";
cout << "\n3: 何时会出新版本\n";
cout << "\n4: 新版本将增加哪些功能\n";
cout << "\n5: 退出\n";
cin >> choice2;
switch(choice2) //帮助菜单
{
case 1:
cout << "\n通过执行文件Friends.dat来查看\n";
cout << "\n若被重命名后再写入文件,则原记录丢失\n";
cout << "\n按Enter继续\n";
pause=getch();
system("cls");
goto help;
break;
case 2:
cout << "\n删除文件Friends.dat\n";
cout << "\n按Enter继续\n";
pause=getch();
system("cls");
goto help;
break;
case 3:
cout << "\n我有空的时候哦\n";
cout << "\n按Enter继续\n";
pause=getch();
system("cls");
goto help;
break;
case 4:
cout << "\n我将加入如下功能\n";
cout << "\n1.多用户及密码管理\n";
cout << "\n2.可加密 \n";
cout << "\n3.清楚所有记录的命令\n";
cout << "\n4.修正一些错误和不足\n";
cout << "\n按Enter继续\n";
pause=getch();
system("cls");
goto help;
break;
default:
cout << "按Enter退出";
cout << "按Enter继续\n";
break;
}
}
// 确认是否删除的函数
int friend_node::verify_delete()
{
char YesNo;
cout << "\n确实要删除该记录吗(Y/N) ";
cin >> YesNo;
if((YesNo == 'Y') || (YesNo == 'y'))
{
return(1); // 若用户确实要删除返回真值
}
else
{
return(0); // 否则返回假值
}
}
// 删除被current_ptr所指的节点
void friend_node::delete_node(friend_node *previous_ptr)
{
if(current_ptr == head_ptr) // 若要删除的节点是链首节点
{ // 调用专门的函数处理这种特殊情况
delete_head_of_list();
}
else
{
if(current_ptr->next == NULL) // 若将要删除的节点是链尾节点
{ // 同样调用专门的函数处理这种特殊情况
delete_end_of_list(previous_ptr);
}
else // 若也非链尾节点
{ // 则从链表中间删除该节点
delete_from_middle_of_list(previous_ptr); //调用专门的函数处理这种情况
}
}
}
//删除链首节点
void friend_node::delete_head_of_list()
{
current_ptr = head_ptr; // 使current_ptr指向链首
if(head_ptr->next != NULL)
{ // 若链表中不指一个节点
head_ptr = current_ptr->next; // 使第2个节点成为新的链首
}
else // 否则,使head_ptr指向NULL
{ // 来说明链表已空
head_ptr = NULL;
}
delete current_ptr; // 释放被删除节点占用的内存
}
// 删除链尾节点
void friend_node::delete_end_of_list(friend_node *previous_ptr)
{
delete current_ptr; // 释放被删除节点占用的内存
previous_ptr->next = NULL; // 使被删除节点前的那个节点成为新的链尾
current_ptr = head_ptr; // 使current_ptr指向链首
}
// 从链表中删除节点
void friend_node::delete_from_middle_of_list(friend_node *previous_ptr)
{
// 摘下被删除节点
previous_ptr->next = current_ptr->next;
delete current_ptr; // 释放被删除节点占用的内存
current_ptr = head_ptr; // 使current_ptr指向链首
}
// 释放被链表占用的内存
void friend_node::delete_list()
{
friend_node *temp_ptr; // 定义一指针用来作临时存储
current_ptr = head_ptr; // 使current_ptr指向链首
do // 遍历链表
{
temp_ptr = current_ptr->next; // 使临时指针指向被删除节点的next
delete current_ptr; // 删除current node指针指向的节点.
current_ptr = temp_ptr; // 再使current_ptr指向被删除节点的next节点
} while(temp_ptr != NULL);
}
//修改记录
void friend_node::modify_record(void)
{
int n;
char last_name1[20];
char first_name1[15];
char phone_num1[12];
search_by_name();//此时current_ptr指向欲修改的节点
if(current_ptr)
{
cout<<"你想修改当前记录的哪一项?";
cout<<"\n1.姓:";
cout<<"\n2.名:";
cout<<"\n3.电话:\n";
cin>>n;
switch(n)
{
case 1:
cout<<"请输入新的姓:";
cin>>last_name1;
cin.ignore(20,'\n');
strcpy(current_ptr->last_name, last_name1);
break;
case 2:
cout<<"请输入新的名:";
cin>>first_name1;
cin.ignore(15,'\n');
strcpy(current_ptr->first_name, first_name1);
break;
case 3:
cout<<"请输入新的电话号码:";
cin>>phone_num1;
cin.ignore(12,'\n');
strcpy(current_ptr->phone_num, phone_num1);
break;
default:
cout<<"请重新选择!";
break;
};
cout<<"修改成功!\n";
cout<<current_ptr->last_name<<' '<<current_ptr->first_name<< endl;
cout<<current_ptr->phone_num<<endl;
getch();
}
else
cout<<"请重新输入!\n";
system("cls");
}
// 写入链表数据到文件
void friend_node::write_list_to_file()
{
ofstream outfile; // 输出文件指针(由ofstream生成对象outfile)
outfile.open("FRIENDS.DAT",ios::out); // 打开文件用于输出数据
if (outfile) // 若打开文件时未出错
{ // 即可将数据写入文件
current_ptr = head_ptr; // 使current_ptr指向链首
if(head_ptr != NULL) // 若链表不为空,开始向文件写入数据
{
do // 遍历链表
{
// 向文件写入节点数据
outfile << current_ptr->last_name << endl;
outfile << current_ptr->first_name << endl;
outfile << current_ptr->phone_num << endl;
current_ptr = current_ptr->next; // 使current_ptr指向下一个节点
} while(current_ptr != NULL); // 循环直至链表尾
}
// “文件结束”的标识将被写入文件尾从而在读取文件时方便知道已到达链表尾
outfile.close(); // 关闭文件
}
else // 若打开文件时出错,显示出错信息
{
cout << "打开文件出错!\n";
}
}
// 从文件中读取链表数据
void friend_node::load_list_from_file() // 从数据文件FRIENDS.DAT中读取数据重建链表处理函数
{
friend_node *new_rec_ptr;
ifstream infile; // 输入文件指针
int end_loop = 0;
infile.open("FRIENDS.DAT",ios::in); // 打开文件用于输入
if (infile) // 若打开文件时未出错
{ // 从文件时读入数据
do
{
new_rec_ptr = new friend_node; // 为节点分配内存
if(new_rec_ptr != NULL) // 检查分配时是否出错
{
// 从文件中得到next last name
infile.get(new_rec_ptr->last_name,20);
infile.ignore(20,'\n');
// 若文件未读取完,继续取得其他数据
if((strcmp(new_rec_ptr->last_name, "") != 0) &&
(strcmp(new_rec_ptr->last_name, "END OF FILE") != 0))
{
infile.get(new_rec_ptr->first_name, 15);
infile.ignore(20,'\n');
infile.get(new_rec_ptr->phone_num, 15);
infile.ignore(20,'\n');
insert_node(new_rec_ptr);
}
else // 若文件读取结束,删除最近生成的节点
{ // 并设置终止循环的标记
delete new_rec_ptr;
end_loop = 1;
}
}
else // 若分配内存时出错显示出错提示
{ // 设置终止循环的标记
cout << "警告: 内存出错. 从磁盘读取文件失败.\n";
end_loop = 1;
}
} while(end_loop == 0); // 循环至end_loop标记为真.
infile.close(); // 关闭文件
}
else // 若打开文件出错,显示出错信息
{
cout << "没有可用的数据存在,链表为空.\n";
}
}
void main(void)
{
friend_node record;
record.welcome();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -