这个是我曾经在网上弄的一个,和你的要求大体一致,可以运行
你根据自己的要求再改一下吧,上点不学也是不行的!!能学一点就多学一点
#include
#include
#include
#include
#include
using namespace std;
struct friend_node{
char first_name[15];
char last_name[20];
char phone_num[12];
friend_node* next;
friend_node* prior;
};
friend_node* head_ptr=NULL;
friend_node* tail_ptr=NULL;
friend_node* current_ptr; //当前指针:指向链表中某个正在被处理的结点
class Record{
public:
//struct friend_node;
//void Userchoice(int choice);
void InsertRecord(); // 插入记录
void InsertNode(friend_node* new_ptr); //插入结点,分3种情况,头部,尾部,中间
void InsertNodeAtHead(friend_node* new_ptr);
void InsertNodeAtEnd(friend_node* new_ptr);
void ShowList();
void SearchByLastName();
void DeleteRecord(); // 删除记录
int VerifyDelete();
void DeleteNode(); //删除结点,分3情况,删除头部,尾部,中间
void DeleteNodeAtHead();
void DeleteNodeAtEnd();
void DeleteNodeAtMiddle();
void SaveFile();
void LoadFile();
// void Help();
void Showmenu();
void ModifyRecord();
};
void Record::InsertRecord() //插入记录,分3种情况,头部,尾部,中间
{
friend_node* new_ptr;
new_ptr=new friend_node;
if(new_ptr!=NULL)
{
cout<<"名字:\n";
cin>>new_ptr->first_name;
cout<<"姓氏:\n";
cin>>new_ptr->last_name;
cout<<"电话号码:\n";
cin>>new_ptr->phone_num;
InsertNode(new_ptr);
cout<<"是否继续添加信息?(y/n)\n";
char input;
cin>>input;
if('y'==input||'Y'==input)
InsertRecord();
else if('n'==input||'N'==input)
return;
}
else
cout<<"----------\n";
}
void Record::InsertNodeAtHead(friend_node* new_ptr)
{
new_ptr->next=head_ptr; //首先new_ptr的前后都得有指向
new_ptr->prior=tail_ptr;
head_ptr->prior=new_ptr;
tail_ptr->next=new_ptr;
head_ptr=new_ptr;
}
void Record::InsertNodeAtEnd(friend_node* new_ptr)
{
new_ptr->prior=tail_ptr;
new_ptr->next=head_ptr;
tail_ptr->next=new_ptr;
head_ptr->prior=new_ptr;
tail_ptr=new_ptr;
}
void Record::InsertNode(friend_node* new_ptr)
{
//system("cls");
friend_node* temp_ptr;
//1.双向链表为空
if(head_ptr==NULL)
{
new_ptr->next=new_ptr;
new_ptr->prior=new_ptr;
head_ptr=new_ptr;
tail_ptr=new_ptr;
return;
}
//2.链表中只有一个结点
if(head_ptr->next=head_ptr)
{
if(strcmp(new_ptr->last_name,head_ptr->last_name)<0) //链表头部
{
InsertNodeAtHead(new_ptr);
}
else //链表尾部
{
InsertNodeAtEnd(new_ptr);
}
return;
}
//3.如果链表中不是只有一个结点
if(head_ptr->next!=head_ptr)
{
current_ptr=head_ptr->next;
while((strcmp(new_ptr->last_name,current_ptr->last_name)>0)&&(current_ptr!=head_ptr))
current_ptr=current_ptr->next;
if(current_ptr==head_ptr)
//指向当前结点的指针current_ptr指向头结点时,即查找完整个链表后退出
//则插入链表尾部
{
new_ptr->prior=tail_ptr;
new_ptr->next=head_ptr;
tail_ptr->next=new_ptr;
head_ptr->prior=new_ptr;
tail_ptr=new_ptr;
}
else
//如果查找完整个链表,并且满足排序条件退出,欲插入的结点应插到current_ptr之前
{
temp_ptr=current_ptr->prior;
new_ptr->next=current_ptr;
new_ptr->prior=temp_ptr;
current_ptr->prior=new_ptr;
temp_ptr->next=new_ptr;
//插入很简单,即new_ptr的前后得都有指向,而后前后指针都有指向new_ptr
}
return;
}
}
//画好图就ok了。为了做这个设计,画了我整整一个小作业本。July。
void Record::ShowList() //打印输出整个链表记录
{
//system("cls");
current_ptr=head_ptr;
do
{
cout<
<
}while(current_ptr!=head_ptr);
}
//这里的问题已得到解决。。
void Record::SearchByLastName() //查找记录
{
//system("cls");
bool EOF;
char search_string[20];
current_ptr=head_ptr;
if(current_ptr==NULL)
cout<<"电话记录为空!";
else
{
cout<<"请输入你要查找的姓氏\n";
cin>>search_string;
if(strcmp(current_ptr->last_name,search_string)==0)
{
if(EOF)
cout<<"找到结点\n";
cout<
current_ptr=current_ptr->next; //结点后移
while(current_ptr!=head_ptr)
{
if(strcmp(current_ptr->last_name,search_string)==0)
{
if(EOF)
cout<<"找到记录\n";
cout<
<
current_ptr=current_ptr->next;
}
}
}
void Record::DeleteNode() //删除记录,分3情况,删除头部,尾部,中间
{
if(current_ptr==head_ptr)
DeleteNodeAtHead();
else
if(current_ptr->next==head_ptr)
DeleteNodeAtEnd();
else
DeleteNodeAtMiddle();
}
void Record::DeleteNodeAtHead()
{
if(head_ptr->next!=head_ptr)
{
head_ptr=current_ptr->next;
tail_ptr->next=head_ptr;
head_ptr->prior=tail_ptr;
delete current_ptr;
current_ptr=head_ptr;
}
else
{
head_ptr=NULL;
tail_ptr=NULL;
delete current_ptr;
}
}
void Record::DeleteNodeAtEnd()
{
current_ptr=tail_ptr;
tail_ptr=current_ptr->prior;
current_ptr->prior->next=head_ptr;
head_ptr->prior=current_ptr->prior;
delete current_ptr;
}
void Record::DeleteNodeAtMiddle()
{
current_ptr->prior->next=current_ptr->next;
current_ptr->next->prior=current_ptr->prior;
delete current_ptr;
}
int Record::VerifyDelete()
{
char yn;
cout<<"确认?(Y/N)";
cin>>yn;
if((yn=='Y')||(yn=='y')) //确认删除
return 1;
else
return 0;
}
void Record::DeleteRecord()
{
current_ptr=head_ptr;
if(current_ptr==NULL)
{
cout<<"没有要删除的记录!";
return;
}
int nFlag=0;
cout<<"请输入你要删除结点的姓氏:";
char input[20];
cin>>input;
while(head_ptr!=NULL&¤t_ptr->next!=head_ptr)
{
current_ptr=current_ptr->next;
if((strcmp(current_ptr->last_name,input)==0)&&head_ptr!=NULL)
{
nFlag=1;
if(VerifyDelete())
{
DeleteNode();
cout<<"找到记录!已删除!"<
}
else
{
cout<<"没有找到你要删除的记录!"<
}
return;
}
}
void Record::ModifyRecord() //修改函数,,。
{
if(head_ptr==NULL)
{
cout<<"链表为空,无记录可修改!\n";
return;
}
int nFlag=0;
char input[20];
cout<<"请输入你想要修改记录的姓氏:";
cin>>input;
friend_node* new_ptr;
current_ptr=head_ptr;
while((strcmp(current_ptr->last_name,input)==0)&&head_ptr!=NULL)
{
new_ptr=new friend_node;
nFlag=1;
cout<<"\n找到记录!\n";
cout<
cout<
{
cout<<"请输入新记录的姓氏:";
cin>>new_ptr->last_name;
cout<<"请输入新纪录的名字:";
cin>>new_ptr->first_name;
cout<<"请输入新纪录的电话:";
cin>>new_ptr->phone_num;
if(VerifyDelete())
{
DeleteNode();
InsertNode(new_ptr);
cout<<"\n记录已修改\n";
cout<
cout<
cout<
current_ptr=head_ptr;
}
}
else
{
current_ptr=current_ptr->next;
delete new_ptr;
}
}
}
void Record::Showmenu()
{
cout<<" "<
cout<<" "<
int main()
{
Record myrecord;
friend_node* p=new friend_node;
int choice;
do{
myrecord.Showmenu();
cin>>choice;
switch(choice)
{
case 1:
cout<<"1_新增记录:\n";
myrecord.InsertRecord();
break;
case 2:
cout<<"2_显示记录:\n";
myrecord.ShowList();
break;
case 3:
cout<<"3_查找记录:\n";
myrecord.SearchByLastName();
break;
case 4:
cout<<"4_删除记录:\n";
myrecord.DeleteRecord();
break;
case 5:
cout<<"5_修改记录:\n";
myrecord.ModifyRecord();
break;
//break;
//case 6:
//cout<<"6_存入文件:\n"; //文件存入功能已有完善。请点击此文开头的链接。
//SaveFile; //中途夭折:双链表电话簿设计 [文件问题] […]。
//if(head_ptr!=NULL)
//DeleteList();
//break;
default:
cout<<"选择无效:\n";
break;
}
}while(choice!=8);
delete p;
return 0;
}
这个问题有些难度,不过呢,我觉得你可以到网页里边收索答案。
给个联系方式,我会把答案以文件的形式发给你。