有不错但思路是错我这里特别不说请大家仔细阅读如果还是有问题可以回此帖我会回答
完整代码如下:
#
using s;
suct test
{
number;
float socre;
test *next;
};
test *head;//创建个全局引导进入链表指针
test *create
{
test *ls;//节点指针
test *le;//链尾指针
ls = test;//把ls指向动态开辟堆内存地址
cin>>ls->number>>ls->socre;
head=NULL;//进入时候先不设置head指针指向任何地址,不知道是否上来就输入null跳出
le=ls;//把链尾指针设置成刚刚动态开辟堆内存地址,用于等下设置le->next,也就是下个节点位置
while(ls->number!=0)//创建循环条件为ls->number值不是null,用于循环添加节点
{
(headNULL)//判断是否是第次进入循环
{
head=ls;//如果是第次进入循环,那么把引导进入链表指针指向第次动态开辟堆内存地址
}
{
le->next=ls;//如果不是第次进入那么就把上次链尾指针le->next指向上次循环结束前动态创建堆内存地址
}
le=ls;//设置链尾指针为当前循环中节点指针,用于下次进入循环时候把上次节点next指向上次循环结束前动态创建堆内存地址
ls= test;//为下个节点在堆内存中动态开辟空间
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把链尾指针next设置为空,不管如何循环总是要结束,设置为空才能够在循环显链表时候不至于死循环
delete ls;//当结束时候最后个动态开辟内存是无效,所以必须清除掉
head;//返回链首指针
}
void showl(test *head)
{
cout<<\"链首指针:\"< <
while(head)//以内存指向为null为条件循环显示先前输入内容
{
cout< number<<\"|\"< socre<
head=head->next;
}
}
void deletel(test *&head, number)//这里如果参数换成test *head,意义就完全区别了,head变成了复制而不是原有链上操作了,特别注意,很多书上都不对这里
{
test *po;//判断链表是否为空
(headNULL)
{
cout<<\"链表为空,不能进行删除工作!\";
;
}
(head->numbernumber)//判删除节点是否为首节点
{
po=head;
cout<<\"删除点是链表第个节点位置!\";
head=head->next;//重新设置引导指针
delete po;
;
}
test *fp=head;//保存连首指针
for(test *&mp=head;mp->next;mp=mp->next)
{
(mp->next->numbernumber)
{
po=mp->next;
mp->next=po->next;
delete po;
head=fp;//由于head不断移动丢失了head,把进入循环前head指针恢复!
;
}
}
}
void
{
head=create;//创建
showl(head);
dp;
cin>>dp;
deletel(head,dp);//删除
showl(head);
cin.get;
cin.get;
}
最后我学习下如何在已有链表上插入节点
我们要考虑 4中情况,
1.链表为空!
2.插入点在首节点前
3.插入点找不到情况我们设置放在最后!
4.插入点在中间情况!
今天在昨天基础上做了进步修改,可以避免删除点找不到情况,如果找不到删除点就退出!
#
using s;
suct test
{
number;
float socre;
test *next;
};
test *head;//创建个全局引导进入链表指针
test *create
{
test *ls;//节点指针
test *le;//链尾指针
ls = test;//把ls指向动态开辟堆内存地址
cout<<\"请输入第个节点number和节点score,输入0.0跳出\"<
cin>>ls->number>>ls->socre;
head=NULL;//进入时候先不设置head指针指向任何地址,不知道是否上来就输入null跳出
le=ls;//把链尾指针设置成刚刚动态开辟堆内存地址,用于等下设置le->next,也就是下个节点位置
while(ls->number!=0)//创建循环条件为ls->number值不是null,用于循环添加节点
{
(headNULL)//判断是否是第次进入循环
{
head=ls;//如果是第次进入循环,那么把引导进入链表指针指向第次动态开辟堆内存地址
}
{
le->next=ls;//如果不是第次进入那么就把上次链尾指针le->next指向上次循环结束前动态创建堆内存地址
}
le=ls;//设置链尾指针为当前循环中节点指针,用于下次进入循环时候把上次节点next指向上次循环结束前动态创建堆内存地址
ls= test;//为下个节点在堆内存中动态开辟空间
cout<<\"请下个节点number和节点score,输入0.0跳出\"<
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把链尾指针next设置为空,不管如何循环总是要结束,设置为空才能够在循环显链表时候不至于死循环
delete ls;//当结束时候最后个动态开辟内存是无效,所以必须清除掉
head;//返回链首指针
}
void showl(test *head)
{
cout<<\"链首指针:\"< <
while(head)//以内存指向为null为条件循环显示先前输入内容
{
cout< number<<\"|\"< socre<
head=head->next;
}
}
void deletel(test *&head, number)//这里如果参数换成test *head,意义就完全区别了,head变成了复制而不是原有链上操作了,特别注意,很多书上都不对这里
{
test *po;//判断链表是否为空
(headNULL)
{
cout<<\"链表为空,不能进行删除工作!\";
;
}
derror=1;//设置找不到情况条件,预先设置为真
test *check=head;
while(check)//利用循环进行查找
{
(check->numbernumber)
{
derror=0;//条件转为假
}
check=check->next;
}
(derror)//如果为假就跳出
{
;
}
(head->numbernumber)//判删除节点是否为首节点
{
po=head;
cout<<\"删除点是链表第个节点位置!\";
head=head->next;//重新设置引导指针
delete po;
;
}
test *fp=head;//保存连首指针
for(test *&mp=head;mp->next;mp=mp->next)
{
(mp->next->numbernumber)
{
po=mp->next;
mp->next=po->next;
delete po;
head=fp;//由于head不断移动丢失了head,把进入循环前head指针恢复!
;
}
}
}
void insterl( number)
{
test *po= test;
cout<<\"请输入节点number和节点score\"<
cin>>po->number>>po->socre;
(headNULL)//链表为空情况下插入
{
head=po;
po->next=NULL;
;
}
ierror=1;//设置找不到情况条件,预先设置为真
test *le;
test *check=head;
while(check)//利用循环进行查找
{
(check->numbernumber)
{
ierror=0;//条件转为假
}
le=check;
check=check->next;
}
(ierror)
{
cout< number;
le->next=po;
po->next=NULL;
;
}
(head->numbernumber)//检测是否是在第个节点处插入
{
po->next=head;
head=po;
;
}
for(test *&mp=head;mp->next;mp=mp->next)//在链表中间插入
{
(mp->next->numbernumber)
{
po->next=mp->next;
mp->next=po;
;
}
}
}
void
{
head=create;//创建
showl(head);
dp;
cout<<\"请输入删除点如果找不到就跳出\"<
cin>>dp;
deletel(head,dp);//删除
showl(head);
ip;
cout<<\"请输入插入点如果找不到就在链尾添加\"<
cin>>ip;
insterl(ip);
showl(head);
cin.get;
cin.get;
}
到此有关结构体内容已经全部讨论结束链表建立删除插入操作可以很好对前面所学知识进行个整理总结它既考察了员对内存大理解(堆内存操作、指针操作)也考察了对结构化编程掌握熟悉出\"<
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把链尾指针next设置为空,不管如何循环总是要结束,设置为空才能够在循环显链表时候不至于死循环
delete ls;//当结束时候最后个动态开辟内存是无效,所以必须清除掉
head;//返回链首指针
}
void showl(test *head)
{
cout<<\"链首指针:\"< <
while(head)//以内存指向为null为条件循环显示先前输入内容
{
cout< number<<\"|\"< socre<
head=head->next;
}
}
void deletel(test *&head, number)//这里如果参数换成test *head,意义就完全区别了,head变成了复制而不是原有链上操作了,特别注意,很多书上都不对这里
{
test *po;//判断链表是否为空
(headNULL)
{
cout<<\"链表为空,不能进行删除工作!\";
;
}
derror=1;//设置找不到情况条件,预先设置为真
test *check=head;
while(check)//利用循环进行查找
{
(check->numbernumber)
{
derror=0;//条件转为假
}
check=check->next;
}
(derror)//如果为假就跳出
{
;
}
(head->numbernumber)//判删除节点是否为首节点
{
po=head;
cout<<\"删除点是链表第个节点位置!\";
head=head->next;//重新设置引导指针
delete po;
;
}
test *fp=head;//保存连首指针
for(test *&mp=head;mp->next;mp=mp->next)
{
(mp->next->numbernumber)
{
po=mp->next;
mp->next=po->next;
delete po;
head=fp;//由于head不断移动丢失了head,把进入循环前head指针恢复!
;
}
}
}
void insterl( number)
{
test *po= test;
cout<<\"请输入节点number和节点score\"<
cin>>po->number>>po->socre;
(headNULL)//链表为空情况下插入
{
head=po;
po->next=NULL;
;
}
ierror=1;//设置找不到情况条件,预先设置为真
test *le;
test *check=head;
while(check)//利用循环进行查找
{
(check->numbernumber)
{
ierror=0;//条件转为假
}
le=check;
check=check->next;
}
(ierror)
{
cout< number;
le->next=po;
po->next=NULL;
;
}
(head->numbernumber)//检测是否是在第个节点处插入
{
po->next=head;
head=po;
;
}
for(test *&mp=head;mp->next;mp=mp->next)//在链表中间插入
{
(mp->next->numbernumber)
{
po->next=mp->next;
mp->next=po;
;
}
}
}
void
{
head=create;//创建
showl(head);
dp;
cout<<\"请输入删除点如果找不到就跳出\"<
cin>>dp;
deletel(head,dp);//删除
showl(head);
ip;
cout<<\"请输入插入点如果找不到就在链尾添加\"<
cin>>ip;
insterl(ip);
showl(head);
cin.get;
cin.get;
}
到此有关结构体内容已经全部讨论结束链表建立删除插入操作可以很好对前面所学知识进行个整理总结它既考察了员对内存大理解(堆内存操作、指针操作)也考察了对结构化编程掌握熟悉
最新评论