通过链表进行迭代循环

时间:2016-02-14 23:27:02

标签: 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->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 list,它调用第一个函数,然后创建一个。

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;
}

我无法理解为什么我会收到Segmentation Fault:11

我认为我对循环做错了。 有解决方案吗

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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调试代码:)!