【问题标题】:Removing previous duplicate entry in a linked list删除链表中的先前重复条目
【发布时间】:2015-05-03 04:57:48
【问题描述】:

我的链表具有以下结构。

typedef struct value value;

struct value{
  value* prev;
  value* next;
  int value;
};

...
//ent = entry
if(entry_head == NULL) { 
 entry_head = ent;
 entry_tail = ent;
 entry_tail->prev = NULL;
}
else { // add to top
  ent -> next = entry_head;
  ent -> prev = NULL;
  entry_head -> prev = ent;
  entry_head = ent;
}

这给了我结果:

Input: a       Result: b
       b               a

但是,当我输入两个相同的变量时,我想删除以前的变量并只使用新输入的变量。即。

Input: a // old    Result: a // new   Actual Result: a // new
       a // new                                      a // old

如何修改它以删除旧变量?

【问题讨论】:

  • 你真的需要删除第一个吗?另一种方法是不添加第二个。但这取决于您的要求。

标签: c list linked-list


【解决方案1】:

您需要修改添加节点代码,在处理添加到非NULL列表的所有节点的函数部分。

value *tmp =head ;
while(tmp!=NULL) {
  if(tmp->Value== newval) break;
  tmp=tmp->next;
}
If(tmp!=NULL) return 0;
// add node here

return  1

或者,在添加一个节点之后,创建一个类似的 while 循环。

对于列表中的每个节点,在此之后的所有节点都必须进行比较和删除。这将是有效的。

要删除一个节点,你所做的只是一些指针 twizzling ,然后在不再需要时释放该节点以避免内存泄漏

// a->B->c
//  <- <-

value *save=a->next;

a->Next=save->next;

// node c

Save->Next->prev=save->prev;


free(save);

此代码未经测试,我的手机上没有linux。

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 2021-01-12
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2023-04-01
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多