如何从链表指针字符中查找字符

时间:2018-03-23 11:39:04

标签: c++

所以我需要从链表中删除一个字符。但是,正常的方式(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语句无法正常工作。我从文件中获取了链接列表,所以它与它有什么关系吗?

5 个答案:

答案 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;
    }
}