使用C指针和结构

时间:2017-03-04 22:50:47

标签: c pointers struct

描述

我试图理解C中的指针,链表,结构等。作为一种学习经历,我写了这个小程序,其中:

  • 使用结构指针定义一些基本结构并在它们之间创建链接。
  • 遍历整个链表并打印出所有变量。
  • 创建另一个结构,但不会将其插入链接列表。
  • 调用一个函数insertEntry,它在链接列表的一个元素和他的直接关注者之间插入一个给定的结构。

到目前为止我做了什么:

  • This Stack Overflow answer说:"这实际上意味着源代码结构中的其他地方还有另一个函数/声明[..],它具有不同的函数签名。"

    • 我已在函数定义,声明及其调用中检查了拼写错误。
    • 我检查了参数的数量和类型。 insertEntry的两个参数总是两个相同类型的结构。
  • This different Stack Overflow answer说:"您已忘记#include "client.h",所以定义",但我也检查过。文件系统上的实际文件名和#include

===>我不知道,我的错误在哪里。

ex1_insertStructure_linkedList.h:

void insertEntry(struct entry, struct entry);

ex1_insertStructure_linkedList.c:

#include <stdio.h>
#include "ex1_insertStructure_linkedList.h"

struct entry {
    int value;
    struct entry *next;
};

// clangtidy: conflicting types for 'insertEntry' [clang-diagnostic-error]
void insertEntry(struct entry given_entry, struct entry entry_to_insert) {

    printf("Print inside insertEntry method: %i\n", given_entry.value);
    struct entry *second_pointer = (given_entry).next;

    // entry_to_insert is now the element in the middle
    given_entry.next = &entry_to_insert;

    // the third element
    entry_to_insert.next = second_pointer;

    return;
}

int main(int argc, char *argv[]) {
    struct entry n1, n2, n3;

    n1.value = 1;
    n1.next = &n2;

    n2.value = 32;
    n2.next = &n3;

    n3.value = 34242;
    n3.next = (struct entry *)0;

    struct entry *list_pointer = &n1;

    while (list_pointer != (struct entry *)0) {
        int printValue = (*list_pointer).value;
        list_pointer = (*list_pointer).next;
        printf("%i\n", printValue);
    }

    printf("--------------------\n");
    list_pointer = &n1;

    struct entry a;
    a.value = 999999;
    a.next = (struct entry *)0;

    // clangtidy: argument type 'struct entry' is incomplete [clang-diagnostic-error]
    insertEntry(n1, a);

    while (list_pointer != (struct entry *)0) {
        int printValue = list_pointer->value;
        list_pointer = list_pointer->next;
        printf("%i\n", printValue);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

您应该在{strong> ex1_insertStructure_linkedList.h 中放置struct entry声明:

struct entry {
    int value;
    struct entry *next;
};

void insertEntry(struct entry, struct entry);

答案 1 :(得分:2)

您需要在文件entry中“转发声明”结构ex1_insertStructure_linkedList.h,即在函数声明之前:void insertEntry(struct entry, struct entry);,之前放置以下struct entry;那个功能宣言。

这是因为当编译器遇到insertEntry(struct entry, struct entry);时,它对struct entry一无所知。通过正向声明struct entry,您可以“确保”编译器在源文件中的某处定义了struct entry