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

📄 shuangxianglianbiao.cpp

📁 该程序为双向链表
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		CurrentNode->PreviousNode = TempNode->PreviousNode ;
		TEmpNode = TempNode->PreviousNode ;
		TEmpNode->NextNode = CurrentNode ;
		cout<<TempNode->Data;
		delete TempNode;
		}
	cout<<"\n Status : Mission SuccessFull ."
		<<"\n Node Removed From Middle SuccessFully . "
		<<"\n Press Any Key To Continue . ";
	getch();
	return true;
}
/**********************************************************************/
//删除链表尾节点
template< class NodeType >
bool DoubleLinkList< NodeType >::RemoveFromRear()
{
	cout<<"\n Operation : Removal Of A Node From Rear Of A Double Linked List .\n";
	if( IsEmpty() )
		{
		cout<<"\n Invalid Operation ."
			<<"\n Status : Mission Failed . "
			<<"\n Press Any Key To Continue . ";
		getch();

		return false;
		}
	else
		{
		Node< NodeType > *TempNode = RearNode;
		if( FirstNode == RearNode )
			FirstNode = RearNode = NULL;
		else
			RearNode = RearNode->PreviousNode;
		RearNode->NextNode = NULL;
		cout<<TempNode->Data;
		delete TempNode;
		cout<<"\n Status : Mission SuccessFull ."
			<<"\n Node Removed From Rear Of The Double Linked List Successfully  .";
		return true;
		}
		cout<<"\n Press Any Key To Continue . ";
		getch();
}
/**********************************************************************/
//从链表FirstNode开始遍历
template< class NodeType >
void DoubleLinkList< NodeType >::TraverseForward()
{
	Node< NodeType > *CurrentNode = FirstNode ;
	cout<<"\n Mission : Traversing & Printing A Double Linked List ."
		<<"\n           In Forward Direction ."
		<<"\n The Double Linked List Follows : \n";
	while ( CurrentNode != NULL)
		{
		cout<<CurrentNode->Data<<" , ";
		CurrentNode = CurrentNode->NextNode;
		}
	cout<<"\n Status : Operation Successfull ."
		<<"\n Traversed & Printed Double Linked List Successfully . "
		<<"\n Press Any Key To Continue .";
	getch();
}
/**********************************************************************/
//从链表RearNode开始遍历
template< class NodeType >
void DoubleLinkList< NodeType >::TraverseBackwards()
{
	Node< NodeType > *CurrentNode = RearNode ;
	cout<<"\n Mission : Traversing & Printing A Double Linked List ."
		<<"\n           In Backward Direction "
		<<"\n The Double Linked List Follows : \n";
	while ( CurrentNode != NULL)
		{
		cout<<CurrentNode->Data<<" , ";
		CurrentNode = CurrentNode->PreviousNode;
		}
	cout<<"\n Status : Operation Successfull ."
		<<"\n Traversed & Printed Double Linked List Successfully . "
		<<"\n Press Any Key To Continue .";
	getch();
}
/**********************************************************************/
//链表长度
template< class NodeType >
int DoubleLinkList< NodeType >::LenghtOfDoubleLinkList()
{
	int NosOfNodes = 0 ;
	Node< NodeType > *CurrentNode = FirstNode ;
cout<<"\n Mission : Traverse & Calculate The Number Of Nodes In A Double Linked List ."<<"\n The Double Linked List Follows : \n";
	while ( CurrentNode != NULL)
		{
		NosOfNodes++;
		CurrentNode = CurrentNode->NextNode;
		}
	cout<<"\n Status : Operation Successfull ."
<<"\n Traversed & Calculated Number Of Nodes In A Double Linked List Successfully . "<<"\n Press Any Key To Continue .";
	getch();
	return NosOfNodes;
}
/**********************************************************************/
//查找链表,若查找项在链表中,输出"Item is found in the list."
template< class NodeType>
void DoubleLinkList< NodeType >::Search(NodeType &SearchItem)
{
	Node< NodeType > *CurrentNode;
	if(FirstNode==NULL)
	{
		cout<<"不能查找."<<endl;
		getch();
	}
	else
	{
		CurrentNode=FirstNode;
		while(CurrentNode!=NULL)
		{
			if(CurrentNode->Data==SearchItem)
				cout<<"Item is Found in the List."<<endl;
			else
			{
				CurrentNode=CurrentNode->NextNode;
			}
		}
		if(CurrentNode==NULL)cout<<"Item is not found in the List."<<endl;
		getch();
	}
}
/**********************************************************************/
//删除节点。此操作从双向链表中删除给定的元素(若存在)
//1链表为空2要删除的是链表的第一个节点3要删除的元素在链表中的某个地方4要删除的元素不在链表中
template< class NodeType >
void DoubleLinkList< NodeType >::deleteNode(NodeType &deleteItem)
{
	Node< NodeType > *CurrentNode;
	Node< NodeType > *trailCurrentNode;//pointer just before CurrentNode
	if(FirstNode==NULL)
	{
		cout<<"cannot delete from an empty list."<<endl;
		getch();
	}
	else
	{
		if(FirstNode->Data==deleteItem)//删除第一个节点
		{
			CurrentNode=FirstNode;
			FirstNode=FirstNode->NextNode;
			if(FirstNode!=NULL)
				FirstNode->PreviousNode=NULL;
			delete CurrentNode;
		}
		else
		{
			CurrentNode=FirstNode;
			while(CurrentNode!=NULL&&CurrentNode->Data!=deleteItem)//查找节点
			{
				CurrentNode=CurrentNode->NextNode;
			}
			if(CurrentNode==NULL)
				cout<<"要删除的节点不在链表中."<<endl;
			else
			{
				trailCurrentNode=CurrentNode->PreviousNode;
				trailCurrentNode->NextNode=CurrentNode->NextNode;
				CurrentNode->NextNode->PreviousNode=trailCurrentNode;
				delete CurrentNode;
			}
		}
		getch();
	}
}
/**********************************************************************/
//排序,由大到小
template< class NodeType >
void DoubleLinkList< NodeType >::Sort()
{
	NodeType data;
	Node< NodeType > *CurrentNode;
	Node< NodeType > *trailCurrentNode;
	CurrentNode=FirstNode;
	trailCurrentNode=FirstNode;
	for(;trailCurrentNode!=NULL;trailCurrentNode=trailCurrentNode->NextNode)
	{
		while(CurrentNode!=NULL)
		{
			if(CurrentNode->Data<trailCurrentNode->Data)
			{
				data=trailCurrentNode->Data;
				trailCurrentNode->Data=CurrentNode->Data;
				CurrentNode->Data=data;
			}
			else
			{
				CurrentNode=CurrentNode->NextNode;
			}
		}
		CurrentNode=FirstNode;
	}
	getch();
}
/**********************************************************************/
//根据顺序增加节点,由大到小
template< class NodeType >
void DoubleLinkList< NodeType >::InsertNode( NodeType &InsertItem )
{
	Node< NodeType > *NewNode=CreateNode(InsertItem);
	Node< NodeType > *CurrentNode;
	Node< NodeType > *trailCurrentNode;
	if(FirstNode==NULL)
	{
		FirstNode=RearNode=NewNode;
		getch();
	}
	else
	{
		CurrentNode=FirstNode;
		if(FirstNode->Data<InsertItem)//插入链首
		{
			FirstNode->PreviousNode=NewNode;
			NewNode->NextNode=FirstNode;
			FirstNode=NewNode;
			FirstNode->PreviousNode=NULL;
		}
		else
		{
			while(CurrentNode!=NULL)//查找插入点
			{
				if(CurrentNode->Data<InsertItem)
				{
					trailCurrentNode=CurrentNode->PreviousNode;
					CurrentNode->PreviousNode=NewNode;
					NewNode->NextNode=CurrentNode;
					NewNode->PreviousNode=trailCurrentNode;
					trailCurrentNode->NextNode=NewNode;
				}
				else
				{
					CurrentNode=CurrentNode->NextNode;
				}
			}
		}
		if(CurrentNode->Data>InsertItem)
		{
			NewNode->PreviousNode=RearNode;//插入链尾
			RearNode->NextNode=NewNode;
			RearNode=NewNode;
			RearNode->NextNode=NULL;
		}
		getch();
	}
}
/**********************************************************************/
// 根据用户选择调用不同功能
void List::handle_choice(int choice) //	根据用户选择(choice)调用对应处函数
 {
  switch(choice) // 处理选择
   {
  case 1:
	  display_list();
	  break;
    case 2:  // 若选择添加记录,
     add_record();// 调用添加记录的功能模块,
	 paixuoflist();
     break;        
  	case 3:  // 若选择在记录里查找,
     lenghtoflist(); // 调用按姓查找的模块
     cout<<"现在存在的联系人有"<<ptr_num<<"个\n\n\n\n";
     break;                
    case 4:  // 若选择删除记录,
     system("cls");
	 delete_record(); // 调用按全名查找后删除记录的模块
     break;	 
	case 5:
	search_by_fullname();
	break;
	case 6:  //若选择修改记录,
	 modify_record();system("cls"); //调用修改记录的功能模块
	 break;
	case 7:  // 若选择退出,
     write_list_to_file();  // 保存记录
     if(head_ptr != NULL)   // 删除链表
      { 
       delete_list(); 
      }
     break;
    default : // 若选择了菜单中不存在的条目,
     cout <<"无效选择!\n"; // 显示出错信息.
     break;
   }
 } // handle_choice的结束
