两个双向链表删除相同元素

原创 2011年08月10日 10:26:18

参考:http://hi.baidu.com/beyond748/blog/item/cdeefb1ce3638a8d87d6b6c7.html/cmtid/6145d62fdd4a92361f3089e8


#include "stdafx.h"
//#include "list.h"
#include <iostream>
#include <vector>
using namespace std;

typedef struct node{
int data;
struct node *front, *next;
}node, *linkHead;
//记录删除的元素
int delCnt=0;
int delTmp[16];

void creatList(linkHead *head, int ary[], int n){
int c=0;
linkHead p;
// head;
linkHead h= (linkHead)malloc(sizeof(node));
h->next=NULL;
h->front=NULL;
h->data=n;
*head = h;


while(c<n){
p = (linkHead)malloc(sizeof(node));
h->next = p;
p->front= h;
p->data = ary[c++];
h = p;
p->next = NULL;
}
}

void printList(const linkHead head)
{
linkHead p=head->next;
while(p){
printf("%d\n", p->data);
p = p->next;
}
}

int delNode(linkHead *head, int val, int save)
{
linkHead pNode; 
linkHead p = (*head)->next;
while (p)
{
if (p->data==val) {
if (save==1) delTmp[delCnt++]=p->data;
if (p->next){
pNode = p->next;
p->front->next=p->next;
p->next->front=p->front;
free(p), p=NULL;
p = pNode;
}else{
p->front->next=NULL;
free(p), p=NULL;
}

}else
p = p->next;
}


return 1;
}

void delSame(linkHead *head1,linkHead *head2){
linkHead p = (*head1)->next;
while(p){
delNode(head2, p->data, 1);
p=p->next;
}

for(int i=0; i<delCnt; i++){
delNode(head1, delTmp[i], 0);
}
}

void main()
{
int aa[]={1,2,3,4,5,6};
int bb[]={3,4,5,6,7,8,9,10,11,4,2};
linkHead list1,list2;
creatList(&list1,aa, sizeof(aa)/sizeof(aa[0]));        
creatList(&list2,bb, sizeof(bb)/sizeof(bb[0]));
//delSame(&list2,&list1);
delSame(&list1,&list2);

printf("\n");
printList(list1);
printf("\n");
printList(list2);
}

合并两个链表,去掉重复元素

最近在学习机器学习的相关算法,写到DbScan算法发现在簇扩展时用到两个邻域中的点会重合,于是尝试了合并两个链表的两个算法。 最初用到这个方法,认为它简单易用。思路是定义一个链表存放合并后的链表lis...
  • u013159040
  • u013159040
  • 2015年04月14日 16:02
  • 1154

删除单链表中重复的值(Java版)

题目:删除带头结点的单链表中重复值的元素(即让每种值的元素只有一个) 解题思路: 用一个动态辅助存储数组,每次要向辅助数组中放入元素时,让辅助数组的长度加1,最长时与单链表一样长,设一...
  • lavor_zl
  • lavor_zl
  • 2015年01月17日 09:31
  • 2190

双向链表的有关操作(创建,遍历,插入,删除)

#include #include #include using namespace std; typedef struct node {     int ans;     struct nod...
  • AC_Gibson
  • AC_Gibson
  • 2014年11月04日 19:34
  • 899

删除单链表中的重复节点(删除多余项)

题目:如何删除单链表中的重复节点(即保证每个元素只出现一次,删除多余的,且后来出现的元素)。 一个没有排序的单链表,如 list = {a, 1, x, b, e, f, f, e, a, g, h...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月20日 13:46
  • 9416

双向链表建立、插入和删除

#include using std::cout; using std::endl; template class Node{ //节点的定义 public: Node(T t):i...
  • YEYUANGEN
  • YEYUANGEN
  • 2013年01月03日 22:00
  • 4534

java建立双向链表,插入结点,删除节点

java建立双向链表,插入结点,删除节点
  • qyy333
  • qyy333
  • 2013年10月27日 23:17
  • 1965

双向循环链表的建立、查找、添加、删除

双向循环链表的建立、删除、插入、、查找
  • dream_follower
  • dream_follower
  • 2016年12月08日 09:27
  • 478

数据结构——10 双向链表插入和删除节点

双向链表——插入、删除指定位置和相同节点
  • u010757264
  • u010757264
  • 2016年08月18日 17:06
  • 929

双向链表的初始化,建立,添加节点和删除节点(注意插入和删除要分三种情况)

/*双向循环链表*/ #include "declaration.h" typedef struct DulNode { int data; struct DulNode *next,*prior...
  • fengsuiyingdong
  • fengsuiyingdong
  • 2014年12月25日 18:56
  • 6573

从链表中删除重复数据(三种方法)

思路一: 遍历链表,把遍历的值存储到一个Hashtable中,在遍历过程中,若当前访问的值在Hashtable中已经存在,则说明这个数据是重复的,因此就可以删除。 优点:时间复杂度较低O(n) ...
  • IFollowRivers
  • IFollowRivers
  • 2017年04月13日 19:52
  • 1855
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两个双向链表删除相同元素
举报原因:
原因补充:

(最多只允许输入30个字)