练习数据结构编程时出现error LNK2001错误,求助,谢谢。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练习数据结构编程时出现error LNK2001错误,求助,谢谢。相关的知识,希望对你有一定的参考价值。

以下是各个文件的源代码

//FILE:StuInfor.h
/*--------------------------------------------------------------------------------------------------------------------*/
#ifndef STUINFOR_H_H
#define STUINFOR_H_H

#include <cstdlib>
#include <iostream>

class StuInfor

friend class Student;
public:
StuInfor(void);
StuInfor(char* name,int id);
StuInfor(const StuInfor& stuinfor);
//~StuInfor();

bool PrintStuInfor() const;
protected:
char* Name;
int ID;
;

#endif

/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:Student.h
#ifndef STUDENT_H_H
#define STUDENT_H_H

#include "StuInfor.h"
#include <iostream>

class Student

public:
Student(void);
Student(const StuInfor& infor);
//~Student();

bool PrintAll() const;
private:
StuInfor* Infor;
static Student* head;
Student* next;
;

#endif

/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:StuInfor.cpp
#include "StuInfor.h"

StuInfor::StuInfor(char* name,int id)

Name=new char[strlen(name)+1];
strcpy(Name,name);
ID=id;


StuInfor::StuInfor(const StuInfor& stuinfor)

Name=new char[strlen(stuinfor.Name)+1];
strcpy(Name,stuinfor.Name);
ID=stuinfor.ID;


bool StuInfor::PrintStuInfor() const

std::cout<<Name<<" "<<ID<<std::endl;
return true;


/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:Student.cpp

#include "Student.h"
#include "StuInfor.h"

Student::Student(const StuInfor& infor)

Infor=new StuInfor[strlen(infor.Name)+sizeof(int)+1];
strcpy(Infor->Name,infor.Name);
Infor->ID=infor.ID;
this->next=head;
head=this;


bool Student::PrintAll() const

Student *p=head;
while (p->next!=NULL)

p->Infor->PrintStuInfor();
p=p->next;

return true;


Student* Student::head=NULL;
/*--------------------------------------------------------------------------------------------------------------------*/

//FILE:Main.cpp

#include <iostream>
using namespace std;

#include "Student.h"
#include "StuInfor.h"

int main(int argc,char* argv[])

StuInfor stuinfor1("张三",1001);
StuInfor stuinfor2("李四",1002);
Student stu1(stuinfor1);
Student stu2(stuinfor2);
stu1.PrintAll();
return 0;


/*--------------------------------------------------------------------------------------------------------------------*/

出错
--------------------Configuration: Student - Win32 Debug--------------------
Compiling...
Main.cpp
Linking...
Student.obj : error LNK2001: unresolved external symbol "public: __thiscall StuInfor::StuInfor(void)" (??0StuInfor@@QAE@XZ)
Debug/Student.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Student.exe - 2 error(s), 0 warning(s)
谢谢 kivenxia。参考了你给的例子确实可以完成普通链表的创建,只是我的这个练习节点中的数据是复杂数据结构,想着用嵌套类实现。
LNK2001这个问题我遇见过多次,有时候参照网上给的做法能改好,有时不能。于是想知道这个例子中出现这个错误的原因,是那段代码出错了?
再次谢谢。

/*由于代码较长,我没有再作改动,这是数据结构编程的代码,要在C环境下运行,只需把引用方式改下即可*/

#include <stdio.h>
#include <malloc.h>
typedef struct node
float coef; /*序数*/
int expn; /*指数*/
struct node *next; /*指向下一个结点的指针*/
PolyNode;
void InitList(PolyNode *&L) /*初始化多项式单链表*/

L=(PolyNode *)malloc(sizeof(PolyNode)); /*建立头结点*/
L->next=NULL;

int GetLength(PolyNode *L) /*求多项式单链表的长度*/

int i=0;
PolyNode *p=L->next;
while (p!=NULL) /*扫描单链表L,用i累计结点个数*/

i++;p=p->next;

return i;

PolyNode *GetElem(PolyNode *L,int i) /*返回多项式单链表中第i个结点的指针*/

int j=1;
PolyNode *p=L->next;
if (i<1 || i>GetLength(L))
return NULL;
while (j<i) /*沿next域找第i个结点*/

p=p->next;j++;

return p;

PolyNode *Locate(PolyNode *L,float c,int e) /*在多项式单链表中按值查找*/

PolyNode *p=L->next;
while (p!=NULL && (p->coef!=c ||p->expn!=e))
p=p->next;
return p;

int InsElem(PolyNode *&L,float c,int e,int i) /*在多项式单链表中插入一个结点*/

int j=1;
PolyNode *p=L,*s;
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=c;s->expn=e;s->next=NULL;
if (i<1 || i>GetLength(L)+1)
return 0;
while (j<i) /*查找第i-1个结点*p*/

p=p->next;j++;

s->next=p->next;
p->next=s;
return 1;

int DelElem(PolyNode *L,int i) /*在多项式单链表中删除一个结点*/

int j=1;
PolyNode *p=L,*q;
if (i<1 || i>GetLength(L))
return 0;
while (j<i) /*在单链表中查找第i-1个结点,由p指向它*/

p=p->next;j++;

