【问题标题】:Exam exercise about lists and pointers C关于列表和指针的考试练习 C
【发布时间】: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
}

请注意,我只需要解决这个问题,而不是编写其他代码。

请不要查看这些函数中的溢出、错误等内容!只需修复第一个功能!其他用于个人测试。

【问题讨论】:

  • 还有常见警告:Do not cast the return of malloc.
  • @SouravGhosh 这是关于 sizeof 的不正确心态。如果您曾经阅读过别人的代码,那么您就会认识到该程序员的意图和自我记录代码的想法。这也是幻数有害的原因。
  • @this 请解释一下,添加sizeof(char) 如何增加可读性?如果是sizeof *(p->chiave),我可以同意,但如何使用char。相反,它限制了灵活性,恕我直言。
  • 我将进一步采纳 Sourav 的建议 - 永远不要在 malloc 调用中使用类型名称作为 sizeof 参数,无论是 charint 还是 @ 987654332@.. 相反,请使用 p = malloc( N * sizeof *p); 之类的东西 - 无论p 的类型如何(只要它是指针类型,无论如何),这总是会做正确的事情。
  • @Eregrith 请参阅我之前的评论。 :-)

标签: c string list pointers struct


【解决方案1】:

@BLUEPIXY 在 cmets 中给出了一个非常强烈的提示,我将对此进行扩展:

案例 1:

k 是:狗

如果我在 a 中插入 3 个字符串:DOG -> CAT -> CAT,该函数不会删除“DOG”并显示输出:DOG -> CAT -> CAT(正确的输出是 CAT -> CAT)

案例 2:

我发现的另一个错误是:如果列表是:DOG -> DOG -> CAT 我得到输出 DOG -> DOG -> CAT(正确的输出应该是:CAT)

在这两种情况下,您要删除的字符串都出现在列表的 head 处。 CancellaTutto在这种情况下需要返回列表的new头,不会是a1


1。如果a 应该代表您的列表的头部,请为变量使用更有意义的名称,例如headlistHead(或任何您的母语等效名称)。

【讨论】:

  • 问题是我需要在列表“a”(在本例中为 DOG)中删除等于 k ​​的字符串,因此我需要返回修改后的列表“a”,而不仅仅是打印a的部分。
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多