2013-04-06 56 views
1

当我有下面的代码:Ç段错误试图实现的LinkedList

#include <stdio.h> 
#include <stdlib.h> 
#define MAXN 100 
typedef int key; 
typedef int data; 
struct list * createElement(key k, data info); 

struct list{ 
    key k; 
    data info; 
    struct list *next; 
}; 
struct list *L; 
void init(key k, data info) 
{ 
    L = createElement(k, info); 
} 
struct list * createElement(key k, data info) 
{ 
    struct list *temp; 
    temp = (struct list *) malloc(sizeof(*temp)); 
    temp->k = k; 
    temp->info = info; 
    return temp; 
} 
void insert(struct list * element) 
{ 
    element->next = L; 
    L = element; 
} 
void insertBefore(struct list * element, key k) 
{ 
    struct list * currentElement = L; 
    while(currentElement != NULL) 
    { 
     if(currentElement->k == k) 
     { 
      struct list *temp = currentElement; 
      currentElement = element; 
      currentElement->next = temp; 
      return; 
     } 
     currentElement = currentElement->next; 
    } 

} 
void insertAfter(struct list * element, key k) 
{ 
    struct list * currentElement = L; 
    while(currentElement != NULL) 
    { 
     if(currentElement->k == k) 
     { 
      struct list *temp = currentElement->next; 
      currentElement->next = element; 
      element->next = temp; 
      return; 
     } 
     currentElement = currentElement->next; 
    } 
} 
void deleteElement(struct list * element) 
{ 
    struct list * currentElement = L; 
    while(currentElement != NULL) 
    { 
     if(currentElement == element) 
     { 
      struct list * temp = currentElement; 
      currentElement = currentElement->next; 
      free(temp); 
      return; 
     } 
     currentElement = currentElement->next; 
    } 
} 
struct list * getElementByKey(key k) { 
    printf("\n1"); 
    struct list *currentElement = L; 
    printf("2"); 
    while(currentElement != NULL) 
    { 
     printf("3"); 
     if(currentElement->k == k) 
     { 
      printf("4"); 
      return currentElement; 
     } 
     printf("5"); 
     currentElement = currentElement->next; 
     printf("6"); 
    } 
    printf("There is no such element in the list"); 
} 
struct list * pop() 
{ 
    struct list *element = L; 
    L = L->next; 
    return element; 
} 
int main() 
{ 
    init(0, 13); 
    struct list * element = createElement(5, 155); 
    insert(element); 
    struct list * k = createElement(7, 243); 
    insert(k); 
    //insertBefore(createElement(3, 100), 5); 
    printf("The first element value is: %d", pop()->info); 
    printf("The second element value is: %d", pop()->info); 
    printf("The element value is: %d", getElementByKey(5)->info); 

    return 0; 
} 

所以,当我执行它的调试器给我segmantation故障上线84这是if(currentElement->k == k)的方法getElementByKey。我知道我试图访问一个未知的元素(因为我使用pop方法,它删除了列表中的第一个元素),但它应该打印出一条警告消息。似乎前一个元素的关键字有问题,或者我没有注意到。

+0

在标题尼斯错字,顺便说一句... ;-) – alk 2013-04-06 12:58:16

+0

是,由于只注意到它 – user1113314 2013-04-06 13:07:53

回答

3

在您的createElement函数中,您忘记将next指针初始化为NULL。

struct list * createElement(key k, data info) 
{ 
    struct list *temp; 
    temp = (struct list *) malloc(sizeof(*temp)); 
    temp->k = k; 
    temp->info = info; 
    temp->next = NULL; 
    return temp; 
} 

因此,当你在浏览列表,它从来没有发现名单的最后一个元素,因为接下来的指针总是不等于NULL,并在存储一些随机的位置去,试图访问的部分是不允许这样做。

+0

谢谢!这解决了我的问题。我认为编译器会自动将它分配给NULL,因此不需要编写它(我有一个PHP背景,这就是事情的工作方式)。这确实给了我一个教训。 – user1113314 2013-04-06 14:00:13

+0

是的,一定要用C初始化所有的东西,你可能会失去一大堆时间调试非初始化变量。 – 2013-04-06 15:22:46

1

删除元素(使用deleteElement())时,您错过了重新初始化L


的segmenataion违反if(currentElement->k == k)最LIKEY会费currentElement指的是一个无效的内存地址。当你在第84行之前对NULL的某些行进行测试时,它只能是currentElement被明确指定了一个无效地址,或者它指向的地址已被释放。

deleteElement()显示的代码我假设后者。

+0

你所说的“当删除一个元素的意思是(使用deleteElement())你错过重新初始化L.“?我没有太多的经验与C和指针。我没有使用deleteElement方法,所以它不喜欢这个特定的错误。我将尝试查看currentElement链接到坏内存的位置 – user1113314 2013-04-06 13:12:01

+1

deleteElement()不正确,您需要在使用它之前修复它。假设你删除了L指向的元素。整个列表不见了,因为L指向已经释放()的内存。 – Fred 2013-04-06 13:28:50

1

2问题

1)的createElement()

需要

temp->next = NULL;

2)的insertBefore()

不会改变列表的指针

currentElement = element;

如)

void insertBefore(struct list * element, key k) 
{ 
    struct list * currentElement = L; //add case of L->k 
    while(currentElement != NULL) 
    { 
     if(currentElement->next && currentElement->next->k == k) 
     { 
      element->next = currentElement->next; 
      currentElement->next = element; 
      return; 
     } 
     currentElement = currentElement->next; 
    } 
} 
+0

getElementByKey():未找到时返回值未确定。 – BLUEPIXY 2013-04-06 13:24:26

+0

这是实现它的好方法,但是我的方法是相同的,应该正常工作。 – user1113314 2013-04-06 14:10:18

+0

@ user1113314 no – BLUEPIXY 2013-04-06 14:11:49