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,或者在索引之后插入节点temp并将它重新连接到列表中结构的所有指针都被设置为null,然后作为参数传递,除了它已经有节点的列表。
答案 0 :(得分:1)
如果你真的试图以正常意义插入n
位置,那么你就是一个人。在n
位置插入通常意味着新项目在插入后位于n
位置。在C中,n
从零开始。因此,在0
位置插入会将新项目放在列表的开头。在L
处插入L
是原始列表长度,将其放在最后。
即使您修正了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;
我会让你把各个部分放在一起。你应该得到一些小而美的东西。
答案 1 :(得分:0)
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++){
答案 2 :(得分:0)
如果为ndex提供的值大于或等于(列表中的当前节点数)-1,您将尝试取消引用空指针并获得段错误。考虑一个包含3个节点的列表,并将ndex值2输入到函数中:
列表 - &gt;节点0 - &gt;节点1 - &gt;节点2 - &gt; NULL
您的代码确实存在两个问题:
答案 3 :(得分: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`
答案 4 :(得分:0)
var result = await authContext.AcquireTokenSilentAsync(AzureAdGraphResourceURL, clientCredential, userIdentifier);
答案 5 :(得分:0)
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;
}
}