νιζ 2022-09-19 15:18 采纳率: 75%
浏览 35
已结题

LNK2005,某函数已在 .obj中定义

问题遇到的现象和发生背景

我在linklist.c 中实现了一些单链表的基础操作,但是在linklist_main.c中定义主方法想调用时却发生了以下错误,

用代码块功能插入代码,请勿粘贴截图

linklist_main.c

#include"linklist.c"

int main()
{
    LinkNode* h=NULL;
    InitList(h);
    ElemType a[5] = { 'a','b','c','d','e' };
    CreatList(h, a, 5);
    DispList(h);
}

linklist.c

#include<stdio.h>
#include<malloc.h>
#include<stdbool.h> 
typedef char ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode* next;
}LinkNode;

void InitList(LinkNode* L)
{
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L ->next = NULL;
}

void CreatList(LinkNode* L, ElemType a[], int n)
{
    LinkNode* s, * r;
    L = (LinkNode*)malloc(sizeof(LinkNode));
    L->next = NULL;
    r = L;
    for (int i = 0; i < n; i++)
    {
        s = (LinkNode*)malloc(sizeof(LinkNode));
        s->data = a[i];
        r->next = s;
        r = s;
    }
    r->next = NULL;
}

void DispList(LinkNode* L)
{
    LinkNode* p = L->next;
    while (p != NULL)
    {
        printf("%d", p->data);
        p = p->next;
    }
    printf("\n");
}
int getListLength(LinkNode* L)
{
    int i = 0;
    LinkNode* p = L;
    while (p->next != NULL)
    {
        i++;
        p = p->next;
    }
    return i;
}


bool ListIsEmpty(LinkNode* L)
{
    return(L->next == NULL);
}

ElemType GetItem(LinkNode* L, int i)
{
    int j = 0;
    LinkNode* p = L;
    while (i<0 || i> getListLength(L))
    {
        printf("输入了错误的数字,请重新输入");
        scanf_s("%d", &i);
    }
    while (j<i&&p != NULL)
    {
        j++;
        p = p->next;
    }
    return p->data;
}

int LocateElem(LinkNode* L, ElemType e)
{
    int i = 1;
    LinkNode* p = L->next;
    while (p != NULL&&p->data != e)
    {
        p = p->next;
        i++;
    }
    if (p == NULL)
        return 0;
    else
        return i;
}

bool ListInsert(LinkNode* L, int i, ElemType e)
{
    int j = 0;
    LinkNode* p = L, * s;
    if (i<= 0)return false;
    while (j<i - 1 && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
        return false;
    else
        s = (LinkNode*)malloc(sizeof(LinkNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}

bool Listdelete(LinkNode* L, int i, ElemType e)
{
    int j = 0;
    LinkNode* p = L, * q;
    if (i<= 0)return false;
    while (j<i - 1 && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)return false;
    else
    {
        q = p->next;
        if (q == NULL)
            return false;
        e = q->data;
        p->next = q->next;
        free(q);
        return true;
    }
}

运行结果及报错内容

错误 LNK2005 CreatList 已经在 linklist.obj 中定义

img

请问是哪里出错了?

  • 写回答

2条回答 默认 最新

  • _GX_ 2022-09-19 16:04
    关注

    在linklist_main.c文件中,你包含了linklist.c文件,#include"linklist.c",这就导致了linklist.c文件中的所有函数都被定义了两次。
    你应该写一个头文件linklist.h,头文件里只包含函数声明,然后linklist_main.c文件包含头文件,而不是实现源文件。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月27日
  • 已采纳回答 9月19日
  • 创建了问题 9月19日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效