新手求助,请大佬帮忙看看这个链表里的错误怎么改

Ivvvvvvvvvvy 2020-10-20 12:30:16
头文件
#ifndef T3X_H
#define T3X_H

#include<iostream>
#include<string.h>
using namespace std;

struct StuType;
struct LNode;

extern LinkList InitLink();
extern LinkList LinkInsert(LinkList head,int n);
extern int LinkDelete(LinkList head,int n);
extern LinkList LinkLocate(LinkList head,int n);
extern int PrintAll(LinkList head);
extern int Add();
extern int ListLength(LinkList head);

#endif

.cpp
#include"t3x.h"
#include<iostream>
#include<string>
using namespace std;
struct StuType
{
string num;
string name;
int age;
};

struct LNode
{
StuType data;
struct LNode *next;
}LNode,*LinkList;

LinkList InitLink()
{ LinkList head;
head=new LinkList;
if (head==NULL)
{
printf("申请内存空间失败\n");
}
head->next=NULL;
return (head);
}

LinkList LinkInsert(LinkList head,int n)
{
for(int i=0;i<n;i++)
{ head=head->next; }
newnode=new LNode;
cin>>newnode.num;
cin>>newnode.name;
cin>>newnode.age;
return(head);
}

int LinkDelete(LinkList head,int n)
{
LinkList p,q;
p=head;
for(int i=0;i<n;i++)
{ p=p->next; }
q=p->next;
p->next=q->next;
return 0;
}

LinkList LinkLocate(LinkList head,int n)
{
LinkList p;
p=head;
for(int i=0;i<n;i++)
{ p=p->next; }
return p->data;
}

int PrintAll(LinkList head)
{
LinkList p=head;
while(p!=NULL)
{
cout<<"学号:"<<p->num<<' '<<"姓名:"<<p->name<<' '<<"年龄:"<<p->age<<endl;
p=p->next;
}
return 0;
}

int Add()
{
cout<<"请输入学号、姓名和专业";
newLNode=new LNode;
cin>>newLNode->num;
cin>>newLNode->name;
cin>>newLNode->age;
return 0;
}

int ListLength(LinkList head)
{
int n;
while(head!=NULL)
{
head=head->next;
n=n+1;
}
return n;
}



int main()
{ int i,j,n,func;
LNode data;
LinkList *pdata;
pdata=InitLink();
cout<<"请输入要输入的学生信息条数";
cin>>n;
for(i=0;i<n;i++)
int Add();
cout<<"单链表中的学生信息为:" <<endl;
PrintAll(pdata);
printf("0.退出,\t1.插入信息,\t2.删除信息,\t3.更新指定学生的姓名,\t4.查找指定学生的信息,\t5.输出所有学生信息,\t6.输出学生数量\n");
for(j=0;;j++)
{
scanf("%d",&func);
switch(func)
{
case 0:
exit(1);
break;
case 1:
cout<<"请输入要插入信息的位置:";
cin>>i;
cout<<"请输入第"<<i<<"号学生的num,name,以及age"<<endl;
cin>>data.num>>data.name>>data.age;
if(LinkInsert(pdata,i))
{ cout<<"插入数据成功"<<endl;
PrintAll(pdata); }
break;
case 2:
cout<<"请输入要删除信息的位置:";
cin>>i;
if(LinkDelete(pdata,i))
{ cout<<"数据删除成功"<<endl;
PrintAll(pdata); }
break;
case 3:
cout<<"请输入要更新信息的位置:";
cin>>i;
data=LinkLocate(pdata,i);
cout<<"请输入替换的姓名:";
cin>>data.name;
cout<<"更新后第"<<i<<"个学生的信息为:num:"<<data.num<<",name:"<<data.name<<",age:"<<data.age<<endl;
break;
case 4:
cout<<"请输入要查找信息的位置:";
cin>>i;
data=LinkLocate(pdata,i);
cout<<"第"<<i<<"个学生的信息为:num:"<<data.num<<",name:"<<data.name<<",age:"<<data.age<<endl;
break;
case 5:
PrintAll(pdata);
break;
case 6:
cout<<"学生数量为"<<ListLength(pdata);
}
}
return 0;
}

