马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 菜鸟小乔 于 2019-6-6 20:50 编辑
代码功能:静态链表的初始化、插入、打印。
问题描述:之前写代码一直是分3个文件:.h文件声明函数,.cpp文件实现函数,main.cpp文件调用函数,两个.cpp文件都只include自定义的 .h文件,没有出过问题。
但这一次main.cpp文件需要include函数实现的“.cpp”文件,否则就会报错“无法解析的外部符号(后面是自定义的函数名)”。
错误 LNK2019 无法解析的外部符号 "void __cdecl PrintSLL(struct <unnamed-type-SLL> * const)" (?PrintSLL@@YAXQAU<unnamed-type-SLL>@@@Z),该符号在函数 _main 中被引用 ch4 C:\Users\ELEVEN\Desktop\ch4\main.obj
代码本身没什么问题,就是想问为什么这一次一定要include .cpp文件呢?之前同样的套路从没有include 过.cpp文件。
---------------demo.h文件---------------#ifndef demo_h_include
#define demo_h_include
#include<iostream>
using namespace std;
#define MAX_SIZE 10
struct eleType {
int id;
string name;
};
typedef struct {
eleType data;
int next;
}SLL[MAX_SIZE];
void Init(SLL list_s);//初始化函数
void PrintSLL(SLL list_s);//打印函数
int insertSLL(SLL list_s, int pos,eleType element);//插入函数
int newSLL(SLL list_s);//为静态链表分配内存,返回0表示分配失败
#endif
---------------sll_demo.cpp文件---------------#include<iostream>
#include"demo.h"
using namespace std;
void Init(SLL list_s)//初始化
{
for (int i = 0; i < MAX_SIZE; i++)
{
list_s[i].next = i + 1;
}
list_s[MAX_SIZE-1].next = 0;
list_s[MAX_SIZE-2].next = 0;
return ;
}
////////////////////////插入函数/////////////////////
int insertSLL(SLL list_s, int pos, eleType element)
{
int cursor = MAX_SIZE - 1;//得到第一个元素下标
//判断cursor范围是否合法
//分配内存
int newIndex = newSLL(list_s);
if (newIndex)//不为零
{
list_s[newIndex].data = element;
//找到newindex前缀节点
for (int i = 1; i < pos - 1; i++)
{
cursor = list_s[cursor].next;
}
list_s[newIndex].next = list_s[cursor].next;
list_s[cursor].next = newIndex;
return 1;
}
return 0;
}
/////////////////分配内存函数/////////////////
int newSLL(SLL list_s)
{
int cursor = list_s[0].next;//得到第一个空闲节点下标
if (cursor)
{
list_s[0].next = list_s[cursor].next;//新的空闲节点指向这个节点的下一个
}
return cursor;
}
//////////////////////打印函数//////////////////////////
void PrintSLL(SLL list_s)
{
for (int i = 0; i < 10; i++)
{
cout<<"i:"<<i
<< " next:" << list_s[i].next <<"\t"
<<"id:"<<list_s[i].data.id << "\t"
<<"name:"<<list_s[i].data.name<< endl;
}
cout << "---------打印完毕----------" << endl;
}
-------------------main.cpp------------------#include<iostream>
#include"demo.h"
#include"sll_demo.cpp" //这一句,不加就会报错“无法解析的外部符号Init、PrintSLL。”
using namespace std;
int main()
{
SLL list1;
Init(list1);
PrintSLL(list1);
return 0;
}
typedef struct A{
eleType data;
int next;
}SLL;
SLL是struct A的别名
typedef struct {
eleType data;
int next;
}SLL;
SLL是谁的别名?
SLL不是谁的别名,那么报错
|