【问题标题】:Insertion in Circular Linked List (output not coming as desired)循环链表中的插入(输出未达到预期)
【发布时间】:2017-02-03 18:37:00
【问题描述】:

这是我用 C 写的方法,用于插入链表。

void insert_beg()
{
temp=(struct node*)malloc(sizeof(struct node));
ptr=(struct node*)malloc(sizeof(struct node));

int data_value;

printf("Enter the value\n");
scanf("%d",&data_value);

temp->info=data_value;

if(header->link==NULL)//when there is no node
{
    header->link=temp;
    temp->link=header;
}
else//when atleast one node has been created
{
    ptr->link=header->link;//ptr is pointing to where header was pointing.
    header->link=temp;
    temp->link=header;
}

printf("\n\n");
}

这是遍历的代码(基本显示)

 void traverse()
{
ptr=header->link;

while(ptr->link!=header)
{
    ptr=ptr->link;
    printf("%d\t",ptr->info);
}
printf("\n\n");
}

运行程序时,遍历的输出是空的。就好像 for 循环没有运行一样。插入或任何其他事情时没有分段错误。 我的逻辑正确吗?如果不是,那我哪里错了?

【问题讨论】:

  • 我认为条件应该是if (header == NULL)。然后temp->link = ptr->link。否则你会失去原来的header->link
  • insert_beg函数中,为什么会创建node的两个对象?
  • @PRP 当我删除 ptr 对象时,代码的 else 部分出现问题。我遇到了分段错误。所以这就是为什么..

标签: c linked-list insertion circular-list


【解决方案1】:

原来的header->link 值由于分配错误而丢失。 此外,对于变量 ptr,您不需要 malloc。修改你的 if/else 块。

if (header == NULL){
    header = temp
    header->link = temp
}
else//when atleast one node has been created
{
    ptr=header->link;//ptr is pointing to where header was    pointing.
    header->link=temp;
    temp->link=ptr;
}

基本上,您总是尝试使用else block 在第二个位置添加,但不是将旧数据放在第三个位置,而是将第二个数据指向第二个位置。

我还发现上述代码存在一些基本问题。该代码既不接受指针变量,也不返回任何指针。一旦函数返回,就无法访​​问数据。

如果 header 是一个全局变量,那么这应该是变化。 malloctemp 以及与 temp 相关的所有其他内容都应该移到 else 块内,因为 if 部分不需要它们

if (header->link == NULL){
    header->data = data
    header->link = header
}

如果 header 不是全局变量,那么为了解决完整的问题,函数应该修改为

void insert_beg(struct node **header_dptr) #A double pointer
{
   header = *header_dptr
   temp=(struct node*)malloc(sizeof(struct node));
   int data_value;

   printf("Enter the value\n");
   scanf("%d",&data_value);

   temp->info=data_value;

   if(header==NULL)//when there is no node
   {
       header=temp;
       header->link=temp;
   }
  else//when atleast one node has been created
  {
       ptr=header->link;//ptr is pointing to where header was    pointing.
       header->link=temp;
       temp->link=ptr;
  }

printf("\n\n");
}

【讨论】:

  • 我们可以用temp->link = header->link; header->link = temp; 来避免临时指针吗?
  • 是的,我们可以这样做,但我保留了原始代码,以便 OP 理解原始代码中的错误。
  • @Sharad 我在这段代码中遇到了分段错误。 (遍历)。另外,header->link=temp 和 header=temp 有什么区别?如果这听起来很愚蠢,我很抱歉,但我现在真的很困惑。
  • 你能添加你在哪里初始化header变量吗?您应该接受一个指针变量(最好是标头)或在函数中返回一个指针变量。否则将无法访问日期
  • @Sharad 我创建了一个 main 方法并使用 switch case 创建了一个基于菜单的系统,该系统在使用 do-while 循环的条件下运行。头节点在所有方法之外初始化,内存在main方法中分配给它。
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多