通讯录

来源:互联网 发布:php mysql num rows 编辑:程序博客网 时间:2024/03/28 21:17

#include <iostream>
#include <cstring>
using namespace std;

struct Node    // 节点
{
 int id;    // 记录的标号
 char name[20];  // 存储姓名
 int sex;   // 性别
 char birth[50];  // 出生日期
 char address[100];  // 通讯地址
 char telephone[20]; // 电话号码
 Node * next;
};

void DataInput(Node * p); // 数据输入
void DataSearch();   // 数据查找
void DataDelete();   // 数据删除
void DataInsert();   // 数据插入
void DataShow();   // 数据显示
void DataID();    // 调整数据ID


Node * front = 0;  // 头节点
Node * current = 0;  // 当前节点
int count = 0;   // 计数
int main()
{
 int key = 0;  // 功能控制变量
 while (key != 6)
 {
  cout << "请选择操作: 1.浏览; 2.增加; 3.删除; 4.查询; 5.插入; 6.退出;   ";
  cin >> key;
  if (key == 1)
  {
   DataShow();
  }
  else if (key == 2)
  {
   if (count == 0)  // 当前资料为空
   {
    front = new Node;
    current = front;
    DataInput(current);
   }
   else
   {
    current->next = new Node;
    current = current->next;
    DataInput(current);
   }
  }
  else if (key == 3)
   DataDelete();
  else if (key == 4)
   DataSearch();
  else if (key == 5)
   DataInsert();
  else if (key == 6)
   break;
  else
   continue;
  cout << endl;
 }
 cout << endl << endl << "程序结束,谢谢使用! ^O^/n/n";
 return 0;
}

void DataInput(Node * p)
{
 p->id = ++count;
 cout << "/n请输入联系人姓名:";
 cin >> p->name;
 while (cin.get() != '/n')
  continue;
 while (1)
 {
  cout << "/n请选择联系人性别:  1.男性; 2.女性  ";
  cin >> p->sex;
  if (p->sex == 1 || p->sex == 2)
   break;
  else
  {
   while (cin.get() != '/n')
    continue;
  }
 }
 cout << "/n请输入联系人出生年月: ";
 cin >> p->birth;
 while (cin.get() != '/n')
  continue;
 cout << "/n请输入联系人通讯地址:";
 cin >> p->address;
 while (cin.get() != '/n')
  continue;
 cout << "/n请输入联系人电话号码:";
 cin >> p->telephone;
 while (cin.get() != '/n')
  continue;
 p->next = 0;
 cout << endl << p->name << " 资料输入完毕!/n";
}

void DataSearch()
{
 int keytemp = 0;
 int idtemp = 0;
 int success = 0;
 char nametemp[20];
 Node * temp = front;
 while (1)
 {
  if (count == 0)
  {
   cout << "/n没有存储任何资料!/n";
   break;
  }
  cout << "/n1.按ID查询;  2.按姓名查询  ";
  cin >> keytemp;
  if (keytemp == 1)
  {
   while (idtemp == 0 || idtemp > current->id)
   {
    cout << "/n请输入ID:";
    cin >> idtemp;
    if (idtemp > current->id)
     cout << "/n当前只有 " << current->id << " 条资料!/n";
   }
   cout << "/n查询结果如下:/n";
   while (temp != 0) 
   {
    if (temp->id == idtemp)
    {
     cout <<"/n*****************************************/n/n";
     cout << "ID: " << temp->id << "      姓名:" << temp->name << "        性别:";
     if (temp->sex == 1)
      cout << "男";
     else
      cout << "女";
     cout << "/n/n出生日期:" << temp->birth << "/n/n通信地址:" << temp->address
       << "/n/n电话号码:" << temp->telephone << endl;
     cout << "/n*****************************************/n";
    }
    temp = temp->next;
   }
  }
  else if (keytemp == 2)
  {
   cout << "/n请输入姓名:";
   cin >> nametemp;
   while (temp != 0)
   {
    if (strcmp(temp->name, nametemp) == 0)
    {
     success = 1;
     cout << "/n" << nametemp <<" 资料如下:/n";
     cout <<"/n*****************************************/n/n";
     cout << "ID: " << temp->id << "      姓名:" << temp->name << "        性别:";
     if (temp->sex == 1)
      cout << "男";
     else
      cout << "女";
     cout << "/n/n出生日期:" << temp->birth << "/n/n通信地址:" << temp->address
       << "/n/n电话号码:" << temp->telephone << endl;
     cout << "/n*****************************************/n";
    }
    temp = temp->next;
   }
   if (success == 0)
    cout << "/n没有找到姓名为 " << nametemp << " 的资料./n";
  }
  break;
 }
}

