【数据结构】循环链表和⾮循环单链表的区别
注意:这⾥的循环链表是以尾指针为起始。
⾮循环单链表判断结束的标志为指针为空。⽽循环链表判断结束的标志是指针不是头节点。
在插⼊操作中,⾮循环单链表判断循环结束是指针为空。若循环结束后,发现指针变为空,说明要求插⼊的位置不合理:位置⼤于
Length+1。
bool  insert(LinkList *L, int target, int data)
{
if (target < 1)
{
cout << "insert erro" << endl;
return false;
}
else
{
int now = 1;position和location的区别
LinkList p = *L;
车上的securitywhile (now < target&&p != NULL)
{
now++;
p = p->next;
}
if (p == NULL)
{
cout << "insert erro" << endl;
return false;
}
LinkList s = (LinkList)malloc(sizeof(Node));
s->data = data;
s->next = p->next;
p->next = s;
return true;
}
return true;
}
带有尾指针的循环链表:由于判断链表空的条件指针等于头指针。如果⽤⾮循环链表的循环条件,会导致错误:假设使⽤单链表的⽅法插⼊,初始时候链表空,要插⼊第⼀个节点时,因为链表空和位置就是为1,的原因,循环结束。⼜进⾏了是否为空的判断,空就提⽰错误。此时,由于链表是空的,指针指向头指针,⽽判断空的条件为指针指向头指针即为空,所以不允许插⼊操作。这个是有问题的。
于是我们做出了改进:指针的下⼀位指针指向头指针或者j==⽬标地址就结束循环。但是循环以后的判断条件改为了如果j!=⽬标地址。
原因如下:此时,循环因为指针的下⼀位是头指针⽽结束循环的情况只有4种
1.表空,⽬标地址为1,此时j为1
2.表空,⽬标地址⼤于1,此时j为1
3.⽬标地址为Length+1,此时j==length+1
4.⽬标地址⼤于Length+1,此时j==length+1
其中合理的情况为1和3。所以当j!=location时,不合理。
bool insert(LinkList *L, int location, int data)
{
//位置问题
if (location < 1)
docker公司成立于那一年
{
cout << "erro" << endl;
return false;
}
LinkList p = *L;
int j = 1;
p = p->next;//指向头指针
/
oracle数据库哪个版本用的多/注意与⾮循环链表的判断区别
while (p->next!= (*L)->next&&j < location)
{
awk sed grep
p = p->next;
c语言是面向的程序设计语言j++;
}
//位置⼤于实际长度
//循环链表的时候,当p所指的链表为空,是可以插⼊的。
//但是⾮循环链表,当p所指的地址为空,不可以插⼊。
if (j!=location)
{
cout << "erro" << endl;
return false;
}
LinkList temp = p->next;
LinkList s = (LinkList)malloc(sizeof(Node));
s->data = data;
p->next = s;
s->next = temp;
if (p == *L)
{
*L = s;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。