我需要修复这个考试练习,因为明天我的老师会在口试时问我如何修复这个问题:
nodo *CancellaTutto(nodo *a, char *k) {
nodo *p,*q;
p = a;
if (p == NULL)
return NULL;
while (p != NULL) {
if (strcmp(p->chiave, k) == 0 ) {
if (p->prec == NULL && p->succ == NULL)
return NULL;
if (p->succ == NULL && p->prec != NULL) {
q = p;
p = p->prec;
p->succ = NULL;
free(q);
}
if (p->prec == NULL && p->succ != NULL) {
q = p;
p = p->succ;
p->prec = NULL;
free(q);
}
if (p->prec != NULL && p->succ != NULL) {
q = p;
p = p->succ;
q->prec->succ = p;
p->prec = q->prec;
free(q);
}
} else { p = p->succ; }
}
return a;
}
这个函数应该检查两个字符串是否相等(一个在结构体链表中,另一个是第 k 个字符串)并删除所有等于 k 的字符串,但是有两种输出情况显然是错误的:
案例1:
k 是:狗
如果我在 a 中插入 3 个字符串:DOG -> CAT -> CAT 该函数不会删除“DOG”并显示输出:DOG -> CAT -> CAT(正确的输出是 CAT -> CAT)
案例2:
我发现的另一个错误是:如果列表是:DOG -> DOG -> CAT 我得到输出 DOG -> DOG -> CAT (正确的输出应该是:CAT)
所有其他情况都应该正常工作。
结构是:
struct nodo {
char *chiave;
struct nodo *prec;
struct nodo *succ;
};
typedef struct nodo nodo;
其余代码为:(只读理解这部分仅用于个人测试;对考试无用)
int main()
{
nodo *lista=CreateListString(); // create a list
Visualizza(lista); // views it
char *stringa="ciao"; // create k string
lista=CancellaTutto(lista,stringa); // call function
Visualizza(lista); // views it
}
请注意,我只需要解决这个问题,而不是编写其他代码。
请不要看这些函数中的溢出、错误之类的东西!只需修复第一个功能即可!其他的是个人测试。
最佳答案
@BLUEPIXY 在评论中给出了非常强烈的提示,我将对此进行扩展:
CASE 1:
k is : DOG
if i insert 3 strings in a : DOG -> CAT -> CAT the function doesnt erase "DOG" and show me output: DOG -> CAT -> CAT (correct output is CAT -> CAT)
CASE 2:
Another error i found is: if a list is : DOG -> DOG -> CAT i get output DOG -> DOG -> CAT (right output should be: CAT)
在这两种情况下,您要删除的字符串都出现在列表的头部。在这种情况下,CancellaTutto
需要返回列表的新头,该头不会是 a
1
a
应该代表列表的头部,请为变量使用更有意义的名称,例如 head
或 listHead
(或无论您的母语对应是什么)。
关于c - 关于列表和指针 C 的考试练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31118312/