/*********************************************************************/
// 添加记录的功能模块.
void List::add_record()    // 在链表中增加一个记录
 {
  friend_node *new_rec_ptr; // 定义一个friend_node类的指针.
  new_rec_ptr = new friend_node; //  用new为新建指针动态分配空间.
                         
  if(new_rec_ptr != NULL) // 若分配成功,则输入数据并将其插入链表
   {  system("cls");                    
    // 由用户输入姓名及电话号码.
    cin.ignore(20,'\n');
    cout << "姓名: ";
    cin.get(new_rec_ptr->full_name,15);
    cin.ignore(20,'\n');
	cout << "年龄: ";
    cin.get(new_rec_ptr->age_num,20);
    cin.ignore(20,'\n');
    cout << "电话号码: ";
    cin.get(new_rec_ptr->phone_num,15);
    cin.ignore(20,'\n');
    insert_node(new_rec_ptr);
   }	
  else  // 若插入链表时发生内部错误,显示出错警告
   {    
    cout << "警告!: 系统出错!记录将无法保存!.\n";
   }system("cls");
 } //  add_record的结束
/*********************************************************************/
// 将结点插入链表的功能模块.
void List::insert_node(friend_node *new_rec_ptr) 
//将一个由new_rec_ptr 指向的新节点插入链表中
 {
system("cls");
  friend_node *before_ptr;
  friend_node *after_ptr;
  if(head_ptr == NULL)
   {                             // 若链表首结点为空,将新结点设为
    new_rec_ptr->prev=new_rec_ptr->next = NULL;    //首结点 
    head_ptr = new_rec_ptr;
   }
  else
   {
    if(strcmp(new_rec_ptr->full_name, head_ptr->full_name) < 0)
     {                                  // 若新结点应排在首结点之前,
     make_node_new_head(new_rec_ptr);  // 将新结点设为首结点.
     }
    else                             // 若都不是,判断新结点
	{                                //  应插入的位置
      current_ptr = position_insertion_point(new_rec_ptr->full_name);
      before_ptr = current_ptr;      // 用指针保存应插入处结点两边的位置
      after_ptr = current_ptr->next; // 两边的位置
      if(after_ptr == NULL) // 若after_ptr为空, 将新结点设为尾结点
       {                    
        add_node_to_end(new_rec_ptr);
       }
      else                  // 若不是则将新结点插入
       {                    //  before_ptr和after_ptr之间.
        before_ptr->next = new_rec_ptr;
        new_rec_ptr->next = after_ptr;
        new_rec_ptr->prev=current_ptr;
		after_ptr->prev=new_rec_ptr;
       }
     }
    }
 } // insert_node的结束
/*********************************************************************/
// 判定新结点的插入位置并使current_ptr指向它
friend_node * List::position_insertion_point(char fullname[20])
 {       // 根据姓氏,返回其在链表中的正确位置。新节点即将插入此点。
  char temp_name[20];
  friend_node *temp_ptr;
  int tempint;
  if(head_ptr->next!= NULL) //若链表上存在不止一个结点,则沿
   {                        //链表找出正确的插入位置
    current_ptr = head_ptr;
    temp_ptr = current_ptr->next;
    strcpy(temp_name, temp_ptr->full_name);
    //循环找到正确的插入位置.
    tempint = strcmp(fullname,temp_name);
    while((tempint > 0) && (current_ptr->next !=NULL))
     {
      current_ptr = temp_ptr;
	  // 检查当前结点是否为首结点
	  if(current_ptr->next != NULL)
	  {
       temp_ptr = current_ptr->next;
       strcpy(temp_name, temp_ptr->full_name);
       tempint = strcmp(fullname,temp_name);
	  }
     }
   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -