0

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

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

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() 函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node {
    char *sigla;
    char *parola;
    struct node *next;
};

int scanList(struct node **list, char *sigla, char *parola);
void createNode(struct node **list, char *siglaElem, char *parolaElem);

int main() {
    struct node *first = NULL;
    createNode(&first, "SI", "Sistema Informatico");
    createNode(&first, "OS", "Operating System");
    printf("%d %d\n", scanList(&first, "SI", "Sistema Informatico"), scanList(&first, "OS", "Operating System"));
    return 0;
}

我不明白为什么会出现分段错误:11

我认为我在循环中做错了什么。有什么解决办法吗?

4

2 回答 2

1

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

于 2016-02-14T23:46:48.660 回答
1

您的 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 来调试您的代码 :) !

于 2016-02-15T00:14:51.957 回答