一、题目
完成如下链表分解任务:
(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;
}
③运行结果:
④遇到的问题及解决方法:
-
编译成功但黑框无输出——解决:重装dev,原因考虑文件损坏
-
注释无法正常显示,要点击注释行才能显示,移开又不能显示——解决:工具->编译器选项->显示->把框内✓去掉,见下图
三、分解任务二
①思路:在结构体中增加指针域(结构体类型),并依次链接,最后尾节点的指针域指向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循环。发现问题后任务分解三我没有再改过来提交,这样可以有一个犯错痕迹,方便以后查看,最终正确的代码为任务分解四的代码。