2013-04-06 62 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