⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5-5.cpp

📁 管理电话号码的c++源程序 适合课程设计等 非常不错
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		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 + -