q=p->next; /*q指向被删结点*/
p->next=q->next; /*删除*q结点*/
free(q);
return 1;

void DispList(PolyNode *L) /*输出多项式单链表的元素值*/

PolyNode *p=L->next;
while (p!=NULL)

printf("(%g,%d) ",p->coef,p->expn);
p=p->next;

printf("\n");

void CreaPolyList(PolyNode *&L,float C[],int E[],int n)

int i;
InitList(L);
for (i=0;i<n;i++)
InsElem(L,C[i],E[i],i+1);

void SortPloy(PolyNode *&L) /*对L的多项式单链表按expn域递增排序*/

PolyNode *p=L->next,*q,*pre;
L->next=NULL;
while (p!=NULL)

if (L->next==NULL) /*处理第1个结点*/

L->next=p;p=p->next;
L->next->next=NULL;

else /*处理其余结点*/

pre=L;q=pre->next;
while (q!=NULL && p->expn>q->expn) /*找q->expn刚大于或等于p->expn的结点*q的前驱结点*pre*/

pre=q;q=q->next;

q=p->next; /*在*pre结点之后插入*p*/
p->next=pre->next;
pre->next=p;
p=q;



PolyNode *AddPoly(PolyNode *pa,PolyNode *pb)

PolyNode *pc,*p1=pa->next,*p2=pb->next,*p,*tc,*s;
pc=(PolyNode *)malloc(sizeof(PolyNode)); /*新建头结点*pc*/
pc->next=NULL; /*pc为新建单链表的头结点*/
tc=pc; /*tc始终指向新建单链表的最后结点*/
while (p1!=NULL && p2!=NULL)

if (p1->expn<p2->expn) /*将*p1结点复制到*s并链到pc尾*/

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;

else if (p1->expn>p2->expn) /*将*p2结点复制到*s并链到pc尾*/

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;

else /*p1->expn=p2->expn的情况*/

if (p1->coef+p2->coef!=0) /*序数相加不为0时新建结点*s并链到pc尾*/

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p1->coef+p2->coef;s->expn=p1->expn;
s->next=NULL;
tc->next=s;tc=s;

p1=p1->next;p2=p2->next;


if (p1!=NULL) p=p1; /*将尚未扫描完的余下结点复制并链接到pc单链表之后*/
else p=p2;
while (p!=NULL)

s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
tc->next=s;tc=s;
p=p->next;

tc->next=NULL; /*新建单链表最后结点的next域置空*/
return pc;

void main()

PolyNode *L1,*L2,*L3;
float C1[]=3,7,5,9,C2[]=-9,8,22;
int E1[]=1,0,17,8,E2[]=8,1,7;
InitList(L1);
InitList(L2);
InitList(L3);
CreaPolyList(L1,C1,E1,4);
CreaPolyList(L2,C2,E2,3);
printf("两多项式相加运算\n");
printf(" 原多项式A:");DispList(L1);
printf(" 原多项式B:");DispList(L2);
SortPloy(L1);
SortPloy(L2);
printf("排序后的多项式A:");DispList(L1);
printf("排序后的多项式B:");DispList(L2);
L3=AddPoly(L1,L2);
printf("多项式相加结果:");DispList(L3);


/*这是第二题,由于你的链表没说是否排序,所以用的最耗时的方法,如果是排序的那用归并排序就很简单了*/

typedef struct node
int data;
struct node *next;
Link;
void merge(Link *a,Link *b,Link *c) /*设a,b都是带头结点的单链表,c是合并后的*/
Link *p,*q,*r,*s;
p=b->next;
c=(Link *)malloc(sizeof(Link));
q=c;
while(p!=NULL) /*将b复制到c*/
s=(Link *)malloc(sizeof(Link));
s->data=p->data;
q->next=s;
q=s;
p=p->next;

q->next=NULL;

p=a->next; /*找出不同的项,并连接在c的后面*/
while(p!=NULL)
r=b->next;
while(r!=NULL)
if(p->data==r->data)
break;
r=r->next;

if(r!=NULL)
s=(Link *)malloc(sizeof(Link));
s->data=p->data;
s->next=NULL;
q->next=s;
q=s;

p=p->next;



你最后看下,应该改下后就没问题了
参考技术A 我告诉你,你代码中的StuInfor类中的一个构造函数只做了声明,没有定义,就是那个默认构造函数StuInfor(void).
之所以在链接的时候报错而不是在编译的时候报错,是因为你这样做,没有语法上的错误,编译阶段检查不到.但是到了链接阶段,编译器去找你这个函数的定义时,发现找不到,所以报错!
改正的方法就是,你在StuInfor这个类当中,把默认构造函数StuInfor给定义了.像这样: StuInfor(void) 而不是像你这样StuInfor(void);声明

这样就没问题了本回答被提问者采纳

以上是关于练习数据结构编程时出现error LNK2001错误,求助,谢谢。的主要内容,如果未能解决你的问题,请参考以下文章

c语言编写时出现error LNK2001: unresolved external symbol _start

VISUAL C++调试时出现LNK2001 与 LNK1120错误

VS编写C++/C时出现错误LNK2001 无法解析的外部符号 main

error LNK2001: 无法解析的外部符号

error LNK2001: 无法解析的外部符号

error LNK2001: 无法解析的外部符号