void DataDelete()
{
 int keytemp;
 int idtemp = 0;
 char nametemp[20];
 int success = 0;   // 标记是否删除成功
 Node * temp = front;
 while (1)
 {
  if (count == 0)
  {
   cout << "/n没有存储任何资料!/n";
   break;
  }
  cout << "/n1.按ID删除;  2.按姓名删除  ";
  cin >> keytemp;
  if (keytemp == 1)
  {
   while (idtemp == 0 || idtemp > current->id)
   {
    cout << "/n请输入ID:";
    cin >> idtemp;
    if (idtemp > current->id)
     cout << "/n当前只有 " << current->id << " 条资料!/n";
   }
   if (front->id == idtemp)
   {
    Node * fronttemp = front;
    front = front->next;
    delete fronttemp;
    success = 1;
    count--;
    if (count != 0)  // 存储资料非空
     DataID();  // 调整资料ID
    cout << "ID为 " << idtemp <<" 的资料删除完毕!/n";
    break;
   }
   while (temp != current && temp != 0) 
   {  
    if (temp->next->id == idtemp)
    {
     Node * nexttemp = temp->next;
     if (nexttemp != current)  
     {
      temp->next = temp->next->next;
      delete nexttemp;
      success = 1;
      count--;
      DataID();   // 调整ID
     }
     else     // 删除的资料为最后一个节点
     {
      temp->next = 0;
      current = temp;
      delete nexttemp;
      success = 1;
      count--;
     }
    }
    temp = temp->next;
   }
   cout << "ID为 " << idtemp <<" 的资料删除完毕!/n";
  }
  else if (keytemp == 2)
  {
   cout << "/n请输入姓名:";
   cin >> nametemp;
   if (strcmp(front->name, nametemp) == 0)
   { 
    Node * fronttemp = front;
    front = front->next;
    delete fronttemp;
    success = 1;
    count--;
    if (count != 0)  // 存储资料非空
     DataID();  // 调整资料ID
    cout << "/n姓名为 " << nametemp << " 的资料删除完毕!/n";
    break;
   }
   while (temp != current && temp != 0) 
   {  
    if (strcmp(temp->next->name, nametemp) == 0)
    {
     Node * nexttemp = temp->next;
     if (nexttemp != current)  
     {
      temp->next = temp->next->next;
      delete nexttemp;
      success = 1;
      count--;
      DataID();   // 调整ID
     }
     else     // 删除的资料为最后一个节点
     {
      temp->next = 0;
      current = temp;
      delete nexttemp;
      success = 1;
      count--;
     }
    }
    temp = temp->next;
   }
   if (success == 1)
    cout << "/n姓名为 " << nametemp << " 的资料删除完毕!/n";
   else
    cout << "/n没有找到姓名为 " << nametemp << " 的资料./n";
  }
  break;
 }
}

void DataInsert()
{
 Node * temp = front;
 int idtemp = 0;
 int success = 0;
 cout << "/n请输入要插入的资料:/n";
 if (count == 0)  // 当前资料为空
 {
  front = new Node;
  current = front;
  DataInput(current);
  cout << "/n检测到没有存储任何资料,当前数据已被自动插入到 ID:1 位置/n";
  success = 2;
 }
 else
 {
  current->next = new Node;
  current = current->next;
  DataInput(current);
 }
 while (1)
 {
  if (success == 2)
   break;
  cout << "/n输入即将插入的ID位置: ";
  cin >> idtemp;
  if ((idtemp > count) || (idtemp <= 0))
  {
   cout << "/n插入位置无效!/n";
   while (cin.get() != '/n')
    continue;
   continue;
  }
  else if (idtemp == 1)   // 插入位置为第一个节点
  {
   temp = current;
   temp->next = front;
   front = current;   // 设置新的头节点
   while (temp->next != current)
    temp = temp->next;
   temp->next = 0;    // 设置新的尾节点
   current = temp;    // current指向尾节点
   DataID();     // 调整ID
   success = 1;
   cout << "/n插入操作完成!/n";
  }
  else if (idtemp == count)
  {
   cout << "/n插入操作完成!/n";  // 所以此处不作任何处理即可, 自然符合当前情况
   break; 
  }
  else
  {
   if (count == 1)     // 只有一个节点时候
   {        // 由于插入位置只能是1或2,1的情况已经完成,2的情况为自然形成
    cout << "/n插入操作完成!/n"; // 所以此处不作任何处理即可
    break; 
   }
   else
   {
    while (temp != current)
    {
     if (temp->next->id == idtemp)
     {
      current->next = temp->next;
      temp->next = current;
     }
     temp = temp ->next;
    }
    while (temp->next != current)
     temp = temp->next;
    temp->next = 0;    // 设置新的尾节点
    current = temp;    // current指向尾节点
    DataID();     // 调整ID
    success = 1;
    cout << "/n插入操作完成!/n";
   }
  }
  break;
 }
}

void DataShow()
{
 Node * temp = front;
 cout << "/n当前共存储信息 " << count <<" 条:/n";
 while (1)
 {
  if (count == 0)     // 无节点
  {
   cout << "/n没有任何资料可以显示!/n";
   break;
  }
  cout <<"/n*****************************************/n/n";
  cout << "ID: " << temp->id << "      姓名:" << temp->name << "        性别:";
  if (temp->sex == 1)
   cout << "男";
  else
   cout << "女";
  cout << "/n/n出生日期:" << temp->birth << "/n/n通信地址:" << temp->address
    << "/n/n电话号码:" << temp->telephone << endl;
  cout << "/n*****************************************/n";
  if (temp->next == 0)
   break;
  temp = temp->next;
 }

}

void DataID()
{
 Node * temp = front;
 int counttemp = 0;
 while (1)
 {
  temp->id = ++counttemp;
  if (temp->next == 0)
   break;
  temp = temp->next;
 }
}