LIDABEN_FIGHTING 2016-06-23 13:54 采纳率: 100%
浏览 1128
已采纳

如何处理以下问题,大神帮忙看下,指针在函数中用引用型怎么使用

void main(){
LinkList L;
BOOL temp;
int num, loc, flag = 1;
char j;
Stu stu;
printf("本程序实现链式结构的线性表操作: 插入,删除,定位,查找等\n");
printf("请输入初始链表长度:"); //输入生成单链表时的元素个数
scanf_s("%d", &num);
CreatList(L, num); //生成单链表
ListPrint(L);
while (flag) {
printf("请选择:\n");
printf("1.显示所有学生记录\n"); //显示链表元素
printf("2.插入一个学生记录\n"); //插入链表元素
printf("3.删除一个学生记录\n"); //删除链表元素
printf("4.按关键字查找对应的学生记录\n"); //按关键字查找
printf("5.按结点序号查找学生记录\n"); //按结点序号查找
printf("6.退出程序 \n"); //退出
scanf_s(" %c", &j);
switch (j){
case '1':
ListPrint(L);
break;
case '2':
printf("请插入位置和输入元素(学生记录):\n");
printf("格式: 位置 学号 姓名 分数;例如:3,1001,张三,95.5\n");
//输入要插入的元素和要插入的位置
scanf_s("%d %d %s %f", &loc, &stu.sn, &stu.name, &stu.score);
temp = ListInsert(L, loc, stu); //插入
if (temp == False) printf("插入失败!\n");
else printf("插入成功!\n");
ListPrint(L);
break;
case '3':
printf("请输入要删除元素的结点位置:");
scanf_s("%d", &loc); //输入要删除的节点的位置
temp = ListDelete(L, loc, stu); //删除
if (temp == False) printf("删除失败!\n");
//删除成功,显示该元素
else printf("成功删除了一个元素:%d,%s,%.2f\n", stu.sn, stu.name, stu.score);
ListPrint(L);
break;
case '4':
if (L->next == NULL) printf("链表为空!\n");
else{
printf("请输入查找元素(学号 姓名 分数):");
scanf_s("%d %s %f", &stu.sn, &stu.name, &stu.score); //输入要查找的元素
temp = ListFind_keyword(L, stu, loc); //按关键字查找
if (temp == False) printf("没有找到该元素!\n");
else printf("该元素在链表的第%d 个结点\n", loc);
}
break;
case '5':
if (L->next == NULL) printf("链表为空!\n"); //链表为空
else{
printf("请输入查找位置:");
scanf_s("%d", &loc); //输入查找元素的位置
temp = ListFind_loc(L, loc, stu); //按结点序号查找
if (temp == False) printf("该位置不存在!\n");
else printf("第%d 个元素是:%d %s %.2f\n", loc, stu.sn, stu.name, stu.score);
}
break;
default:
flag = 0;
DestroyLink(L); //销毁链表,回收空间
printf("程序结束,按任意键退出!\n");
}
}
}

头文件:

#ifndef _LINK_H
#define _LINK_H
#include
#include
#include
enum BOOL{ False, True }; //定义 BOOL 型
typedef struct{
int sn;
char name[10];
float score;
}Stu;
typedef Stu ElemType;
typedef struct node{
ElemType data; //数据域
struct node *next; //指向下一个节点的指针
}LNode, *LinkList;
void CreatList(LinkList &L, int n);
//在单链表的第 i 各位置插入元素 e,成功返回 True,失败返回 False
BOOL ListInsert(LinkList &L, int i, ElemType e);
//在单链表中删除第 i 个元素,成功删除返回 True,并用 e 返回该元素值,失败返回 False
BOOL ListDelete(LinkList &L, int i, ElemType &e);
//在单链表中查找关键字为 e 的元素,成功返回 True,并用 i 返回该元素位置,失败返回 False
BOOL ListFind_keyword(LinkList L, ElemType e, int &i);
//在单链表中查找第 i 个元素,成功返回 True,并用 e 返回该元素值,失败返回 False
BOOL ListFind_loc(LinkList L, int i, ElemType &e);
void ListPrint(LinkList L); //显示链表所有元素
void DestroyLink(LinkList &L); //删除链表,回收内存空间
int CompareElemType(ElemType a, ElemType b); //比较结构体数据的异同
#endif

