我想创建单链表(使用类),每个列表中都有:指向文本的指针,int数,指向下一个列表的指针。
我需要实现3个功能: 插入(将列表插入到单链表中,并根据指针指向的文本使用strcmp对元素进行排序) removed(int num)删除出现数字的第一个列表。 print()打印整个单链表。
我有删除函数的问题,它在运行时出错,我猜想问题if ( tmp->next == NULL && tmp->number==num ) {
delete tmp;
first = NULL;
}
在哪里,但我不知道为什么会这样。
此外,我不确定如何实现对insert函数的排序,所以如果你有任何想法,如果你能解释我在删除函数中的哪个位置,那么错误就是我真的很感激。
以下是代码:
#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();
}
答案 0 :(得分:1)
摆脱delete prev;
函数最后一行的removes()
。
我不是专家,但通过删除prev,您将失去对列表中第一个节点的引用。
顺便说一下,好评,让它很容易阅读!
答案 1 :(得分:0)
在removes
中,在循环while ( tmp != NULL ) { … }
之后,tmp
可能为NULL。
但是,在那个循环之后,你有以下几行:
//Adjust the pointers
prev->next=(tmp->next);
您正在取消引用NULL指针,这会导致程序崩溃。
用这些替换这些行:
//Adjust the pointers
if(tmp)
prev->next=(tmp->next);
<小时/> 另请注意:
removes
例程中的内存管理仍然存在错误。您永远不会在delete
的初始值上调用prev
,并删除在某些情况下应保留的列表节点。而不是你正在做什么,因此初始化它:list* prev=0;
,并摆脱delete prev
。
答案 2 :(得分:0)
执行此循环时:
while ( tmp != NULL )
你的tmp指针将到达列表的末尾,并在循环中断时为NULL。
所以,当你执行:
prev->next=(tmp->next);
你的临时指针没有“下一个”值。也许你应该在循环之外维护另一个指针。