链接列表,指针和节点

时间:2016-03-24 20:05:14

标签: c pointers linked-list

我试图进一步了解链接列表,节点和指针。我已经编写了一些代码,收到了一些编译错误,我不确定如何修复,并希望在这里得到一些指导。下面是我的代码+底部的编译错误。

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

typedef struct _node 
{
    int data;
    struct _node * next;
} node_t;

typedef struct 
{
    node_t * head;
    node_t * tail;  
} LL_t;

unsigned int removeNumber(LL_t * L, int target);

LL_t * LLcreate() {
    LL_t * ret = malloc(sizeof(LL_t));
    if (ret != NULL) {
        ret->head = NULL;
        ret->tail = NULL;
        }
    return ret;
}

// Adds a new element to the tail end of a list
void LLappend(LL_t * LL, int value) {
    node_t * newNode = malloc(sizeof(node_t));
    if (newNode != NULL) {
        newNode->data = value;
        LLappendNode(LL, newNode);
    }
}

void LLappendNode(LL_t * LL, node_t * newNode) {
    if (newNode != NULL) {
        newNode->next = NULL;
        if (LL->tail == NULL) {
            // empty list
            assert(LL->head == NULL);
            LL->head = newNode;
            LL->tail = newNode;
        } else {
            // non empty list
            LL->tail->next = newNode; // seg fault
            LL->tail = newNode;
        }
    }
}



// Post: removes data target from list L
unsigned int removeNumber(LL_t * LL, int target) {
int count=1;
node_t * curr = LL->head;

while(LL->head && LL->head->data == target){
    node_t * temp= LL->head;
    LL->head=LL->head->next;
    free(temp);
    count=0;
    }

while (curr->next!=NULL){
    node_t * temp = curr->next; 
    if (curr->next->data == target){
        curr->next = temp->next;
        curr=curr->next;
        free(temp); 
        count=0;
        return count;
        }
    }
}

int main(){
    int LL[6]={1,2,5,3,4,6};
    int i;
    LLcreate();
    for (i=0; i<10; i++)
        {
            LLappend(LL_t * LL, i);
        }
    for (i=0; i<10;i++)
        {
            printf("%d", LL[i]);
        }

}

编译错误

splcie.c:36:6: warning: conflicting types for 'LLappendNode' [enabled by default]
 void LLappendNode(LL_t * LL, node_t * newNode) {
      ^
splcie.c:32:9: note: previous implicit declaration of 'LLappendNode' was here
         LLappendNode(LL, newNode);
         ^
splcie.c: In function 'main':
splcie.c:84:22: error: expected expression before 'LL_t'
             LLappend(LL_t * LL, i);
                      ^
splcie.c:84:22: error: too few arguments to function 'LLappend'
splcie.c:28:6: note: declared here
 void LLappend(LL_t * LL, int value) {
      ^

2 个答案:

答案 0 :(得分:1)

错误1:在&#39; LL_t&#39;之前的预期表达LLappend(LL_t * LL, i);

在转型时{p> 修复:LL_t *括在括号中:LLappend((LL_t *) LL, i);

错误2:警告:&{39; LLappendNode&#39;

的类型存在冲突
void LLappendNode(LL_t * LL, node_t * newNode) {
  ^

之前的隐含声明&#39; LLappendNode&#39;在这里LLappendNode(LL, newNode);

修复:LLappendNode中调用此LLappend之前提供void LLappendNode(LL_t * LL, node_t * newNode); //prototype void LLappend(LL_t * LL, int value) { node_t * newNode = malloc(sizeof(node_t)); if (newNode != NULL) { newNode->data = value; LLappendNode(LL, newNode); } } 的原型/解除:

%union

答案 1 :(得分:0)

在LLappend之前定义LLappendNode

并删除主

中的LL_t *