我想创建一个单链接列表(使用类),每个列表中都将包含:指向文本的指针,整数编号,指向下一个列表的指针。
我需要实现3个功能:
inserts(将列表插入单链列表,并根据指针所指向的文本使用strcmp对元素进行排序)
removes(int num)删除出现编号的第一个列表。
print()打印整个单链表。
我在removes函数方面遇到问题,该函数会在运行时产生错误,并且我猜想if ( tmp->next == NULL && tmp->number==num ) { delete tmp; first = NULL; }
在哪里,但是我不知道为什么会这样。
另外,我不确定应该如何对插入函数进行排序,因此,如果您有任何想法,并且可以向我解释在removes函数中的错误位置,我将非常感激它。
这是代码:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
class list
{
private:
int number;
char* word;
list* next;
public:
void inserts(int num, char* text);
void removes(int num);
void print();
};
list* first;
void list::print() {
cout <<"This is our list:"<<endl;
// Temp pointer
list *tmp = first;
// No nodes
if ( tmp == NULL ) {
cout << "EMPTY list" << endl;
return;
}
// One node in the list
if ( tmp->next == NULL ) {
cout <<"NUMBER:\t"<< tmp->number;
cout <<"\tWORD:\t"<< tmp->word << endl;
cout <<"--------------------------------"<<endl;
}
else {
// Parse and print the list
while ( tmp != NULL ){
cout <<"NUMBER:\t"<< tmp->number;
cout <<"\tWORD:\t"<< tmp->word << endl;
cout <<"--------------------------------"<<endl;
tmp = tmp->next;
}
}
}
void list::inserts(int num, char* word){
// Create a new list
list* newlist = new list;
newlist->number=num;
newlist->word=word;
newlist->next=NULL;
// Create a temp pointer
list *tmp = first;
if ( tmp != NULL ) {
// Nodes already present in the list
// Parse to end of list
while ( tmp->next != NULL ) {
tmp = tmp->next;
}
// Point the last node to the new node
tmp->next=newlist;
}
else {
// First node in the list
first = newlist;
}
}
void list::removes(int num){
int k = 0;
list* tmp=first;
if(tmp==NULL)
return;
//Last node of the list
if ( tmp->next == NULL && tmp->number==num ) {
delete tmp;
first = NULL;
}
else {
//Parse thru the nodes
list* prev;
prev = new list;
while ( tmp != NULL )
{
if ( tmp->number == num && k == 0)
first = first->next;
if ( tmp->number == num)
break;
prev = tmp;
tmp = tmp->next;
k++;
}
//Adjust the pointers
prev->next=(tmp->next);
//Delete the current node
delete tmp;
delete prev;
}
}
int main ()
{
first->print();
first->inserts(1200,"endian");
first->print();
/* first->inserts(10,"endianness");
first->inserts(1200,"PEEK");
first->inserts(1200,"POKE");
first->inserts(1200,".MIL");
first->print();*/
first->removes(100);
first->print();
getchar();
}
最佳答案
删除delete prev;
函数的最后一行中的removes()
。
我不是专家,但是通过删除prev,您将失去对列表中第一个节点的引用。
顺便说一句,好的评论使它很容易阅读!