2013-02-05 78 views
2

我打算寫一個簡單的SDL應用程序,所以我認爲我應該實現一個簡單的鏈接列表,以便以後擴展。在經過一番苦苦掙扎之後,我決定在這裏尋求幫助。爲什麼我的C鏈表失敗?

我知道鏈表,我讀過它。我看到了幾個實現,並不那麼難,容易掌握。所以我認爲我應該能夠自己實現一個。我猜測我在這裏嚴重忽略了一些東西。 :(

首先這個代碼不編譯好,分段錯誤。其次,我不認爲它會產生我想如果我能戰勝我與不幸的指針做基本的錯誤。

能否請你告訴我我的錯誤在我的代碼?我在哪裏做錯了嗎?

這裏是一個liveworkspace鏈接編輯 http://liveworkspace.org/code/1qu1RN $ 1

這是我得到的Cygwin GCC錯誤

temp [v 0] -> 0.460241 0.000000 0.050356 
temp [v 1] -> 0.072079 0.153807 0.864573 
temp [v 2] -> 0.683917 0.709301 0.080479 
temp [v 3] -> 0.295755 0.264795 0.894696 
address of ptemp @ 1629101750 

[v 0] -> linked vertex is 7731159828445146316135105405324534341657178000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 578395405356271.125000 1310047834864691498231654014730274851713450000.000000 
Segmentation fault (core dumped) 

這裏是代碼

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

#define NEWline printf("\n") 

typedef struct position { 
    double x; 
    double y; 
    double z; 
} position; 

struct datalist { 
    position v; 
    struct datalist *pnext; 

}; 
typedef struct datalist datalist; 

void initializeList (datalist *head); 
void addList_II (datalist *head , double data[3]); 

void initializeList (datalist *head){ 
    position pv= {0,0,0}; 
    head = (datalist *) malloc (sizeof (head)); 
     if (head == NULL){ printf("cannot allocate memory"); exit(1); } 
    head->v=pv; 
    head->pnext=NULL; 
} 

void addList_II (datalist *head , double data[3]) { 

    datalist *adddata; 
    adddata = (datalist *)malloc (sizeof (datalist)); 
     if (adddata == NULL) { printf("cannot allocate memory for insertion data"); exit(1); } 
    adddata->v.x = data[0]; 
    adddata->v.y = data[1]; 
    adddata->v.z = data[2]; 

    adddata->pnext = head->pnext; 
    head=adddata; 
} 

int main() { 

    datalist *ptemp; 
    datalist temp; 
    int i,c; //counters 
    datalist *head; 

    initializeList(head); 

    for (i = 0; i < 4; i++) { 
     double t[3]; 
     srand (time (NULL)*i+234); 
      temp.v.x = ((double) rand() )/ RAND_MAX; 
     srand (time (NULL)*i*546); 
      temp.v.y = ((double) rand() )/ RAND_MAX; 
     srand (time (NULL)*i*567+345); 
      temp.v.z = ((double) rand() )/ RAND_MAX; 
     t[0] = temp.v.x; t[1] = temp.v.y; t[2] = temp.v.z; 

     printf ("temp [v %d] -> %F %F %F \n",i, temp.v.x, temp.v.y, temp.v.z); 
     addList_II (head, t); 
    } 

    c=0; 
    ptemp=head; 
    while (ptemp!=NULL) { 
     printf("[v %d] -> linked vertex is %F %F %F \n", c, ptemp->v.x,ptemp->v.y, ptemp->v.z); 
     ptemp=ptemp->pnext; 

    } 
} 
+1

有一些指針sizeof()d代替對象的sizeof的地方。 – hmjd

+0

是的,在你的初始化。確保你解決了這個問題,並做了sizeof(datalist) – 75inchpianist

回答

2

在你addList_II您設置了錯誤的指針。你正在把你的新節點和它的下一個指針指向頭部的下一個空指針。

void addList_II (datalist *head , double data[3]) { 
     datalist *adddata; 
     adddata = (datalist *)malloc (sizeof (datalist)); 
      if (adddata == NULL) { printf("cannot allocate memory for insertion data"); exit(1); } 
     adddata->v.x = data[0]; 
     adddata->v.y = data[1]; 
     adddata->v.z = data[2]; 

     // adddata->pnext = head->pnext; //not THIS 
     adddata->pnext = head;  //DO THIS 
     head=adddata; 
    } 

此外,您的指針超出了函數調用的範圍。你需要做的是傳遞**變量。這意味着你傳遞一個指向指針的指針,指針指向你的內存塊。你可以通過減少你本地的*來修改原來的指針,一旦返回,你就很好。

如果你需要更多的解釋,只是問,但繼承人的解決方案

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

#define NEWline printf("\n") 

typedef struct position { 
    double x; 
    double y; 
    double z; 
} position; 

struct datalist { 
    position v; 
    struct datalist *pnext; 

}; 
typedef struct datalist datalist; 

void initializeList (datalist **head); 
void addList_II (datalist **head , double data[3]); 

void initializeList (datalist **head){ 
    position pv= {0,0,0}; 
    *head = (datalist *) malloc (sizeof (datalist)); 
     if (head == NULL){ printf("cannot allocate memory"); exit(1); } 
    (*head)->v=pv; 
    (*head)->pnext=NULL; 
} 

void addList_II (datalist **head , double data[3]) { 
    datalist *adddata; 
    adddata = (datalist *)malloc (sizeof (datalist)); 
     if (adddata == NULL) { printf("cannot allocate memory for insertion data"); exit(1); } 
    adddata->v.x = data[0]; 
    adddata->v.y = data[1]; 
    adddata->v.z = data[2]; 

    adddata->pnext = *head;  //DO THIS 
    *head=adddata; 
} 

int main() { 

    datalist *ptemp; 
    datalist temp; 
    int i,c; //counters 
    datalist *head; 

    initializeList(&head); 


    for (i = 0; i < 3; i++) { 
     double t[3]; 
     srand (time (NULL)*i+234); 
      temp.v.x = ((double) rand() )/ RAND_MAX; 
     srand (time (NULL)*i*546); 
      temp.v.y = ((double) rand() )/ RAND_MAX; 
     srand (time (NULL)*i*567+345); 
      temp.v.z = ((double) rand() )/ RAND_MAX; 
     t[0] = temp.v.x; t[1] = temp.v.y; t[2] = temp.v.z; 

     printf ("temp [v %d] -> %F %F %F \n",i, temp.v.x, temp.v.y, temp.v.z); 
     addList_II (&head, t); 
    } 

    ptemp=head; 

    while (ptemp!=NULL) { 
     NEWline; 
     printf("[v ] -> linked vertex is %F %F %F \n", ptemp->v.x,ptemp->v.y, ptemp->v.z); 
     ptemp=ptemp->pnext; 

    } 
} 
+0

好了,好的先生 – ryanbwork

+0

只是爲了清楚起見,你通過1 while循環迭代,因爲你設置head = adddata。因此,您有指向的內存中的唯一節點包含在頭節點中。所有其他人都在某個地方漂浮在太空中。 – 75inchpianist

+0

75inchpianist我認爲這將是我以前的版本中的問題,所以我創建了「datalist * start;然後設置start = head;然後ptemp = start;那是你在說什麼?那對我沒有幫助,但可能我是有其他問題並行; –

0

看你的代碼,在我看來,在功能addList_II你應該代替之前的最後一行與

adddata->pnext = head; 

而不是: adddata-> pnext = head-> pnext; 否則你總是會失去一個元素。 然後,您可以簡單地設置head=NULL而不是初始化列表。