知识大全 单链表的运算之建立单链表
Posted 结点
篇首语:认识到自己无知是知识进步的重要阶段。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 单链表的运算之建立单链表相关的知识,希望对你有一定的参考价值。
单链表的运算 建立单链表 假设线性表中结点的数据类型是字符 我们逐个输入这些字符型的结点 并以换行符 \\n 为输入条件结束标志符 动态地建立单链表的常用方法有如下两种
( ) 头插法建表① 算法思路 从一个空表开始 重复读入数据 生成新结点 将读入数据存放在新结点的数据域中 然后将新结点插入到当前链表的表头上 直到读入结束标志为止 具体方法
注意 该方法生成的链表的结点次序与输入顺序相反
② 具体算法实现 LinkList CreatListF(void) //返回单链表的头指针 char ch; LinkList head;//头指针 ListNode *s; //工作指针 head=NULL; //链表开始为空 ch=getchar(); //读入第 个字符 while(ch!= \\n ) s=(ListNode *)malloc(sizeof(ListNode));//生成新结点 s >data=ch; //将读入的数据放入新结点的数据域中 s >next=head; head=s; ch=getchar(); //读入下一字符 return head;
( ) 尾插法建表 ① 算法思路 从一个空表开始 重复读入数据 生成新结点 将读入数据存放在新结点的数据域中 然后将新结点插入到当前链表的表尾上 直到读入结束标志为止 具体方法
注意 ⒈采用尾插法建表 生成的链表中结点的次序和输入顺序一致 ⒉必须增加一个尾指针r 使其始终指向当前链表的尾结点
② 具体算法实现 LinkList CreatListR(void) //返回单链表的头指针 char ch; LinkList head;//头指针 ListNode *s *r; //工作指针 head=NULL; //链表开始为空 r=NULL;//尾指针初值为空 ch=getchar(); //读入第 个字符 while(ch!= \\n ) s=(ListNode *)malloc(sizeof(ListNode));//生成新结点 s >data=ch; //将读入的数据放入新结点的数据域中 if (head!=NULL) head=s;//新结点插入空表 else r >next=s;//将新结点插到*r之后 r=s;//尾指针指向新表尾 ch=getchar(); //读入下一字符 //endwhile if (r!=NULL) r >next=NULL;//对于非空表 将尾结点指针域置空head=s; return head; 注意 ⒈开始结点插入的特殊处理 由于开始结点的位置是存放在头指针(指针变量)中 而其余结点的位置是在其前趋结点的指针域中 插入开始结点时要将头指针指向开始结点 ⒉空表和非空表的不同处理 若读入的第一个字符就是结束标志符 则链表head是空表 尾指针r亦为空 结点*r不存在;否则链表head非空 最后一个尾结点*r是终端结点 应将其指针域置空
( ) 尾插法建带头结点的单链表 ①头结点及作用 头结点是在链表的开始结点之前附加一个结点 它具有两个优点: ⒈由于开始结点的位置被存放在头结点的指针域中 所以在链表的第一个位置上的操作就和在表的其它位置上操作一致 无须进行特殊处理; ⒉无论链表是否为空 其头指针都是指向头结点的非空指针(空表中头结点的指针域空) 因此空表和非空表的处理也就统一了
②带头结点的单链表
注意 头结点数据域的阴影表示该部分不存储信息 在有的应用中可用于存放表长等附加信息
③尾插法建带头结点链表算法 LinkList CreatListR (void) //用尾插法建立带头结点的单链表 char ch; LinkList head=(ListNode *)malloc(sizeof(ListNode));//生成头结点 ListNode *s *r; //工作指针 r=head; // 尾指针初值也指向头结点 while((ch=getchar())!= \\n ) s=(ListNode *)malloc(sizeof(ListNode));//生成新结点 s >data=ch; //将读入的数据放入新结点的数据域中 r >next=s; r=s; r >next=NULL;//终端结点的指针域置空 或空表的头结点指针域置空 return head; 注意 上述算法里 动态申请新结点空间时未加错误处理 这对申请空间极少的程序而言不会出问题 但在实用程序里 尤其是对空间需求较大的程序 凡是涉及动态申请空间 一定要加入错误处理以防系统无空间可供分配
cha138/Article/program/sjjg/201311/23278相关参考
插入运算()思想方法 插入运算是将值为x的新结点插入到表的第i个结点的位置上即插入到ai与ai之间具体步骤 ()找到ai存储位置
图双向链表中的结点删除 双向链表的结束条件和单链表相同双向循环链表的结束条件和单向循环链表的结束条件相同 静态链表 根据上节单链表的知识用单链表表示线性表时其结点空间是在运行时根据需要动态分
销毁单链表 单链表被构造使用完后由于其结点均为动态分配的内存空间所以必须要销毁以释放空间否则会造成申请的内存不能释放单链表的销毁操作是创建操作的逆运算由于要修改单链表的头指针的指针变量所以要将头
()按值查找 单链表的按值查找是在线性表存在的情况下查找值为x的数据元素若成功返回首次出现的值为x的那个元素所在结点的指针;否则未找到值为x的数据元素返回NULL表示查找失败 算法思路从链表的
单链表基本运算的实现 创建空单链表 链表与顺序表不同它是一种动态管理的存储结构链表中的每个结点占用的存储空间不是预先分配而是运行时系统根据需求生成的因此建立空单链表就是建立一个带头结点的空表该
求表长 由于单链表采用离散的存储方式并且没有显示表长的存储信息因此要求出单链表的表长必须将单链表遍历一遍 算法思路设一个移动指针p和计数器count初始化后p指向头结点p后移一个结点count
单链表的查找运算()按序号查找①链表不是随机存取结构 在链表中即使知道被访问结点的序号i也不能像顺序表中那样直接按序号i访问结点而只能从链表的头指针出发顺链域nex
删除 删除运算是指删除单链表的第i个结点即将第i个元素结点的指针域指向第i+个元素结点要实现删除首先要找到第i个元素结点前驱结点设单链表第i个元素结点指针为p要删除第i个元素结点(指针为q)操作
查找操作 ()按序号查找 从单链表的第一个元素结点起判断当前结点是否是第i个若是则返回该结点的指针否则继续下一个结点的查找直到表结束为止若没有第i个结点则返回空如果i=返回头指针 算法如下
单链表的查找运算 ()按序号查找 ①链表不是随机存取结构 在链表中即使知道被访问结点的序号i也不能像顺序表中那样直接按序号i访问结点而只能从链表的头指针出发顺链域 next逐个结点往下搜索