然后老是出现下图的错误,但是不知道该怎么改

...全文
104 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
5250 2020-10-20
  • 打赏
  • 举报
回复
引用 5 楼 Ivvvvvvvvvvy 的回复:
[quote=引用 4 楼 5250 的回复:][quote=引用 3 楼 Ivvvvvvvvvvy 的回复:]
这样修改了以后,为什么第一个错误还是存在呢?
ps:程序没有改变,只是修改了位置,从cpp到头文件


你的头文件的第二个结构体前面加一个typedef[/quote]


这样以后就疯狂报错了XD
c++和c中的typedef是有一点不一样的吧?[/quote]

你把你的代码发给我 头文件和CPP文件 我帮你编译看看 私信可以发文件好像
Ivvvvvvvvvvy 2020-10-20
  • 打赏
  • 举报
回复
引用 4 楼 5250 的回复:
[quote=引用 3 楼 Ivvvvvvvvvvy 的回复:]
这样修改了以后,为什么第一个错误还是存在呢?
ps:程序没有改变,只是修改了位置,从cpp到头文件


你的头文件的第二个结构体前面加一个typedef[/quote]


这样以后就疯狂报错了XD
c++和c中的typedef是有一点不一样的吧?
5250 2020-10-20
  • 打赏
  • 举报
回复
引用 3 楼 Ivvvvvvvvvvy 的回复:

这样修改了以后,为什么第一个错误还是存在呢?
ps:程序没有改变,只是修改了位置,从cpp到头文件


你的头文件的第二个结构体前面加一个typedef
Ivvvvvvvvvvy 2020-10-20
  • 打赏
  • 举报
回复

这样修改了以后,为什么第一个错误还是存在呢?
ps:程序没有改变,只是修改了位置,从cpp到头文件
棉猴 2020-10-20
  • 打赏
  • 举报
回复
C++编译器编译程序的时候,先编译头文件,之后再编译cpp源文件。在你的头文件中使用了LinkList,但是LinkList是在cpp源文件中定义的,所以编译器不认识LinkList。应该把cpp中的
struct StuType
{
    string num;
string name;
int age;
};

struct LNode
{
StuType data;
struct LNode *next;  
}LNode,*LinkList;
写入到头文件中。如果非要把这两个结构体在cpp中声明,请参考《C++中类的前向声明》,希望能帮到您!
5250 2020-10-20
  • 打赏
  • 举报
回复
把CPP里面那两个结构体定义覆盖到.h中
Ivvvvvvvvvvy 2020-10-20
  • 打赏
  • 举报
回复
引用 6 楼 5250 的回复:
[quote=引用 5 楼 Ivvvvvvvvvvy 的回复:][quote=引用 4 楼 5250 的回复:][quote=引用 3 楼 Ivvvvvvvvvvy 的回复:]
这样修改了以后,为什么第一个错误还是存在呢?
ps:程序没有改变,只是修改了位置,从cpp到头文件


你的头文件的第二个结构体前面加一个typedef[/quote]


这样以后就疯狂报错了XD
c++和c中的typedef是有一点不一样的吧?[/quote]

你把你的代码发给我 头文件和CPP文件 我帮你编译看看 私信可以发文件好像[/quote]


谢谢~不过私信好像发不了文件,头文件和cpp的代码就是帖子最上面的两个,我用的是Visual C++ 6.0
Ivvvvvvvvvvy 2020-10-20
  • 打赏
  • 举报
回复
引用 7 楼 棉猴 的回复:
头文件
#include<iostream>
#include<string.h>
using namespace std;

struct StuType;
struct LNode;
struct StuType
{
string num;
string name;
int age;
};

typedef struct LNode
{
StuType data;
struct LNode *next;
}LNode, *LinkList;
extern LinkList InitLink();
extern LinkList LinkInsert(LinkList head, int n);
extern int LinkDelete(LinkList head, int n);
extern LinkList LinkLocate(LinkList head, int n);
extern int PrintAll(LinkList head);
extern int Add();
extern int ListLength(LinkList head);



