您的位置:首页 > 编程语言 > C语言/C++

[笔试题 7][c/c++]删除两个双向链表中相同元素的所有节点

2011-09-18 23:41 513 查看
题目:

两个双链表1,2分别以头节点数据域全为F开头,且两个链表中分别有多个元素可能相同。

设计函数int DeleteSameNodes(Node *pHeadA, Node *pHeadB);

typedef struct _Node

{

    int data;

    struct _Node *front, *next;

}Node;

思路1:

设双链表1的元素个数为m,双链表2的节点个数为n;



int DeleteSameNodes(Node *pHeadA,Node *pHeadB){
int deleteFlag = 0;
for(p1~双链表1中的m个节点)
{
for(p2~双链表2中的n个节点)
{
if(p1.data == p2.data)
{
delete p2.node;
deleteFlag = 1;
}
}//删除链表2中所有与该节点元素相同的节点
if(deleteFlag)//链2中有删除
{
for(p1~链表1中所有节点)
//删除所有p1中与该节点相同的节点
deleteFlag = 0;
}
}
return 0;
}

具体代码如下:

/************************************************************************/
/* @date:2011-09-19
@author:Jing
*/
/************************************************************************/
#include <iostream>
#include <ctime>
using namespace std;
#define TAG 0xFFFFFFFF

typedef struct _Node
{
int data;
struct _Node *front, *next;
}Node;

class DuLinkList
{
public:
DuLinkList()
{
head = new Node;
head->data = TAG;
head->front = head;
head->next = head;
}
~DuLinkList()
{
Node *p = head;
Node *q = head->next;
while(q->data != TAG)
{
p->next = q->next;
q->next->front = p;
delete q;
q = p->next;
}

delete p;
}

void InsertNode(int data);
friend	int DeleteSameNodes(DuLinkList *pHeadA, DuLinkList *pHeadB);
void Print();

private:
Node *head;
};

void DuLinkList::InsertNode(int data)
{
Node *temp  = new Node;
temp->data  = data;

temp->next = head->next;
head->next->front = temp;

temp->front = head;
head->next = temp;
}

void DuLinkList::Print()
{
for (Node *p=head->next; p->data != TAG; p=p->next)
{
cout<<p->data<<endl;
}
cout<<"-------"<<endl;
}

int DeleteSameNodes(DuLinkList *pHeadA, DuLinkList *pHeadB)
{
Node *pA ;
Node *pB ;

bool deleteFlag = false;
for (pA=pHeadA->head->next;pA->data != TAG; NULL)
{
for (pB=pHeadB->head->next;pB->data != TAG; NULL )
{
Node *q = pB->next;//先把下一个节点保存下来
if (pA->data == pB->data)
{
//delete the node from PB
pB->next->front = pB->front;
pB->front->next = pB->next;
delete pB;

deleteFlag = true;
}
pB = q;
}

if ( deleteFlag == true)//有删除
{
//删除A中跟该节点相同的其他节点
//e.g: 1-2-2-1-1
for (Node *p = pA->next;p->data != TAG;)
{
Node *tempSave = p->next;//
if (p->data == pA->data)
{
p->next->front = p->front;
p->front->next = p->next;
delete p;
}
p = tempSave;//后移一个节点
}

Node *tempNextNode = pA->next;

pA->next->front = pA->front;
pA->front->next = pA->next;
delete pA;//删除节点自身

pA = tempNextNode;//恢复PA身份

deleteFlag = false;//标志还原
}
else//没有删除
pA = pA->next;
}

return 0;
}

int main()
{
DuLinkList *pHeadA = new DuLinkList;
DuLinkList *pHeadB = new DuLinkList;
int data=0;
srand(time(0));

for (int i=0;i<5;i++)
{
data = rand() % 5;
//data = i+2;
pHeadA->InsertNode(data);
}

for (i=0;i<4;i++)
{
data = rand() % 6;
//data = 2;
pHeadB->InsertNode(data);
}

pHeadA->Print();
cout<<endl;
pHeadB->Print();

cout<<"after delete:"<<endl;
DeleteSameNodes(pHeadA,pHeadB);

pHeadA->Print();
cout<<endl;
pHeadB->Print();

delete pHeadA;
delete pHeadB;
return 0;
}


思路1的另一种写法。by SGZ

1)将两个链表连接成一个链表。

2)删除一个链表中的重复元素,注意界线和标记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delete struct null date qq
相关文章推荐