2013-11-25 194 views
0

我做對了嗎?我在這裏得到一個奇怪的錯誤...指針鏈接列表C

 
linked.c: In function ‘push’: 
linked.c:50:19: warning: assignment from incompatible pointer type [enabled by default] 
linked.c: In function ‘main’: 
linked.c:146:9: error: incompatible type for argument 1 of ‘push’ 
linked.c:45:6: note: expected ‘struct node **’ but argument is of type ‘struct node’ 
~/swen250/CLinkedList$ gcc -o linked linked.c 
linked.c: In function ‘push’: 
linked.c:50:19: warning: assignment from incompatible pointer type [enabled by default] 
~/swen250/CLinkedList$ gcc -o linked linked.c 
linked.c: In function ‘pop’: 
linked.c:63:19: error: request for member ‘data’ in something not a structure or union 
linked.c:64:20: error: request for member ‘next’ in something not a structure or union 
linked.c: In function ‘copyList’: 
linked.c:106:9: warning: passing argument 1 of ‘appendNode’ from incompatible pointer type [enabled by default] 
linked.c:75:6: note: expected ‘struct node **’ but argument is of type ‘struct node *’ 
#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int data; 
    struct node* next; 
}; 

static int length(struct node** head); 
static void push(struct node** head, int data); 
static int pop(struct node** head); 
static void appendNode(struct node** head, int data); 
static struct node *copyList(struct node** head); 
static void printList(struct node** head); 



/************************************************************ 
length - return length of a list 
************************************************************/ 
int length(struct node** head) { 
    int count = 0; 
    struct node* current = NULL; 

    current = *head; 
    while (current != NULL) { 
     current = current->next; 
     ++count; 
    } 

    return count; 
} 


/************************************************************ 
push - add new node at beginning of list 
************************************************************/ 
void push(struct node** head, int data) { 
    struct node* new_ptr = NULL; 

    new_ptr = (struct node*)malloc(sizeof(struct node)); 
    new_ptr->data = data; 
    new_ptr->next = *head; 

    *head = new_ptr; 
} 

/************************************************************ 
pop - delete node at beginning of non-empty list and return its data 
************************************************************/ 
int pop(struct node** head) { 
    int val = 0; 
    struct node* temp = NULL; 

    if (*head != NULL) { 
     val = head->data; 
     temp = head->next; 
     free(head); 
     *head = temp; 
    } 

    return(val); 
} 

/************************************************************ 
appendNode - add new node at end of list 
************************************************************/ 
void appendNode(struct node** head, int data) { 
    struct node* current = NULL; 
    struct node* previous = NULL; 
    struct node* new_ptr = NULL; 

    current = *head; 
    previous = current; 
    while (current != NULL) { 
     previous = current; 
     current = current->next; 
    } 

    new_ptr = (struct node*)malloc(sizeof(struct node)); 
    new_ptr->data = data; 
    new_ptr->next = NULL; 

    previous = new_ptr; 

} 

/************************************************************ 
copyList - return new copy of list 
************************************************************/ 
struct node* copyList(struct node** head) { 
    struct node* copy = NULL; 
    struct node* current = NULL; 
    struct node* new_ptr = NULL; 

    /* Copy current head to copy */ 
    current = *head; 
    while (current != NULL) { 
     appendNode(copy, current->data); 
     current = current->next; 
    } 

    return copy; 
} 


/************************************************************ 
printList - print linked list as "List: < 2, 5, 6 >" (example) 
************************************************************/ 
void printList(struct node** head) { 
    struct node* current = NULL; 

    printf("List: < "); 

    current = *head; 
    if (current == NULL) 
     printf("none "); 

    while (current != NULL) { 
     printf("%d", current->data); 
     current = current->next; 
     if (current != NULL) 
      printf(", "); 
    } 

    printf(" >\n"); 
} 

void main() { 
    int i;      // index used for loops 
    struct node *list_a;  // a new list 
    struct node *list_a_copy; // copy of list 
    list_a = NULL;    // initialize empty list 
    list_a_copy = NULL;   // initialize empy list 


    // test push 
    for (i = 0; i < 4; ++i) 
     push(&list_a, i); 

    // test length 
    printf("Length of list = %d\n", length(&list_a)); 

    // test print head list 
    printf("head:\n"); 
    printList(&list_a); 

    // test append node 
    for (i = 4; i < 8; ++i) 
     appendNode(&list_a, i); 

    // test print head list 
    printf("head(append):\n"); 
    printList(&list_a); 

    // make a copy of list 
    list_a_copy = copyList(&list_a); 

    // test pop head list 
    for (i = 0; i < 4; ++i) 
     printf("%d popped\n", pop(&list_a)); 

    // test print copy list 
    printf("head copy:\n"); 
    printList(&list_a_copy); 

    // test pop copy list 
    for (i = 0; i < 4; ++i) 
     printf("%d popped\n", pop(&list_a_copy)); 

} 
+0

