【发布时间】:2015-09-16 01:43:19
【问题描述】:
我需要修正这个考试练习,因为我的老师会在明天的口试中问我如何修正这个问题:
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;
}
这个函数应该看两个字符串是否相等(一个在struct链表中,另一个是第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
}
请注意,我只需要解决这个问题,而不是编写其他代码。
请不要查看这些函数中的溢出、错误等内容!只需修复第一个功能!其他用于个人测试。
【问题讨论】:
-
@SouravGhosh 这是关于 sizeof 的不正确心态。如果您曾经阅读过别人的代码,那么您就会认识到该程序员的意图和自我记录代码的想法。这也是幻数有害的原因。
-
@this 请解释一下,添加
sizeof(char)如何增加可读性?如果是sizeof *(p->chiave),我可以同意,但如何使用char。相反,它限制了灵活性,恕我直言。 -
我将进一步采纳 Sourav 的建议 - 永远不要在
malloc调用中使用类型名称作为sizeof参数,无论是char、int还是 @ 987654332@.. 相反,请使用p = malloc( N * sizeof *p);之类的东西 - 无论p的类型如何(只要它是指针类型,无论如何),这总是会做正确的事情。 -
@Eregrith 请参阅我之前的评论。 :-)
标签: c string list pointers struct