今天图老师小编给大家展示的是c/c++中结构体(struct)知识点强化,链表的学习,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!
【 tulaoshi.com - 编程语言 】
在上一个教程中我们已经简单的阐述了什么是结构体了,为了进一部的学习结构体这一重要的知识点,我们今天来学习一下链表结构。strUCt test
{
char name[10];
float socre;
test *next;
};//这样是正确的!
struct test
{
char name[10];
float socre;
test next;
};//这样是错误的!
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必闻名出处和作者
#include iostream
using namespace std;
struct test
{
char name[10];
float socre;
test *next;
};
test *head;//创建一个全局的引导进入链表的指针
test *create()
{
test *ls;//节点指针
test *le;//链尾指针
ls = new test;//把ls指向动态开辟的堆内存地址
cinls-namels-socre;
head=NULL;//进入的时候先不设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序
le=ls;//把链尾指针设置成刚刚动态开辟的堆内存地址,用于等下设置le-next,也就是下一个节点的位置
while(strcmp(ls-name,"null")!=0)//创建循环条件为ls-name的值不是null,用于循环添加节点
{
if(head==NULL)//判定是否是第一次进入循环
{
head=ls;//假如是第一次进入循环,那么把引导进入链表的指针指向第一次动态开辟的堆内存地址
}
else
{
le-next=ls;//假如不是第一次进入那么就把上一次的链尾指针的le-next指向上一次循环结束前动态创建的堆内存地址
}
le=ls;//设置链尾指针为当前循环中的节点指针,用于下一次进入循环的时候把上一次的节点的next指向上一次循环结束前动态创建的堆内存地址
ls=new test;//为下一个节点在堆内存中动态开辟空间
cinls-namels-socre;
}
le-next=NULL;//把链尾指针的next设置为空,因为不管如何循环总是要结束的,设置为空才能够在循环显链表的时候不至于死循环
delete ls;//当结束的时候最后一个动态开辟的内存是无效的,所以必须清除掉
return head;//返回链首指针
}
void showl(test *head)
{
cout"链首指针:"headendl;
while(head)//以内存指向为null为条件循环显示先前输入的内容
{
couthead-name""head-socreendl;
head=head-next;
}
}
void main()
{
showl(create());
cin.get();
cin.get();
}
更多内容请看C/C++技术专题 电脑知识专题,或 test *head;//创建一个全局的引导进入链表的指针
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必闻名出处和作者
#include iostream
using namespace std;
struct test
{
char name[10];
float socre;
test *next;
};
test *head;//创建一个全局的引导进入链表的指针
test *create()
{
return head;//返回链首指针
}
void showl(test *head)
{
cout"链首指针:"headendl;
while(head)//以内存指向为null为条件循环显示先前输入的内容
{
couthead-name""head-socreendl;
head=head-next;
}
}
void main()
{
showl(create());
cin.get();
cin.get();
}
test *create()
{
test *ls;//节点指针
test *le;//链尾指针
ls = new test;//把ls指向动态开辟的堆内存地址
cinls-namels-socre;
head=NULL;//进入的时候先不设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序
le=ls;//把链尾指针设置成刚刚动态开辟的堆内存地址,用于等下设置le-next,也就是下一个节点的位置
le-next=NULL;//把链尾指针的next设置为空,因为不管如何循环总是要结束的,设置为空才能够在循环显链表的时候不至于死循环
delete ls;//当结束的时候最后一个动态开辟的内存是无效的,所以必须清除掉
return head;//返回链首指针
}
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必闻名出处和作者
#include iostream
using namespace std;
struct test
{
int number;
float socre;
test *next;
};
test *head;//创建一个全局的引导进入链表的指针
test *create()
{
test *ls;//节点指针
test *le;//链尾指针
ls = new test;//把ls指向动态开辟的堆内存地址
cinls-numberls-socre;
head=NULL;//进入的时候先不设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序
le=ls;//把链尾指针设置成刚刚动态开辟的堆内存地址,用于等下设置le-next,也就是下一个节点的位置
while(ls-number!=0)//创建循环条件为ls-number的值不是null,用于循环添加节点
{
if(head==NULL)//判定是否是第一次进入循环
{
head=ls;//假如是第一次进入循环,那么把引导进入链表的指针指向第一次动态开辟的堆内存地址
}
else
{
le-next=ls;//假如不是第一次进入那么就把上一次的链尾指针的le-next指向上一次循环结束前动态创建的堆内存地址
}
le=ls;//设置链尾指针为当前循环中的节点指针,用于下一次进入循环的时候把上一次的节点的next指向上一次循环结束前动态创建的堆内存地址
ls=new test;//为下一个节点在堆内存中动态开辟空间
cinls-numberls-socre;
}
le-next=NULL;//把链尾指针的next设置为空,因为不管如何循环总是要结束的,设置为空才能够在循环显链表的时候不至于死循环
delete ls;//当结束的时候最后一个动态开辟的内存是无效的,所以必须清除掉
return head;//返回链首指针
}
void showl(test *head)
{
cout"链首指针:"headendl;
while(head)//以内存指向为null为条件循环显示先前输入的内容
{
couthead-number""head-socreendl;
head=head-next;
}
}
void deletel(test *&head,int number)//这里假如参数换成test *head,意义就完全不同了,head变成了复制而不是原有链上操作了,非凡注重,很多书上都不对这里
{
test *point;//判定链表是否为空
if(head==NULL)
{
cout"链表为空,不能进行删除工作!";
return;
}
if(head-number==number)//判删除的节点是否为首节点
{
point=head;
cout"删除点是链表第一个节点位置!";
head=head-next;//重新设置引导指针
delete point;
return;
}
test *fp=head;//保存连首指针
for(test *&mp=head;mp-next;mp=mp-next)
{
if(mp-next-number==number)
{
point=mp-next;
mp-next=point-next;
delete point;
head=fp;//由于head的不断移动丢失了head,把进入循环前的head指针恢复!
return;
}
}
}
void main()
{
head=create();//调用创建
showl(head);
int dp;
cindp;
deletel(head,dp);//调用删除
showl(head);
cin.get();
cin.get();
}
更多内容请看C/C++技术专题 电脑知识专题,或
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必闻名出处和作者
#include iostream
using namespace std;
struct test
{
int number;
float socre;
test *next;
};
test *head;//创建一个全局的引导进入链表的指针
test *create()
{
test *ls;//节点指针
test *le;//链尾指针
ls = new test;//把ls指向动态开辟的堆内存地址
cout"请输入第一个节点number和节点score,输入0.0跳出函数"endl;
cinls-numberls-socre;
head=NULL;//进入的时候先不设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序
le=ls;//把链尾指针设置成刚刚动态开辟的堆内存地址,用于等下设置le-next,也就是下一个节点的位置
while(ls-number!=0)//创建循环条件为ls-number的值不是null,用于循环添加节点
{
if(head==NULL)//判定是否是第一次进入循环
{
head=ls;//假如是第一次进入循环,那么把引导进入链表的指针指向第一次动态开辟的堆内存地址
}
else
{
le-next=ls;//假如不是第一次进入那么就把上一次的链尾指针的le-next指向上一次循环结束前动态创建的堆内存地址
}
le=ls;//设置链尾指针为当前循环中的节点指针,用于下一次进入循环的时候把上一次的节点的next指向上一次循环结束前动态创建的堆内存地址
ls=new test;//为下一个节点在堆内存中动态开辟空间
cout"请下一个节点number和节点score,输入0.0跳出函数"endl;
cinls-numberls-socre;
}
le-next=NULL;//把链尾指针的next设置为空,因为不管如何循环总是要结束的,设置为空才能够在循环显链表的时候不至于死循环
delete ls;//当结束的时候最后一个动态开辟的内存是无效的,所以必须清除掉
return head;//返回链首指针
}
void showl(test *head)
{
cout"链首指针:"headendl;
while(head)//以内存指向为null为条件循环显示先前输入的内容
{
couthead-number""head-socreendl;
head=head-next;
}
}
void deletel(test *&head,int number)//这里假如参数换成test *head,意义就完全不同了,head变成了复制而不是原有链上操作了,非凡注重,很多书上都不对这里
{
test *point;//判定链表是否为空
if(head==NULL)
{
cout"链表为空,不能进行删除工作!";
return;
}
int derror=1;//设置找不到的情况的条件,预先设置为真
test *check=head;
while(check)//利用循环进行查找
{
if (check-number==number)
{
derror=0;//条件转为假
}
check=check-next;
}
if(derror)//假如为假就跳出函数
{
return;
}
if(head-number==number)//判删除的节点是否为首节点
{
point=head;
cout"删除点是链表第一个节点位置!";
head=head-next;//重新设置引导指针
delete point;
return;
}
test *fp=head;//保存连首指针
for(test *&mp=head;mp-next;mp=mp-next)
{
if(mp-next-number==number)
{
point=mp-next;
mp-next=point-next;
delete point;
head=fp;//由于head的不断移动丢失了head,把进入循环前的head指针恢复!
return;
}
}
}
void insterl(int number)
{
test *point=new test;
cout"请输入节点number和节点score"endl;
cinpoint-numberpoint-socre;
if(head==NULL)//链表为空的情况下插入
{
head=point;
point-next=NULL;
return;
}
int ierror=1;//设置找不到的情况的条件,预先设置为真
test *le;
test *check=head;
while(check)//利用循环进行查找
{
if (check-number==number)
{
ierror=0;//条件转为假
}
le=check;
check=check-next;
}
if(ierror)
{
coutle-number;
le-next=point;
point-next=NULL;
return;
}
if(head-number==number)//检测是否是在第一个节点处插入
{
point-next=head;
head=point;
return;
}
for(test *&mp=head;mp-next;mp=mp-next)//在链表中间插入
{
if(mp-next-number==number)
{
point-next=mp-next;
mp-next=point;
return;
}
}
}
void main()
{
head=create();//调用创建
showl(head);
int dp;
cout"请输入删除点假如找不到就跳出函数"endl;
cindp;
deletel(head,dp);//调用删除
showl(head);
int ip;
cout"请输入插入点假如找不到就在链尾添加"endl;
cinip;
insterl(ip);
showl(head);
cin.get();
cin.get();
}
来源:http://www.tulaoshi.com/n/20160219/1620622.html
看过《c/c++中结构体(struct)知识点强化,链表的学习》的人还看了以下文章 更多>>