2012-08-01 86 views
-1

我想知道我的程序設計是否正確,以及瞭解我的評論區域是否正在做它應該做的事情。我得到這些編譯錯誤,這些錯誤可能與我的代碼的評論片段相關聯,我會撒謊以獲得一些幫助。謝謝!鏈表&&結構

part1.c:15:6: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'insert' 
    part1.c: In function 'main': 
    part1.c:43:14: error: incompatible types when assigning to type 'struct point' from    type 'int' 
    part1.c:49:44: error: invalid type argument of '->' (have 'struct point') 
    part1.c:49:59: error: invalid type argument of '->' (have 'struct point') 
    part1.c:55:5: error: incompatible type for argument 1 of 'free' 
/usr/include/stdlib.h:488:13: note: expected 'void *' but argument is of type 'struct point' 






char *chars[3]= {"a","b","c"}; 

int nums[3]= {5,8,9}; 

struct point {char *letter; 
       int number; 
      struct point *next;}; 

struct point* insert(struct point list[],char *rqdLetters, int rqdNums) 
{ 
    struct point *new; 

    new = (struct point*)malloc(sizeof(struct point)); 
    if(new == NULL) 
    fprintf(stderr,"error!"); 

    new->letter = rqdLetters; 
    new->number = rqdNums; 

    new->next = head; 
    head = new; 

    //not sure if i'm returning the a pointer to the start of new list 
    return head; 
} 

int main(int argc, char **argv)            
{ 
    //not sure if i need to declare these here or in the insert 
    struct point list[3];   
    struct point *head = NULL; 
    struct point *next; 
    struct point *new; 

    int i; 
    for (i = 0; i < 3; i++) 
    { 
     //return result put back into the pointer to the start of the list 
     head[i] = insert(list[i], chars[i], nums[i]); 
    } 

    int j; 
    for(j = 0; j < 3; j++) 
    { 
     printf("letter %s and number %d\n", list[j]->letter, list[j]->number); 
    } 

    int z; 
    for(z = 0; z < 3; z++) 
    { 
     free(list[z]); 
    } 

    return 0; 
    } 
+1

'new = list;'?也許你的意思是'列出新的;'或甚至'struct point * new;' – 2012-08-01 16:14:18

+0

確切地說,謝謝,雖然這不是主要問題 – 2012-08-01 16:16:04

+1

什麼是'list'?你的意思是'結構點'嗎? – 2012-08-01 16:18:42

回答

1

一眼就看出您的代碼有幾個問題。首先,你沒有正確地聲明你的變量。

new = list; 

應該是:

struct point* new; 

你的函數簽名看起來也有點懷疑。如果你返回一個指針,以你的數據結構,它應該是這樣的:

struct point* insert(...) { ... } 

在更廣泛的層面上,我似乎喜歡你的一個鏈表的想法可能有點過。要表示一個列表,你只需要堅持列表的headtail,而不是保留你的觀點數組。

如果您創建一個數據結構來保存這些指針,它通常會很有幫助。然後,您可以將此結構傳遞給列表上運行的函數,例如功能insert()

作爲一個簡單的例子(未經測試):

struct node { 
    struct node *next; 
    char letter; 
    int number; 
} 

struct list { 
    struct node *head; 
    struct node *tail; 
} 

/* create a new list */ 
struct list* list_new(void) { 
    struct list *L = malloc(sizeof(struct list)); 
    L->head = NULL; 
    L->tail = NULL; 
} 

/* add a new node to the list */ 
void list_insert(struct list *list, char in_letter, int in_number) { 
    struct node *node = malloc(sizeof(struct node)); 
    node->letter = in_letter; 
    node->number = in_number; 
    node->next = NULL; 

    if (list->head == NULL) { /* empty list */ 
    list->head = node; 
    list->tail = node; 
    } else { /* append to list */ 
    list->tail->next = node; 
    list->tail = node; 
    } 
} 

然後,您可以使用它作爲這樣的:

int i; 
char chars[3]= {"a","b","c"}; 
int nums[3]= {5,8,9}; 

struct list *mylist = list_new(); 

for (i = 0; i < 3; i++) 
{ 
    list_insert(mylist, chars[i], nums[i]); 
} 

迴應:

...我不知道我是否應該在插入或主要內部聲明它,我在主要howeve中做過r

這取決於您打算使用變量的位置以及這些變量的預期壽命。正如以上評論所述,您可能想要提高對範圍規則的理解。

+0

謝謝肖恩!非常有幫助的點 – 2012-08-01 16:58:30

+0

不客氣Mike。很高興我能幫上忙。 – 2012-08-01 17:01:22