源文件
LinkList InitLink()
{
LinkList head;
head = new LNode();
if (head == NULL)
{
printf("申请内存空间失败\n");
}
head->next = NULL;
return (head);
}

LinkList LinkInsert(LinkList head, int n)
{
for (int i = 0; i<n; i++)
{
head = head->next;
}
LinkList newnode = new LNode();
cin >> newnode->data.num;
cin >> newnode->data.name;
cin >> newnode->data.age;
return(head);
}

int LinkDelete(LinkList head, int n)
{
LinkList p, q;
p = head;
for (int i = 0; i<n; i++)
{
p = p->next;
}
q = p->next;
p->next = q->next;
return 0;
}

LinkList LinkLocate(LinkList head, int n)
{
LinkList p;
p = head;
for (int i = 0; i<n; i++)
{
p = p->next;
}
return p;
}

int PrintAll(LinkList head)
{
LinkList p = head;
while (p != NULL)
{
cout << "学号:" << p->data.num << ' ' << "姓名:" << p->data.name << ' ' << "年龄:" << p->data.age << endl;
p = p->next;
}
return 0;
}

int Add()
{
cout << "请输入学号、姓名和专业";
LinkList newLNode = new LNode();
cin >> newLNode->data.num;
cin >> newLNode->data.name;
cin >> newLNode->data.age;
return 0;
}

int ListLength(LinkList head)
{
int n = 0;
while (head != NULL)
{
head = head->next;
n = n + 1;
}
return n;
}

int main()
{
int i, j, n, func;
LNode data;
LinkList pdata;
pdata = InitLink();
cout << "请输入要输入的学生信息条数";
cin >> n;
for (i = 0; i<n; i++)
int Add();
cout << "单链表中的学生信息为:" << endl;
PrintAll(pdata);
printf("0.退出,\t1.插入信息,\t2.删除信息,\t3.更新指定学生的姓名,\t4.查找指定学生的信息,\t5.输出所有学生信息,\t6.输出学生数量\n");
for (j = 0;; j++)
{
scanf("%d", &func);
switch (func)
{
case 0:
exit(1);
break;
case 1:
cout << "请输入要插入信息的位置:";
cin >> i;
cout << "请输入第" << i << "号学生的num,name,以及age" << endl;
cin >> data.data.num >> data.data.name >> data.data.age;
if (LinkInsert(pdata, i))
{
cout << "插入数据成功" << endl;
PrintAll(pdata);
}
break;
case 2:
cout << "请输入要删除信息的位置:";
cin >> i;
if (LinkDelete(pdata, i))
{
cout << "数据删除成功" << endl;
PrintAll(pdata);
}
break;
case 3:
cout << "请输入要更新信息的位置:";
cin >> i;
data = *LinkLocate(pdata, i);
cout << "请输入替换的姓名:";
cin >> data.data.name;
cout << "更新后第" << i << "个学生的信息为:num:" << data.data.num << ",name:" << data.data.name << ",age:" << data.data.age << endl;
break;
case 4:
cout << "请输入要查找信息的位置:";
cin >> i;
data = *LinkLocate(pdata, i);
cout << "第" << i << "个学生的信息为:num:" << data.data.num << ",name:" << data.data.name << ",age:" << data.data.age << endl;
break;
case 5:
PrintAll(pdata);
break;
case 6:
cout << "学生数量为" << ListLength(pdata);
}
}
return 0;
}


VS2015 C++环境


谢谢~不过我把您的上述代码放到我常用的Visual C++ 6.0的时候会出现这种错误——

不是很明白这里怎么了orz
棉猴 2020-10-20
  • 打赏
  • 举报
回复
头文件
#include<iostream>
#include<string.h>
using namespace std;

struct StuType;
struct LNode;
struct StuType
{
	string num;
	string name;
	int age;
};

