所以我需要从链表中删除一个字符。但是,正常的方式(data-> c == val)似乎在这里不起作用。
这是我的结构:
struct ll {
char *c = new char;
ll *prev;
ll *next;
};
这是我需要找到的字符指针:
char *x=new char[1];
x[0]='R';
x[1]='\0';
这是我想用来删除带有这个字符的链表的函数:
void del(ll *data, char *val) {
ll *temp, *temp2;
bool sm = false;
char * x = val;
while (data != nullptr) {
if (data->prev == nullptr) {
if (data->c == x) {
temp = data;
data = data->next;
data->prev = nullptr;
delete temp;
}
}
else {
if (data->c == x) {
temp = data;
data = data->prev;
data->next = temp->next;
temp2 = data->next;
temp2->prev = data;
delete temp;
}
}
data = data->next;
}
}
我在这里做错了什么?每当我比较两个字符时,似乎if语句无法正常工作。我从文件中获取了链接列表,所以它与它有什么关系吗?
答案 0 :(得分:1)
你在这里犯了两个错误:
1)你在这里写过数组的末尾,因为它只能容纳1个字符,而不是你想要访问的2个字符:
char *x=new char[1];
x[0]='R';
x[1]='\0';
你只使用一个字符,所以为什么要把它变成一个数组呢?替换为:
char x = 'R';
2)你没有比较字符,而是它们所在的内存地址。当然这不会起作用。您必须取消引用指针(即访问存储的值)才能使其工作。像这样改写:
if (*data->c == *x)
答案 1 :(得分:0)
因为您创建了以这种方式查找的对象</ p>
char *x=new char[1];
它永远不会匹配列表中的任何内容,因为您已经分配了一块新的内存。您需要比较指针指向的内容。
答案 2 :(得分:0)
首先,当您初始化char x
时,通过尝试访问它的索引1,您正在进行非法写入。如果您创建长度为N
的数组,则可以只访问索引[0, N)
。在这种情况下,当您创建长度为1的数组时,您无法访问其索引1,因为它超出了界限。如果你打算放置&#39; \ 0&#39;而你应该创建一个长度为2的数组。字符。
其次,在比较时,您应该匹配char*
指向的内容,而不是指针本身,这只是一个地址。
当您尝试使用指针将字符与另一个字符进行比较时,您应该使用以下内容更改最内层的if(即if (data->c == x
):
if (*data->c == *x)
第三,您的代码还有另一个错误,与如何实现链表元素的删除有关。基本上,您应该考虑temp2变量可能为nullptr的情况。
最后,我建议您研究std::string
,这可能是表示字符串的更好方法。或者,如果链接列表只有单个字符,则可以只使用字符变量,而不是为列表中的每个节点分配字符数组。
Here是您的代码的工作版本,其中包含我上面提到的更新。
答案 3 :(得分:0)
您尝试比较字符串,就像我们比较字符原因一样,它不起作用。你可以改用strcmp或者使用字符而不是字符串。
答案 4 :(得分:0)
为什么不使用std::string
?
结构:
struct ll {
std::string c;
ll *prev;
ll *next;
};
字符串初始化:
ll obj;
obj.c = "R";
您的del
功能:
void del(ll *data, char *val) {
ll *temp, *temp2;
bool sm = false;
std::string x = val;
while (data != nullptr) {
if (data->prev == nullptr) {
if (data->c == x) {
temp = data;
data = data->next;
data->prev = nullptr;
delete temp;
}
}
else {
if (data->c == x) {
temp = data;
data = data->prev;
data->next = temp->next;
temp2 = data->next;
temp2->prev = data;
delete temp;
}
}
data = data->next;
}
}