首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在第二次显示嵌套列表的元素时丢失这些元素

在第二次显示嵌套列表的元素时丢失这些元素
EN

Stack Overflow用户
提问于 2019-06-02 22:23:42
回答 1查看 34关注 0票数 0

我正在尝试使用嵌套列表来构建一个“库”。一切正常,我可以使用我的排序添加函数添加元素,直到我注意到,如果我连续两次显示列表,第一次一切都很好,但在第二次中,添加到目录中的"book元素“不显示,就像它们不存在一样。

代码语言:javascript
复制
struct book
{
    char *title;
    int number;
    char *country;
    struct book* new;
};

struct catalog
{
    char *name;
    struct catalog* next;
    struct book* firstbook;
};

void printList(struct catalog *head)
{
    struct catalog *temp = head;
    while(temp != NULL)
    {
        if(temp->firstbook == NULL)
        {
            printf("%s\n", temp->name);

        }
        while(temp->firstbook != NULL)
        {   printf("%s  ", temp->name);
            printf("%s  ", temp->firstbook->title);
            printf("%d  ", temp->firstbook->number);
            printf("%s\n", temp->firstbook->country);
            temp->firstbook = temp->firstbook->new;
        }
        temp = temp->next;
    }
}

struct book *newbook(char *booktitle, int number, char *country)
{
    struct book* newbook = (struct book*) malloc(sizeof(struct book));
    newbook->title = malloc(sizeof(strlen(booktitle)+1));
    newbook->country = malloc(sizeof(strlen(country)+1));
    newbook->title = booktitle;
    newbook->country = country;
    newbook->number = number;
    newbook->new = NULL;
}

struct catalog *findcatalog(struct catalog** head, char *catalogname)
{
    struct catalog* current;
    current = *head;
    while(current != NULL)
    {
        if(current->name == catalogname)
        {
            return current;
        }
        current = current->next;
    }
}

void sortedBookInsert(struct catalog** head, char *catalogname, char *booktitle, int number, char *country)
{
    struct catalog* searched;
    struct book* pom;
    struct book* ksiazka = newbook(booktitle, number, country);
    searched = findcatalog(head, catalogname);
    if(searched->firstbook == NULL || strcmp(searched->firstbook->title, ksiazka->title)>0)
    {
        ksiazka->new =searched->firstbook;
        searched->firstbook = ksiazka;
    }
    else
    { pom = searched->firstbook;
        while(pom->new!= NULL && strcmp(searched->firstbook->title, ksiazka->title)< 0)
        {
            pom = pom->new;
        }
        ksiazka->new = pom->new;
        pom->new = ksiazka;
    }
}

void sortedInsert(struct catalog** head,char *name)
{
    struct catalog* current;
    struct catalog* new_node = newcatalog(name);

    if (*head == NULL || strcmp((*head)->name, new_node->name) > 0)
    {
        new_node->next = *head;
        *head = new_node;
    }
    else
    {
        current = *head;
        while (current->next!=NULL && strcmp(current->next->name, new_node->name) < 0)
        {
            current = current->next;
        }
        new_node->next = current->next;
        current->next = new_node;
    }
}

int main() {

代码语言:javascript
复制
struct catalog* head = NULL;
sortedInsert(&head, "Kappa");
sortedInsert(&head, "Aaaaaa");
sortedInsert(&head, "Sdafscx");
sortedInsert(&head, "Saxzxc");
sortedInsert(&head, "Asdas");
sortedInsert(&head, "Zzzzzzzz");
sortedInsert(&head, "Country");
sortedBookInsert(&head, "Country", "PKP", 11111, "Germany");
sortedBookInsert(&head, "Country", "Polacy", 11112, "Italy");
sortedBookInsert(&head, "Country", "Autobusy", 11234, "France");
sortedBookInsert(&head, "Country", "Polityka", 14111, "Russia");
printList(head);
printList(head);
return 0;

}

代码语言:javascript
复制
When I print my list for a second time, elements from SortedBookInsert just... are not there. I am very confused.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-02 22:33:46

newbook中缺少一个return,必须是

代码语言:javascript
复制
struct book *newbook(char *booktitle, int number, char *country)
{
    struct book* newbook = (struct book*) malloc(sizeof(struct book));
    newbook->title = malloc(sizeof(strlen(booktitle)+1));
    newbook->country = malloc(sizeof(strlen(country)+1));
    newbook->title = booktitle;
    newbook->country = country;
    newbook->number = number;
    newbook->new = NULL;

    return newbook;
}

如果没有返回,则行为是未定义的。

另请注意,您创建了2个内存泄漏,执行以下操作:

而且你也没有分配正确的长度因为大小,必须是

