Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过链表的迭代循环_C_Linked List_Pointer To Pointer - Fatal编程技术网

C 通过链表的迭代循环

C 通过链表的迭代循环,c,linked-list,pointer-to-pointer,C,Linked List,Pointer To Pointer,这个简单的程序创建了一个包含首字母缩略词及其完整短语的链接列表。有两个功能: 第一个节点创建一个节点,如果列表为空,则将节点放在第一位,否则将放在列表的末尾 void createNode(struct node **list, char *siglaElem, char *parolaElem) { struct node *new_node; new_node = malloc(sizeof(struct node)); strcpy(new_node->sig

这个简单的程序创建了一个包含首字母缩略词及其完整短语的链接列表。有两个功能:

第一个节点创建一个节点,如果列表为空,则将节点放在第一位,否则将放在列表的末尾

void createNode(struct node **list, char *siglaElem, char *parolaElem) {
    struct node *new_node;
    new_node = malloc(sizeof(struct node));
    strcpy(new_node->sigla,siglaElem);
    strcpy(new_node->parola,parolaElem);
    new_node->next = NULL;

    if (*list == NULL) {
        *list = new_node;
    } else {
        while ((*list) != NULL) {
            (*list) = (*list)->next;
        }
        (*list)->next = new_node;
    }
}
第二个函数扫描整个列表

int scanList(struct node **list, char *siglaElem, char *parolaElem) {
    struct node *scroll = *list;
    for (; scroll != NULL; scroll = scroll->next) {
        if (strcmp(scroll->sigla, siglaElem) == 0) {
            if (strcmp(scroll->parola, parolaElem) == 0)
                return 1;
            else 
                return 2;
        }
    }
    createNode(list, siglaElem, parolaElem);
    return 0;
}
  • 如果在列表中找到相同的首字母缩略词和短语,则返回1
  • 如果发现一个节点的首字母缩略词相同,但名称不同,则返回2 词组
  • 最后,如果数据库中没有具有相同首字母缩略词的节点,则返回0 列表中,它调用第一个函数并创建一个
main()函数

#包括
#包括
#包括
结构节点{
char*sigla;
char*parola;
结构节点*下一步;
};
int scanList(结构节点**list,char*sigla,char*parola);
void createNode(结构节点**列表,char*siglaelm,char*parolaElem);
int main(){
结构节点*first=NULL;
createNode(首先是“SI”、“Sistema Informatico”);
createNode(首先是“操作系统”、“操作系统”);
printf(“%d%d\n”,扫描列表(&first,“SI”,“Sistema Informatico”),扫描列表(&first,“OS”,“操作系统”);
返回0;
}
我不明白为什么我会犯错:11

我认为我在做一些循环错误的事情。
有解决办法吗

else
子句的
createNode
中有一个错误,您将列表向前推进,直到
(*list)
指向
NULL
,然后使用
->
操作符取消引用(*list),但正如我们所说的,它已经指向
NULL
。可能会有更多的错误这只是一个快速的观察,让你去。如果你在linux上工作,我最近发现了一个名为Nemiver的用户友好调试器

else
子句的
createNode
中有一个错误,您将列表向前推进,直到
(*list)
指向
NULL
,然后使用
->
操作符取消引用(*list),但正如我们所说的,它已经指向
NULL
。可能会有更多的错误这只是一个快速的观察,让你去。如果你在linux上工作,我最近发现了一个名为Nemiver的用户友好调试器

createNode函数中有两个错误,第一个错误是没有为sigla和parola分配内存,第二个错误是更改了列表的主指针

解决方案:

 void createNode(struct node **list, char *siglaElem, char *parolaElem) {

    struct node *new_node;
    struct node *tmp;

    new_node = malloc(sizeof(struct node));
    new_node->sigla = malloc(sizeof(char) * (strlen(siglaElem)+1));
    new_node->parola = malloc(sizeof(char) * (strlen(parolaElem)+1));

    strcpy(new_node->sigla, siglaElem);
    strcpy(new_node->parola, parolaElem);
    new_node->next = NULL;

    if (*list == NULL) {
       *list = new_node;
    } else {
       tmp = *list;
       while (tmp->next != NULL)
          tmp = tmp->next;
       tmp->next = new_node;
    }
}

我没有检查malloc的返回,但这样做是为了确保您的变量被正确分配,并且您还可以使用gdb或valgrind调试您的代码:)

createNode函数中有两个错误,第一个错误是没有为sigla和parola分配内存,第二个错误是更改了列表的主指针

解决方案:

 void createNode(struct node **list, char *siglaElem, char *parolaElem) {

    struct node *new_node;
    struct node *tmp;

    new_node = malloc(sizeof(struct node));
    new_node->sigla = malloc(sizeof(char) * (strlen(siglaElem)+1));
    new_node->parola = malloc(sizeof(char) * (strlen(parolaElem)+1));

    strcpy(new_node->sigla, siglaElem);
    strcpy(new_node->parola, parolaElem);
    new_node->next = NULL;

    if (*list == NULL) {
       *list = new_node;
    } else {
       tmp = *list;
       while (tmp->next != NULL)
          tmp = tmp->next;
       tmp->next = new_node;
    }
}

我没有检查malloc的返回,但这样做是为了确保您的变量被正确分配,并且您还可以使用gdb或valgrind调试您的代码:)

就这样,谢谢你的帮助。这些双指针虽然是在开始的时候,是这样的,谢谢你的帮助。这些双指针在刚开始的时候,你能解释一下为什么即使我没有为sigla和parola两个字符串分配内存,程序也能正常执行吗?struct节点中是否已经包含了这一点?这纯粹是偶然的,它可以正常工作,因为strcpy用于复制字符串的内存位于程序或操作系统的授权内存域中,没有限制性,但情况并非总是如此,在大多数情况下会导致分段错误。明白了。还有一个问题。如果结构的parola和sigla是类似于:char-sigla[2]和char-parola[20]的数组,我应该更改什么?使用宏#define来设置大小,避免您周围都有硬编码的数字,因此如果您决定更改大小,只需修改此定义。别忘了添加1,sigla[2]将变为sigla[3],对于parola来说也是一样的,使用函数memset将数组中的所有内容设置为0,就像这个memset(new_node->sigla,0,3),现在您不需要使用malloc为sigla和parola分配内存。您能解释一下为什么即使我没有为sigla和parola两个字符串分配内存,程序也能正常执行吗?struct节点中是否已经包含了这一点?这纯粹是偶然的,它可以正常工作,因为strcpy用于复制字符串的内存位于程序或操作系统的授权内存域中,没有限制性,但情况并非总是如此,在大多数情况下会导致分段错误。明白了。还有一个问题。如果结构的parola和sigla是类似于:char-sigla[2]和char-parola[20]的数组,我应该更改什么?使用宏#define来设置大小,避免您周围都有硬编码的数字,因此如果您决定更改大小,只需修改此定义。别忘了添加1,sigla[2]将变为sigla[3],对于parola来说也是一样的,使用函数memset将数组中的所有内容设置为0,就像这个memset(new_node->sigla,0,3),现在不需要使用malloc为sigla和parola分配内存。