这个简单的程序创建了一个链接列表,其中包含首字母缩略词及其完整短语。有两个功能:
第一个创建一个节点,如果列表为空,则将节点置于第一位,否则将其放在列表的末尾
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;
}
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
我认为我对循环做错了。 有解决方案吗
答案 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调试代码:)!