我看到的一個問題是,您在單個指針的上下文中使用雙指針。 –

回答

0

從錯誤日誌中,我注意到你有不兼容的類型數倍的時間。如果你發佈main.cpp,它也會有所幫助。

p.s就像Mike G所說的,雙指針真的太過分了。您可以使用單個指針實現鏈接列表。

0

問題出在你的pop()函數中......看一看。 要分配

val=head->data; 
temp = head->next; 

還你解放了頭,然後重新分配。

你應該做這樣的

val=(*head)->data; 
temp=(*head)->next; 

,並同時釋放內存...釋放溫度並重新分配頭其下。

2

問題是如何使用雙指針的方式。

這裏是完整的工作代碼: 我已就如何雙指針的使用方式的一些變化。 您可以看到彈出功能和copyList功能的更改。

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

struct node { 
    int data; 
    struct node* next; 
}; 

static int length(struct node** head); 
static void push(struct node** head, int data); 
static int pop(struct node** head); 
static void appendNode(struct node** head, int data); 
static struct node *copyList(struct node** head); 
static void printList(struct node** head); 



/************************************************************ 
length - return length of a list 
************************************************************/ 
int length(struct node** head) { 
    int count = 0; 
    struct node* current = NULL; 

    current = *head; 
    while (current != NULL) { 
    current = current->next; 
    ++count; 
    } 

    return count; 
} 


/************************************************************ 
push - add new node at beginning of list 
************************************************************/ 
void push(struct node** head, int data) { 
    struct node* new_ptr = NULL; 

    new_ptr = (struct node*)malloc(sizeof(struct node)); 
    new_ptr->data = data; 
    new_ptr->next = *head; 

    *head = new_ptr; 
} 

/************************************************************ 
pop - delete node at beginning of non-empty list and return its data 
************************************************************/ 
int pop(struct node** head) { 
    int val = 0; 
    struct node* temp = NULL; 

    if (*head != NULL) { 
    val = (*head)->data; 
    temp = (*head)->next; 
    free(*head); 
    *head = temp; 
    } 

    return(val); 
} 

/************************************************************ 
appendNode - add new node at end of list 
************************************************************/ 
void appendNode(struct node** head, int data) { 
    struct node* current = NULL; 
    struct node* previous = NULL; 
    struct node* new_ptr = NULL; 

    current = *head; 
    previous = current; 
    while (current != NULL) { 
    previous = current; 
    current = current->next; 
    } 

    new_ptr = (struct node*)malloc(sizeof(struct node)); 
    new_ptr->data = data; 
    new_ptr->next = NULL; 

    previous = new_ptr; 

} 

/************************************************************ 
copyList - return new copy of list 
************************************************************/ 
struct node* copyList(struct node** head) { 
    struct node* copy = NULL; 
    struct node* current = NULL; 
    struct node* new_ptr = NULL; 

    /* Copy current head to copy */ 
    current = *head; 
    while (current != NULL) { 
    appendNode(&copy, current->data); 
    current = current->next; 
    } 

    return copy; 
} 


/************************************************************ 
printList - print linked list as "List: < 2, 5, 6 >" (example) 
************************************************************/ 
void printList(struct node** head) { 
    struct node* current = NULL; 

    printf("List: < "); 

    current = *head; 
    if (current == NULL) 
    printf("none "); 

    while (current != NULL) { 
    printf("%d", current->data); 
    current = current->next; 
    if (current != NULL) 
     printf(", "); 
    } 

    printf(" >\n"); 
} 

void main() { 
    int i;      // index used for loops 
    struct node *list_a;  // a new list 
    struct node *list_a_copy; // copy of list 
    list_a = NULL;    // initialize empty list 
    list_a_copy = NULL;   // initialize empy list 


    // test push 
    for (i = 0; i < 4; ++i) 
    push(&list_a, i); 

    // test length 
    printf("Length of list = %d\n", length(&list_a)); 

    // test print head list 
    printf("head:\n"); 
    printList(&list_a); 

    // test append node 
    for (i = 4; i < 8; ++i) 
    appendNode(&list_a, i); 

    // test print head list 
    printf("head(append):\n"); 
    printList(&list_a); 

    // make a copy of list 
    list_a_copy = copyList(&list_a); 

    // test pop head list 
    for (i = 0; i < 4; ++i) 
    printf("%d popped\n", pop(&list_a)); 

    // test print copy list 
    printf("head copy:\n"); 
    printList(&list_a_copy); 

    // test pop copy list 
    for (i = 0; i < 4; ++i) 
    printf("%d popped\n", pop(&list_a_copy)); 
}