运行不能达到要求,请求修改:一个顺序表中存放字符(只有数字字符和英文字符,由用户从键盘上输 入),编写算法删除所有的数字字符,


#include <iostream>
using namespace std;
const int maxsize = 100;
typedef struct {
    char data[maxsize];
    int n;
}sqlist;
void print(sqlist* q) {
    for (int i = 0; i < q->n; i++) {
        cout << q->data[i];
    }
}
void purge(sqlist* q) {
    int i, s;
    s = 0;
    for (i = 0; i < q->n; i++) {
        if (q->data[i] > '0' && q->data[i] < '9') {
            s++;
        }
        else if (s > 0) { q->data[i - s] = q->data[s]; }
        q->n = q->n - s;
    }
}
int main() {
    sqlist* q = new sqlist;
    cout << "输入顺序表的长度" << endl;
    cin >> q->n;
    cout << "输入字符" << endl;
    for ( int i = 0; i < q->n; i++) {
        cin >> q->data[i];
    }
    purge(q);
    
    
    print(q);
    return 0;
}
运行不能

【以下回答由 GPT 生成】

首先,检查代码中的一处逻辑错误。在原代码的purge函数中,对顺序表长度进行减少的操作应该放在for循环的外部。否则,在每次遇到非数字字符时都会进行减少操作,导致删除字符的过程出现错误。修改后的purge函数如下:

void purge(sqlist* q) {
    int i, s;
    s = 0;
    for (i = 0; i < q->n; i++) {
        if (q->data[i] > '0' && q->data[i] < '9') {
            s++;
        }
        else if (s > 0) { 
            q->data[i - s] = q->data[i]; 
        }
    }
    q->n = q->n - s;
}

接下来,修改算法以删除顺序表中的所有数字字符。可以使用两个指针,其中一个指针用于遍历原数组,另一个指针指向处理后的新数组。每当遇到非数字字符时,将其存储到新数组中并同时移动两个指针,最后再将新数组的长度赋值给原数组。代码如下:

void purge(sqlist* q) {
    int i, j;
    j = 0;
    for (i = 0; i < q->n; i++) {
        if (q->data[i] < '0' || q->data[i] > '9') {
            q->data[j] = q->data[i];
            j++;
        }
    }
    q->n = j;
}

最后,完整的修改后的代码如下:

#include <iostream>
using namespace std;
const int maxsize = 100;
typedef struct {
    char data[maxsize];
    int n;
} sqlist;

void print(sqlist* q) {
    for (int i = 0; i < q->n; i++) {
        cout << q->data[i];
    }
}

void purge(sqlist* q) {
    int i, j;
    j = 0;
    for (i = 0; i < q->n; i++) {
        if (q->data[i] < '0' || q->data[i] > '9') {
            q->data[j] = q->data[i];
            j++;
        }
    }
    q->n = j;
}

int main() {
    sqlist* q = new sqlist;
    cout << "输入顺序表的长度" << endl;
    cin >> q->n;
    cout << "输入字符" << endl;
    for (int i = 0; i < q->n; i++) {
        cin >> q->data[i];
    }
    purge(q);
    print(q);
    return 0;
}


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你的算法不对,当遇到数字时,应该通过一个循环把后续的字符移到相应位置,而不是只移动一个字符。
而且你的算法效率不高.


```c++
#include <iostream>
using namespace std;
const int maxsize = 100;
typedef struct {
    char data[maxsize];
    int n;
}sqlist;
void print(sqlist* q) {
    for (int i = 0; i < q->n; i++) {
        cout << q->data[i];
    }
}
void purge(sqlist* q) {
    char *pf=q->data;
    char *pl=q->data;
    while (pf - q->data != q->n) {
        if (*pf >= '0' && *pf <= '9')
        {
            pf++;
       }
        else {
            *pl=*pf;
            pl++;
            pf++;
        }
    }
    q->n=pl-q->data;
}
int main() {
    sqlist* q = new sqlist;
    cout << "输入顺序表的长度" << endl;
    cin >> q->n;
    cout << "输入字符" << endl;
    for (int i = 0; i < q->n; i++) {
        cin >> q->data[i];
    }
    purge(q);


    print(q);
    return 0;
}

```