C++中单链表的建立与基本操作
本文导语: 准备数据 准备在链表操作中需要用到的变量及数据结构 示例代码如下: 代码如下: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