【问题标题】:unable to insert in a linked list无法插入链表
【发布时间】:2015-11-29 16:53:22
【问题描述】:

我试图在给定的链表中插入一个元素,但是当我想打印它时显示无限循环。在 insert() 调用中我传递指针的地址,而在显示中我只传递存储的地址在指针中。请帮帮我

#include<stdio.h>
struct node{
int item;
node *ptr;
};
int insert(node **head, int data, int position)
{ 
int count=1;
node *temp=malloc(sizeof(struct node));
temp->item=data;
temp->ptr=NULL;
node *p,*q;
p=*head;
if(*head==NULL)
{
    *head=temp;
}
if(position==1)
{
    temp->item=*head;
    *head=temp;
}
else{
while(p!=NULL&&count<position)
{
    count++;
    q=p;
    p=p->ptr;

}
q->ptr=temp;
temp->ptr=p;
}
}
void display(node *temp)
{
while(temp!=NULL)
{
    printf("the data is %d",temp->item);
    temp=temp->ptr;
}
}
void main()
{
node *head=malloc(sizeof(struct node));
insert(&head,29,1);
display(head);
}

【问题讨论】:

  • 你不应该在 C++ 中使用 malloc。事实上,这可能应该被标记为 C。
  • 您的格式/缩进需要工作。看起来你的调试器技能也不是很好:(
  • 哦,是的...改用 C++ 容器类。
  • 您对position 的意图是什么?如果链接列表只有 2 个元素,而您传入​​的位置为 5,该怎么办?您希望介于两者之间的元素成为有效节点吗?
  • 对不起它的 c 文件。假设我们在 position 中传递了一个有效且在范围内的值,例如如果你有 2 个元素,那么在 position 中传递的值可能是 1 或 2 或 3。

标签: c pointers linked-list


【解决方案1】:
  1. 它是一个 C 程序,请正确分类。
  2. 在您的代码中不使用任何 C++ 模块。

使用 C 实现 -

我认为在简单的插入链表中不需要双指针。 你可以做的是-

void insert(node *head, int data){
   node *temp= malloc(sizeof(struct node));
   temp->item = data;
   temp->ptr= NULL;
   if(head==NULL){  //empty list
       head=temp;
   }
   else {
     while(head->ptr!=NULL){ //traverse till end
       head=head->ptr;
     }
     head->ptr=temp;
   }
 }

并从主函数调用为 insert(head,value);

【讨论】:

  • 当列表为空时,您需要一个双指针 (head == NULL)。您只是分配了局部变量,所以 head 在函数之外仍然是 NULL
  • 抱歉 - “忘记声明假设 - 假设 head 被声明为全局......”
  • head 仍然是您正在更改的局部变量。
  • 哦,是的,我应该做的是将全局head 复制到temp1 变量中,然后遍历temp1 变量并插入:) 谢谢提醒。
  • 如果你不使用双指针,那么当列表为空时,你必须编写另一个函数 insert 仅用于插入第一个元素..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2013-02-28
相关资源
最近更新 更多