typedef struct LNode
{
	StuType data;
	struct LNode *next;
}LNode, *LinkList;
extern LinkList InitLink();
extern LinkList LinkInsert(LinkList head, int n);
extern int LinkDelete(LinkList head, int n);
extern LinkList LinkLocate(LinkList head, int n);
extern int PrintAll(LinkList head);
extern int Add();
extern int ListLength(LinkList head);
源文件
LinkList InitLink()
{
	LinkList head;
	head = new LNode();
	if (head == NULL)
	{
		printf("申请内存空间失败\n");
	}
	head->next = NULL;
	return (head);
}

LinkList LinkInsert(LinkList head, int n)
{
	for (int i = 0; i<n; i++)
	{
		head = head->next;
	}
	LinkList newnode = new LNode();
	cin >> newnode->data.num;
	cin >> newnode->data.name;
	cin >> newnode->data.age;
	return(head);
}

int LinkDelete(LinkList head, int n)
{
	LinkList p, q;
	p = head;
	for (int i = 0; i<n; i++)
	{
		p = p->next;
	}
	q = p->next;
	p->next = q->next;
	return 0;
}

LinkList LinkLocate(LinkList head, int n)
{
	LinkList p;
	p = head;
	for (int i = 0; i<n; i++)
	{
		p = p->next;
	}
	return p;
}

int PrintAll(LinkList head)
{
	LinkList p = head;
	while (p != NULL)
	{
		cout << "学号:" << p->data.num << ' ' << "姓名:" << p->data.name << ' ' << "年龄:" << p->data.age << endl;
		p = p->next;
	}
	return 0;
}

int Add()
{
	cout << "请输入学号、姓名和专业";
	LinkList newLNode = new LNode();
	cin >> newLNode->data.num;
	cin >> newLNode->data.name;
	cin >> newLNode->data.age;
	return 0;
}

int ListLength(LinkList head)
{
	int n = 0;
	while (head != NULL)
	{
		head = head->next;
		n = n + 1;
	}
	return n;
}

int main()
{
	int i, j, n, func;
	LNode data;
	LinkList pdata;
	pdata = InitLink();
	cout << "请输入要输入的学生信息条数";
	cin >> n;
	for (i = 0; i<n; i++)
		int Add();
	cout << "单链表中的学生信息为:" << endl;
	PrintAll(pdata);
	printf("0.退出,\t1.插入信息,\t2.删除信息,\t3.更新指定学生的姓名,\t4.查找指定学生的信息,\t5.输出所有学生信息,\t6.输出学生数量\n");
	for (j = 0;; j++)
	{
		scanf("%d", &func);
		switch (func)
		{
		case 0:
			exit(1);
			break;
		case 1:
			cout << "请输入要插入信息的位置:";
			cin >> i;
			cout << "请输入第" << i << "号学生的num,name,以及age" << endl;
			cin >> data.data.num >> data.data.name >> data.data.age;
			if (LinkInsert(pdata, i))
			{
				cout << "插入数据成功" << endl;
				PrintAll(pdata);
			}
			break;
		case 2:
			cout << "请输入要删除信息的位置:";
			cin >> i;
			if (LinkDelete(pdata, i))
			{
				cout << "数据删除成功" << endl;
				PrintAll(pdata);
			}
			break;
		case 3:
			cout << "请输入要更新信息的位置:";
			cin >> i;
			data = *LinkLocate(pdata, i);
			cout << "请输入替换的姓名:";
			cin >> data.data.name;
			cout << "更新后第" << i << "个学生的信息为:num:" << data.data.num << ",name:" << data.data.name << ",age:" << data.data.age << endl;
			break;
		case 4:
			cout << "请输入要查找信息的位置:";
			cin >> i;
			data = *LinkLocate(pdata, i);
			cout << "第" << i << "个学生的信息为:num:" << data.data.num << ",name:" << data.data.name << ",age:" << data.data.age << endl;
			break;
		case 5:
			PrintAll(pdata);
			break;
		case 6:
			cout << "学生数量为" << ListLength(pdata);
		}
	}
	return 0;
}
VS2015 C++环境

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