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

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日

悬赏问题

  • ¥50 手写签名不能上传的问题
  • ¥30 linux odbc怎么添加gbase数据库
  • ¥20 电脑开机黑屏,只有一个鼠标,联想zj者y7000
  • ¥20 DXSDK_jun10
  • ¥20 请问这种量表怎么用spss量化分析(作为中介模型的因变量
  • ¥55 AD844 howland电流源如何驱动大额负载
  • ¥15 C++ /QT 内存权限的判断函数列举
  • ¥15 深度学习GFnet理解问题
  • ¥15 单细胞小提琴堆叠图代码
  • ¥50 升级strust2版本到2.3.15.1后使用ognl3.0.6.jar windows环境中没有问题,但部署到linux环境报错