【发布时间】:2014-03-11 14:43:27
【问题描述】:
我的问题是,如果用户输入了姓氏,并且链表中有多个相同的姓氏,并且其中一个姓氏在头节点中。我如何在不删除头节点的情况下删除另一个姓氏之一。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头节点(这不是我想要的......)
void NumberList::deleteCertainRecord()
{
string lname = "";
ListNode *ptr;
ptr = head;
string answer;
cout << "Please enter last name: "<<endl;
cin>>answer;
int num = 0;
char confirm;
while (ptr!= NULL){
lname = ptr -> data.person.getLastName();
if(lname == answer){
num++;
cout << "Person found : ";
cout << ptr->data.person.getTitle()<<" " << ptr -> data.person.getFirstName() << " " << ptr -> data.person.getLastName() << endl << endl;
cout << "Do you want to delete his/her record? [Y/N]" << endl;
do{
cin >> confirm;
if(confirm=='Y'||confirm=='y'){
ListNode *previousNode;
if(isEmpty()){
return;
}
else if(head->data.person.getLastName() == answer){
ptr = head->next;
delete head;
head = ptr;
}
else{
ptr = head;
while(ptr!=NULL && ptr->data.person.getLastName() != answer){
previousNode = ptr;
ptr = ptr->next;
}
if(ptr==NULL){
cout<< "Node not found!" << endl;
return;
}
else{
previousNode->next = ptr->next;
delete ptr;
}
}
cout << endl << "Deleting..."<<endl;
cout << "Done!!" <<endl;
cout << "Exiting delete function... "<<endl;
return;
}
else if(confirm=='N'||confirm=='n'){
break;
}
else{
cout << "invalid input, please enter again!!" << endl;
}
}while(confirm!='Y'&&confirm!='y'&&confirm!='n'&& confirm!='N');
cout << endl;
}
ptr = ptr -> next;
}
if (num == 0){
cout << "\nNo person with the last name ("<< answer << ") was found!" << endl;
cout << "Exiting delete function... "<<endl;
return;
}
}
【问题讨论】:
-
您应该可以删除链表中的头节点。让指针指向下一个,删除头,然后让头指向下一个。要删除链表中具有相同姓氏的所有元素,您必须遍历整个列表。如果您不想删除头节点,则只需在第一次迭代中跳过它。制作一个执行此操作的函数。
-
我不确定我是否理解您的问题:您有一个包含姓氏的链表,您希望删除函数删除包含给定姓氏的节点但跳过头节点?跨度>
标签: c++ linked-list delete-operator