当前位置:  编程技术>c/c++/嵌入式

C++中单链表的建立与基本操作

    来源: 互联网  发布时间:2014-10-22

    本文导语:  准备数据 准备在链表操作中需要用到的变量及数据结构 示例代码如下: 代码如下:struct Data   //数据结点类型 { string key;  //关键字  string name; int age;};struct CLType  //定义链表结构 { Data nodeData; Data *nextNode;};定义了链表数据...

准备数据

准备在链表操作中需要用到的变量及数据结构

示例代码如下:

代码如下:

struct Data   //数据结点类型
{
 string key;  //关键字
 string name;
 int age;
};
struct CLType  //定义链表结构
{
 Data nodeData;
 Data *nextNode;
};

定义了链表数据元素的类型Data以及链表的数据结构CLType。结点的具体数据保存在一个结构Data中,而指针nextNode用来指向下一个结点。

我们可以认为,该链表是一个班级学生的记录,其中key表示学号,name为学生的名字,age为年龄。

追加结点

追加结点就是在链表末尾增加一个结点。表尾结点的地址部分原来保存的是空地址NULL,此时需要将其设置为新增结点的地址(即原表尾结点指向新增结点),然后将新增节点的地址部分设置为空地址NULL,即新增结点为表尾。

由于一般情况下,链表只有一个头指针head,要在末尾添加结点就需要从头指针head开始逐个检查,直到找到最后一个结点(即表尾)。

追加结点的操作步骤如下:

(1)首先分配内存地址,保存新增结点。

(2)从头指针head开始逐个检查,直到找到最后一个结点(即表尾)。

(3)将表尾结点的地址设置为新增结点的地址。

(4)将新增结点的地址部分设置为空地址NULL,即新增结点成为表尾。

示例代码如下:

代码如下:

CLType * CLAddEnd(CLType *head,Data nodeData)
{
 CLType *node,*htemp;
 if(!(node = new CLType))
 {
  coutnextNode; 
  }
  htemp->nextNode = node;
  return head;
 }

}

输入参数head为链表头指针,输入参数nodeData为结点保存的数据。程序中,使用new关键字申请动态空间,如果内分配成功,node中将保存指向该内存区域的指针。

然后,将传入的nodeData保存到申请的内存区域,并设置该结点指向下一结点的指针值为NULL。

插入头结点

插入头结点就是在链表首部添加结点的过程,和在表尾插入结点相反,这个操作是在表头上插入结点,作为头结点。

插入头结点的步骤如下:

(1)首先分配内存,保存新增的结点。

(2)使新增姐弟那指向头指针head所指向的结点

(3)然后使头指针head指向新增结点

示例代码如下:

代码如下:

CLType *CLAddFirst(CLType *head,Data nodeData)
{
 CLType *node;
 if(!(node = new CLType))
 {
  coutnextNode;
 }
 return NULL;
}

输入参数head为链表头指针,输入参数name为要查询的同学的姓名。遍历查询所有的同学的姓名,当有结点的姓名与所查询的姓名相同的时候,则返回该结点的指针。

插入结点

插入结点就是在链表中间部分的位置增加一个结点。

插入结点的步骤如下:

(1)分配内存空间,保存新增的结点。

(2)找到要插入的逻辑位置,也就是找到插在那个结点的后面。

(3)修改插入位置结点的指针,使其指向新增结点,而使新增结点指向原插入位置所指向的结点。

示例代码如下:

代码如下:

CLType *CLInsertNode(CLType *head,int k,Data nodeData)
{
 CLType *node,*nodetemp;
 if(!(node = new CLType))    //申请结点
 {
  coutnextNode = node;    //关键结点指向插入点
  }
  else
  {
   coutnextNode;  //指向下一个结点
  }
 }
  return 0;        //删除失败
}

head为链表头指针,输入参数name表示要删除的同学的姓名。程序中,通过一个循环,按关键字在整个链表中查找要删除的结点。如果找到被删除的结点,则设置上一结点(node指针所指结点)指向当前结点(h指针所指结点)的下一个结点,即在逻辑上将该结点删除,然后对该结点执行delete操作,释放结点占用的内存空间,即在物理上将其删除。

计算链表长度

计算链表长度也就是统计链表中结点的数量。顺序表中计算链表长度比较方便,但在链表中链表的长度却需要通过遍历链表来获得,因为链表在物理上不是连续存储的。

示例代码如下:

代码如下:

int CLLength(CLType *head)
{
 CLType *htemp;
 int Len = 0;
 htemp = head;
 while(htemp)       //遍历整个数组
 {
  Len++;        //累加结点的数量
  htemp = htemp->nextNode;    //处理下一个结点
 }
 return Len;
}

参数head是链表的头指针,程序中通过while来遍历指针,Len作为计数器,通过记录循环的次数,来获得链表的长度,当指针为NULL时截止,然后返回计数器的值。

显示所有结点

遍历所有的结点,并输出。

代码如下:

void CLAllNode(CLType *head)
{
 CLType *htemp;
 htemp = head;
 while(htemp)       //遍历整个数组
 {
  nodeData = htemp->nodeData;   //获取结点数据
  cout

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 什么操作系统能建立文件名大于256的文件
  • Java Swing中如何建立表头(尤其是NetBeans中如何操作?)
  • 请教建立函数库的具体操作
  • 双操作系统如何建立???
  • 请问各位朋友:在JAVA的数据库应用管理系统中,如何不在操作系统忠建立数据源便能连接数据库(如ACCESS、MS SQL 等等
  • 如何在用户登入后,以建立的session唯一号(如../mail.jsp?USERID=60029FB49A5BBCAD93CA40F523DB7D566F)进行操作??
  • 请问各位朋友:在JAVA的数据库应用管理系统中,如何不在操作系统忠建立数据源便能连接数据库(如ACCESS、MS SQL 等等)?
  • 关于Bean数据库操作时建立连接的问题(简单)=》
  • 建立JSP操作以提高数据库访问的效率
  • 请问各位朋友:在JAVA的数据库应用管理系统中,如何不在操作系统忠建立数据源便能连接数据库(如ACCESS、MS SQL 等等)
  • Redhat/Centos下rpmbuild命令从spec文件或者tar包建立rpm
  • 如何在Red Hat上建立FTP服务 并且建立FTP一个用户
  • 怎样在linux下建立一个PPP服务器,并在另一台机子上通过pppd来建立连接呀?
  • 怎么建立.alias文件?在哪里建立这个文件?
  • 用windows客户机登陆Linux服务器不能建立建立文件夹????[img=http://forum.csdn.net/PointForum/ui/scrip
  • 请问在linux中怎么来建立ftp和web服务器,怎么建立和windows的局域网
  • 很多服务都吧监听同时建立在特定ip和广播ip上,但是使用ssh转发时,发现没法建转发建立在广播ip上
  • 只给一个目录路径,怎样再在其下建立一个新的目录(给定目录名),然后再在其下建立一个新的文件(给定文件名)?
  • unix下获得文件的建立时间
  • linux系统中建立一个用户专门用来修改系统时间怎么做?
  • 哪个DOS命令可以建立一个空文件?
  • 开发板上建立一个nfs服务器
  • 用户ID的建立
  • 建立用户的问题
  • 服务器8G内存,怎样建立swap分区?
  • 如何建立虚拟主机
  • 怎么样在 dos 系统下 批量的建立目录?
  • 请问如何建立“目录的快捷”档?
  • 如何建立批处理?
  • 新手:unix下建立文件的命令?
  • 在pxa255建立linux2.4的系统,需要哪些补丁啊?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3