node* insertnth(struct node_q* list,int ndex,struct node_q* qtemp){//temp is the node to be inserted at the back of ndex
struct node_q* temp;
struct node_q* curr;
int i;
temp = list;
curr = temp;
for(i=0;i<=ndex;i++){
if(temp!=NULL)
temp = temp->pnext;
}
curr = temp;
temp = temp->pnext;
curr->pnext = NULL;
curr->pnext = qtemp;
qtemp->pnext = temp;
return list;
}
我不知道它为什么崩溃。 此函数应在索引的后面或索引之后插入节点 temp 并将其重新连接到列表 结构的所有指针在作为参数传递之前都设置为 null,除了它已经有节点的列表。
如果你真的想在正常意义上的第n
个位置插入,你就差了一个。 插入位置 n
通常意味着新项目在插入后位于第 n
个位置。 在 C 中,n
从零开始。因此,在第 0
个位置插入会将新项目放在列表的顶部。 插入第 L
个,其中 L
是原始列表长度,将其放在最后。
即使您修复了 off-by-1 错误,代码也是混乱和丑陋的。
如果您考虑将两个指针向下推进列表:"领先"和"跟踪"指针,则此问题会变得更容易。 跟踪以 NULL 开始,引线指向列表头。 将货币对推进n
倍。
迭代引导和跟踪指针可以通过一个不错的for
循环习惯法来实现:
int i;
struct node *lead, *trail;
for (i = 0, trail = NULL, lead = list;
i < n && lead != NULL;
++i, trail = lead, lead = lead->next)
完成后,有两种情况。最常见的是lead
和trail
分别指向第 n
和第 n-1
个列表项,其中潜在客户可能为 NULL(即您已到达列表末尾)。在这种情况下,插入新节点只是:
new_node->next = lead;
trail->next = new_node;
return list;
另一种情况是trail
仍然指向 NULL。这意味着n
为零。 在这种情况下,上面的代码将不起作用。 第二行将失败。 在这里,您只想使新节点成为新的列表头:
new_node->next = lead;
return new_node;
我会让你把碎片放在一起。你应该得到一些小而美丽的东西。
curr = temp;
temp = temp->pnext;
curr->pnext = NULL;
curr->pnext = qtemp;
qtemp->pnext = temp;
即使在此代码中,您也可以访问temp->pnext
因此它不应该为 NULL。
if(temp!=NULL)
{
curr = temp;
temp = temp->pnext;
curr->pnext = NULL;
curr->pnext = qtemp;
qtemp->pnext = temp;
}
else
{
printf("wrong index");
}
如果你从 1 开始索引,那么最好更改循环条件以在索引位置插入节点,
for(i=0;i<ndex;i++){
如果为 ndex 提供的值大于或等于(列表中的当前节点数)-1,您将尝试取消引用空指针并获取段错误。 考虑一个包含 3 个节点的列表,并且函数的 ndex 值为 2 个输入:
列表-->节点 0-->节点 1-->节点 2-->NULL
- 启动条件:
- 温度 = 节点 0
- curr = 节点 0
- NDEX = 2
- for 循环的第一次迭代:
- i = 0
- , 0 <= 2
- temp != 空,分配 temp = 节点 0->下一个(节点 1)
- 第二次迭代:
- i = 1
- , 1 <= 2
- temp != 空,分配 temp = 节点 1->下一个(节点 2)
- 第三次迭代:
- i = 2
- , 2 <= 2
- temp != 空,分配 temp = 节点 2->下一个 (空)
- 后循环操作:
- 分配 curr = 温度 (空)
- 分配 temp = 临时>下一个(取消引用空指针并崩溃)
所以你的代码确实有两个问题:
- 插入未在正确的位置进行,因为您混合了索引约定。 函数的索引值输入和 for 循环中的条件就像列表从 1 开始索引一样,但 for 循环的起始条件就像列表从 0 开始索引 一样
- 在尝试插入之前,代码不会检查迭代是否已到达列表末尾。
Public void Insert (Type object, int k, bool flag)
{
Flag = false;
ListNode<Type> current = head;
bool found = false;
while ((current.next != null)&&(found == false))
{
if(current.data == obiect)
found = true; else
current = current.next;
}
If (found)
System.out.println(“The object already in the List”); else
{
if (k > n)
{
ListNode<Type> newNode = new ListNode<Type>();
newNode.data = object; newNode.next = null;
current.next = newNode; tail =newNode
}
else if(k <= 1)
{
ListNode<Type> newNode = new ListNode<Type>();
newNode.data = object;
newNode.next = head.next; head =newNode
}
else
{
int i = 1;
current = head;
while((I == k)&&(current.next != null))
{
current = current.next;
i++;
} `enter code here`
list-->node 0-->node 1-->node 2-->NULL
Starting condition:
temp = node 0
curr = node 0
ndex = 2
First iteration of the for loop:
i = 0, 0 <= 2
temp != NULL, assign temp = node 0->next (node 1)
Second iteration:
i = 1, 1 <= 2
temp != NULL, assign temp = node 1->next (node 2)
Third iteration:
i = 2, 2 <= 2
temp != NULL, assign temp = node 2->next (NULL)
Post-loop operations:
assign curr = temp (NULL)
assign temp = temp->next (dereferences NULL pointer and crashes)
public void InsertAtNth(int data, int position){
NodeS newNode = new NodeS(data);
NodeS temp = head1;
NodeS prev = null;
if(head1 == null ){
head1 = newNode;
}
else if(position == 0){
newNode.next = head1;
head1 = newNode;
}
else{
for(int i = 0;i < position; i++){
prev = temp;
temp = temp.next;
}
prev.next = newNode;
newNode.next = temp;
}
}