代码语言:javascript
复制
newbook->title = malloc(strlen(booktitle)+1);
newbook->country = malloc(strlen(country)+1);
strcpy(newbook->title, booktitle);
strcpy(newbook->country, country);

在findcatalog中,如果找不到目录,也不会返回,必须是

代码语言:javascript
复制
struct catalog *findcatalog(struct catalog** head, char *catalogname)
{
    struct catalog* current;
    current = *head;
    while(current != NULL)
    {
        if(current->name == catalogname)
        {
            return current;
        }
        current = current->next;
    }
    return NULL;
}

如果没有返回,则行为是未定义的。

代码语言:javascript
复制
void sortedBookInsert(struct catalog** head, char *catalogname, char *booktitle, int number, char *country)
{
    struct catalog* searched;
    struct book* pom;
    struct book* ksiazka = newbook(booktitle, number, country);
    searched = findcatalog(head, catalogname);
    if (searched == NULL)
      return;
    if(searched->firstbook == NULL || strcmp(searched->firstbook->title, ksiazka->title)>0)
    {
        ksiazka->new =searched->firstbook;
        searched->firstbook = ksiazka;
    }
    else
    { pom = searched->firstbook;
        while(pom->new!= NULL && strcmp(searched->firstbook->title, ksiazka->title)< 0)
        {
            pom = pom->new;
        }
        ksiazka->new = pom->new;
        pom->new = ksiazka;
    }
}

但坦率地说,我不确定这一点

在findcatalog中

if(current->name == catalogname)

必须是

代码语言:javascript
复制
if(!strcmp(current->name, catalogname))

函数printList修改目录做temp->firstbook = temp->firstbook->new;,你需要替换

while(temp->firstbook != NULL) { printf("%s ", temp->name); printf("%s ", temp->firstbook->title); printf("%d ", temp->firstbook->number); printf("%s\n", temp->firstbook->country); temp->firstbook = temp->firstbook->new; }

例如,通过:

代码语言:javascript
复制
struct book* firstbook = temp->firstbook;

    while(firstbook != NULL)
    {   printf("%s  ", temp->name);
        printf("%s  ", firstbook->title);
        printf("%d  ", firstbook->number);
        printf("%s\n", firstbook->country);
        firstbook = firstbook->new;
    }

如果我做了所有这些修改并使用这个定义:

代码语言:javascript
复制
struct catalog* newcatalog(char *name)
{
  struct catalog* r = malloc(sizeof(struct catalog));

  r->name = malloc(strlen(name)+1);
  strcpy(r->name, name);
  r->next = NULL;
  r->firstbook = NULL;

  return r;
}

编译和执行:

代码语言:javascript
复制
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wall -Wextra l.c
pi@raspberrypi:/tmp $ ./a.out
one
Aaaaaa
Asdas
Country  Autobusy  11234  France
Country  PKP  11111  Germany
Country  Polacy  11112  Italy
Country  Polityka  14111  Russia
Kappa
Saxzxc
Sdafscx
Zzzzzzzz
two
Aaaaaa
Asdas
Country  Autobusy  11234  France
Country  PKP  11111  Germany
Country  Polacy  11112  Italy
Country  Polityka  14111  Russia
Kappa
Saxzxc
Sdafscx
Zzzzzzzz
pi@raspberrypi:/tmp $ 

在valgrind下执行

代码语言:javascript
复制
pi@raspberrypi:/tmp $ valgrind ./a.out
==7575== Memcheck, a memory error detector
==7575== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==7575== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==7575== Command: ./a.out
==7575== 
one
Aaaaaa
Asdas
Country  Autobusy  11234  France
Country  PKP  11111  Germany
Country  Polacy  11112  Italy
Country  Polityka  14111  Russia
Kappa
Saxzxc
Sdafscx
Zzzzzzzz
two
Aaaaaa
Asdas
Country  Autobusy  11234  France
Country  PKP  11111  Germany
Country  Polacy  11112  Italy
Country  Polityka  14111  Russia
Kappa
Saxzxc
Sdafscx
Zzzzzzzz
==7575== 
==7575== HEAP SUMMARY:
==7575==     in use at exit: 148 bytes in 11 blocks
==7575==   total heap usage: 12 allocs, 1 frees, 1,172 bytes allocated
==7575== 
==7575== LEAK SUMMARY:
==7575==    definitely lost: 12 bytes in 1 blocks
==7575==    indirectly lost: 136 bytes in 10 blocks
==7575==      possibly lost: 0 bytes in 0 blocks
==7575==    still reachable: 0 bytes in 0 blocks
==7575==         suppressed: 0 bytes in 0 blocks
==7575== Rerun with --leak-check=full to see details of leaked memory
==7575== 
==7575== For counts of detected and suppressed errors, rerun with: -v
==7575== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56415916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档