另一个头文件:
#include

void CreatList(LinkList &L, int n){ //生成一个带头结点的有 n 个元素的单链表
int i;
LinkList p;
L = (LinkList)malloc(sizeof(LNode)); //申请生成头结点
if (!L) exit(1);
L->next = NULL;
printf("使用头插法,请逆序位输入%d 个学生信息(学号 姓名 分数),如 101 张三 97.5:
\n",n);
getchar();
for (i = n; i>0; --i) { //头插法
p = (LinkList)malloc(sizeof(LNode)); //申请生成新结点
if (!p) exit(1);
scanf("%d %s %f", &p->data.sn, &p->data.name, &p->data.score);
p->next = L->next;
L->next = p;
}
printf("%d 个结点的链表已经建立\n", n);
}
BOOL ListInsert(LinkList &L, int i, ElemType e){ //在单链表的第 i 各位置插入元素 e,成功返回
True,失败返回 False
LinkList s, p = L;
int j = 0;
while (p && j p = p->next; ++j;
}
if (!p || j>i - 1) return False; //i s = (LinkList)malloc(sizeof(LNode)); //申请生成一个新结点
if (!s) exit(1);
//将新结点插入到单链表中
s->data.sn = e.sn; strcpy(s->data.name, e.name); s->data.score = e.score;
s->next = p->next; p->next = s;
return True;
}
BOOL ListDelete(LinkList &L, int i, ElemType &e){//在单链表中删除第 i 个元素,成功删除返回
True,并用 e 返回该元素值,失败返回 False
LinkList q, p = L;
int j = 0;
while (p->next && j p = p->next;
++j;
}
if (!(p->next) || j>i - 1) return False; //删除位置不合理
q = p->next; p->next = q->next; //删除该元素
e.sn = q->data.sn; strcpy(e.name, q->data.name); e.score = q->data.score; //e 取得该元素值
free(q); //释放该元素空间
return True;
}
BOOL ListFind_keyword(LinkList L, ElemType e, int &i){
//在单链表中查找关键字为 e 的元素,成功返回 True,并用 i 返回该元素位置,失败返回 False
i = 1;
LinkList p = L->next;
ElemType a = p->data;
while (p && !(CompareElemType(a, e))){ //p 指针指向下一个,直到找到关键字 e 或到
链表尾为止
p = p->next;
i++;
}
if (!p || !(CompareElemType(a, e))) return False; //该元素在链表中不存在
else return True;
}
BOOL ListFind_loc(LinkList L, int i, ElemType &e){ //在单链表中查找第 i 个元素,成功返回 True,
并用 e 返回该元素值,失败返回 False
LinkList p = L->next;
int j = 1;
while (p && j p = p->next; ++j;
}
if (!p || j>i) return False; //第 i 个元素不存在
e.sn = p->data.sn; strcpy(e.name, p->data.name); e.score = p->data.score; //查找成功,用 e 取得
第 i 个元素值
return True;
}
void ListPrint(LinkList L) {//显示链表所有元素
LinkList q = L->next;
printf("链表所有元素:\n");
while (q){
printf("学号:%10d 姓名:%13s 分数:%10.2f\n", q->data.sn, q->data.name, q->data.score);
q = q->next;
}
printf("\n");
}
void DestroyLink(LinkList &L){ //删除链表,回收内存空间
LinkList q;
while (L){
q = L->next;
free(L);
L = q;
}
printf("链表已经销毁\n");
}
int CompareElemType(ElemType a, ElemType b){ //比较结构体数据的异同
if (a.sn == b.sn && a.score == b.score && strcmp(a.name, b.name) == 0) return 1;
else return 0;

我运行有这个错误,为什么:

错误 1 error LNK2019: 无法解析的外部符号 "void __cdecl create(struct LNode *

  • 写回答

2条回答 默认 最新

  • 小灸舞 2016-06-24 01:23
    关注

    代码贴的太乱了,而且还不全。
    error LNK2019: 无法解析的外部符号表示只看到了create的声明而没有找到create函数的实现。
    最常见的可能就是:忘了实现,函数名拼写错误
    把你的代码用标签括起来,而且标注好是哪个文件的代码,这样别人才能帮你看,当然自己要学会单步调试,单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
    图片说明

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

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器