关于列表和指针C的考试练习

时间:2015-06-29 14:28:13

标签: c string list pointers struct

我需要修理这个考试练习,因为我的老师会问我明天如何在口语考试中解决这个问题:

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是:DOG

如果我在a:DOG中插入3个字符串 - > CAT - >猫 该功能不会删除“DOG”并显示输出:DOG - > CAT - > CAT(正确输出为CAT - > CAT)

案例2:

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

所有其他情况应该正常。

struct is:

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
}

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

请不要看这些功能中的溢出,错误等等!只需修复第一个功能!其他人则需要进行个人测试。

1 个答案:

答案 0 :(得分:0)

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

  

案例1:

     

k是:DOG

     

如果我在a:DOG中插入3个字符串 - > CAT - > CAT功能不会删除“DOG”并显示输出:DOG - > CAT - > CAT(正确输出为CAT - > CAT)

     

案例2:

     

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

在这两种情况下,您要删除的字符串都出现在列表的 head 中。在这种情况下,block in start_thread' 2015-06-30T08:21:54.512062+00:00 app[web.1]: 62.252.214.33 - - [30/Jun/2015:08:21:54 +0000] "GET / HTTP/1.1" 500 30 0.0023 2015-06-30T08:48:18.429835+00:00 heroku[api]: Starting process with command需要返回列表的 new 头部,而不是by guillaume.bouffard@hotmail.co.uk 2015-06-30T08:48:21.683429+00:00 heroku[run.3694]: Awaiting client 2015-06-30T08:48:21.711122+00:00 heroku[run.3694]: Starting process with command 1

<小时/> 1。如果 2015-06-30T08:48:22.102369+00:00 heroku[run.3694]: State changed from starting to up 2015-06-30T08:48:23.553202+00:00 heroku[run.3694]: State changed from up to complete 2015-06-30T08:48:23.542808+00:00 heroku[run.3694]: Process exited with status 127 2015-06-30T08:54:15.444683+00:00 heroku[router]: at=info method=GET path="/" host=guillaume-bookmark-manager.herokuapp.com request_id=044274e4-694c-47e3-8ee5-1ac35ae8a5c9 fwd="62.252.214.33" dyno=web.1 connect=0ms service=44ms status=500 bytes=326 2015-06-30T08:54:15.446539+00:00 app[web.1]: 2015-06-30 08:54:15 - DataObjects::ConnectionError - could not connect to server: Connection refused 2015-06-30T08:54:15.446547+00:00 app[web.1]: Is the server running on host "localhost" (127.0.0.1) and accepting 2015-06-30T08:54:15.446549+00:00 app[web.1]: TCP/IP connections on port 5432? 2015-06-30T08:54:15.446551+00:00 app[web.1]: : 2015-06-30T08:54:15.446553+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/data_objects-0.10.15/lib/data_objects/connection.rb:79:in应该代表列表的头部,请为变量使用更有意义的名称,例如new' 2015-06-30T08:54:15.446556+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/data_objects-0.10.15/lib/data_objects/pooling.rb:181:insynchronize' 2015-06-30T08:54:15.446559+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/data_objects-0.10.15/lib/data_objects/pooling.rb:176:in(或者您的母语等价物)。