-2

我必须使用链表(因此是指针)在 c 中打印一个集合列表。但是,当我删除列表的第一个元素并尝试打印列表时,它只会在彼此下方显示很多地址。关于问题可能是什么的任何建议?谢谢!

删除功能:

 int delete(set_element* src, int elem){
 if (src==NULL) {
    fputs("The list is empty.\n", stderr);
 }


 set_element* currElement;
 set_element* prevElement=NULL;

 for (currElement=src; currElement!=NULL; prevElement=currElement, currElement=currElement->next)     {
    if(currElement->value==elem) {
        if(prevElement==NULL){
            printf("Head is deleted\n");
            if(currElement->next!=NULL){
                *src = *currElement->next;
            } else {

                destroy(currElement);
            }
        } else {
            prevElement->next = currElement->next;
        }
        //  free(currElement);
        break;
    }
   }



return 1;
}



 void print(set_element* start)
{
    set_element *pt = start;

    while(pt != NULL)
    {
      printf("%d, ",pt->value);
     pt = pt->next;
   }
 }
4

3 回答 3

0

警告:此答案包含推断代码。

C 中的典型链表看起来有点像这样:

typedef struct _list List;
typedef struct _list_node ListNode;

struct _list {
  ListNode *head;
}

struct _list_node {
  void *payload;
  ListNode *next;
}

为了从列表中正确删除第一个元素,需要执行以下顺序:

List *aList; // contains a list

if (aList->head)
  ListNode *newHead = aList->head->next;

delete_payload(aList->head->payload); // Depending on what the payload actually is
free(aList->head);
aList->head = newHead;

这里的操作顺序很重要!在没有释放旧值的情况下尝试移动磁头会导致内存泄漏;并且在没有首先获得新头的正确值的情况下释放旧头会产生未定义的行为。

附录:偶尔_list上面的代码部分会被完全省略,列表和列表节点是一样的;但从你描述的症状来看,我猜这里可能不是这种情况。

然而,在这种情况下,这些步骤基本上保持不变,但没有aList->位。


编辑:

现在我看到了你的代码,我可以给你一个更完整的答案。

代码中的关键问题之一是它无处不在。然而,这里有一行特别糟糕:

*src = *currElement->next;

这不起作用,并且是导致您崩溃的原因。

在您的情况下,解决方案是以某种容器方式包装链表,例如上面的 struct _list 构造;或重新编写现有代码以接受指向集合元素的指针的指针,以便您可以将指向集合元素的指针(这是您想要做的)传递回来。

在性能方面,这两种解决方案可能非常接近,以至于没有任何可能性,但使用包装列表结构有助于传达意图。它还有助于防止指向列表的其他指针由于头部删除而变得乱码,所以就是这样。

于 2013-10-21T10:37:22.690 回答
0

当您删除不属于您的指针(实际上是一块内存)时,通常会发生这种情况。仔细检查你的函数以确保你没有释放你已经释放的同一个指针,或者释放你没有用“malloc”创建的指针。

于 2013-10-21T10:38:02.863 回答
0

如果列表指针与指向第一个元素的指针相同,则列表指针在第一个元素时不再有效free

这个问题有两种解决方案:

  1. 让您的所有列表方法获取指向列表的指针,以便在必要时对其进行更新。这种方法的问题是,如果您在另一个变量中有指针的副本,那么该指针也会失效。

  2. 不要让列表指针指向第一个元素。让它指向指向第一个元素的指针。

示例代码:'

typedef struct node_struct {
  node_struct *next;
  void *data;
} Node;


typedef struct {
  Node *first;
} List;
于 2013-10-21T10:39:20.403 回答