链表分解练习

一、题目

完成如下链表分解任务:

(1)动态创建3个结点,分别用3个指针指向(p1、p2、p3),要求结点存储float型数据,分别存入1.1、2.2、3.3

(2)将第一题的3个结点链接起来,令p1作为头指针,尾结点指针域为NULL

(3)创建具有n个结点的链表,n可从键盘读入,提示:使用循环

以上三个题目可直接在主函数上实现

(4)将(3)实现的功能抽离成函数,要求n为形参,返回值为链表首地址。

二、分解任务一

①思路:先创建结构体,在主函数中定义结构体类型的指针并开辟结构体类型的空间,用该指针指向,然后依次赋值,最后输出各节点数据验证是否成功。

②代码:

#include<iostream>

using namespace std;

struct list

{

 float num;

};

int main()

{

//动态创建节点并用指针指向

list *p1=new list;

 list *p2=new list;

 list *p3=new list;

 //赋值

 p1->num=1.1;

 p2->num=2.2;

 p3->num=3.3;

 //验证上述操作是否成功

 cout<<p1->num<<"\t"<<p2->num<<"\t"<<p3->num<<endl;

 //删除节点

 delete p1;

delete p2;

 delete p3;

return 0;

} 

③运行结果:

④遇到的问题及解决方法:

  1. 编译成功但黑框无输出——解决:重装dev,原因考虑文件损坏

  2. 注释无法正常显示,要点击注释行才能显示,移开又不能显示——解决:工具->编译器选项->显示->把框内✓去掉,见下图

三、分解任务二

①思路:在结构体中增加指针域(结构体类型),并依次链接,最后尾节点的指针域指向NULL。

②代码:

#include<iostream>

using namespace std;

struct list

{

 float num;

 list* next;//指针域

};

int main()

{

	//动态创建节点并用指针指向

	list *p1=new list;

 	list *p2=new list;

 	list *p3=new list;

 	//赋值

 	p1->num=1.1;

 	p2->num=2.2;

 	p3->num=3.3;

 	//链接

 	p1->next = p2;

 	p2->next = p3;

 	p3->next = NULL;

 	//验证上述操作是否成功

 	cout<<p1->num<<"\t"<<p1->next->num<<"\t"<<p1->next->next->num <<endl;

 	//删除节点

 	delete p1;

	delete p2;

 	delete p3;

	return 0;

} 

 ③运行结果:

④遇到的问题及解决方案:无问题

四、任务分解三

①思路:创建结构体,主函数中读取节点数n,设置指针变量head、p1、p2,head指针不能改变,p1和p2实现链接,尾节点的指针域为NULL,最后让p1、p2指针指向NULL(实现删除)。

②代码:

#include<iostream>

using namespace std;

struct list

{

 float num;

 list* next;//指针域

};

int main()

{

	int n;//节点数

	cin >> n;

	//定义头指针,工具指针p1、p2

	list* head = NULL;

	list* p1 = NULL;

	list* p2 = NULL;

	head = p1 = p2 = new list;

	while( n-- > 1)//因为前面已经开辟了一个节点,所以大于 1

	{

		p2 = new list;

		p1->next = p2;

		//用于测试:p1->num = 1.1 + n;

		p1 = p1->next; 

	}

	p2->next = NULL;//尾节点指向NULL

	/*

 	//验证赋值、链接是否成功

	p1 = head;

	int i;

 	for(i = 0;i < 5;i++)

 	{

 		cout << p1->num <<endl;

 		p1 = p1->next; 

	 }

 	//删除节点

 	p1 = p2 = NULL;

 	while(head != NULL)

 	{

 		list* temp;//临时指针,指向某节点后删除

 		temp = head;

 		head = head->next;//索引到下一节点

 		delete temp;

	}

	//测试是否删除成功

	for(i = 0;i < 5;i++)

 	{

 		cout << p1->num <<endl;

 		p1 = p1->next; 

	}

	*/

	return 0;

} 

③运行结果:5是节点数n,此处我把测试的代码注释掉了,所以无输出

④遇到的问题及解决方法:

在测试代码前将p1和p2删除,导致当时p1、p2指向的节点被删除,以至于后面的代码中的判断条件head!=NULL判断出错,以至于无法删除后面的节点——解决方法:将delete p1和delete p2改为p1=p2=NULL

五、任务分解四

①思路:在任务分解三的基础上提取出函数,并实现n做形参等。

②代码:

#include<iostream>

using namespace std;

struct list

{

 float num;

 list* next;//指针域

};

struct list* creat(int);

void check(list*,int);

int main()

{

	int n;//节点数

	cin >> n;

	list* head = NULL;

	head = creat(n);

	check(head,n);

	return 0;

} 

struct list* creat(int n)

{

	//定义头指针,工具指针p1、p2

	list* head = NULL;

	list* p1 = NULL;

	list* p2 = NULL;

	head = p1 = p2 = new list;

	do

	{

		p1->num = 1.1 + n;//用于测试

		p2 = new list;

		p1->next = p2;

		p1 = p1->next; 

	}while( n-- > 1);//因为前面已经开辟了一个节点,所以大于 1

	p2->next = NULL;//尾节点指向NULL

	return head;

}

void check(list* head,int n)//用于测试

{

	//验证赋值、链接是否成功

	list* p1 = NULL;

	list* p2 = NULL;

	p1 = head;

	int i;

 	for(i = 0;i < n;i++)

 	{

 		cout << p1->num <<endl;

 		p1 = p1->next; 

	 }

 	//删除节点

 	p1 = p2 = NULL;

 	while(head != NULL)

 	{

 		list* temp;//临时指针,指向某节点后删除

 		temp = head;

 		head = head->next;//索引到下一节点

 		delete temp;

	}

	//测试是否删除成功

	for(i = 0;i < 5;i++)

 	{

 		cout << p1->num <<endl;

 		p1 = p1->next; 

	}

}

 ③运行结果:第一行以下的输出是我测试代码的输出

④遇到的问题及解决方法:

发现任务分解三的一个问题:while循环那里会出现最后一个节点无法赋值——解决方法:将while改为do-while循环。发现问题后任务分解三我没有再改过来提交,这样可以有一个犯错痕迹,方便以后查看,最终正确的代码为任务分解四的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值