void difference(node** LA , node* LB)
2013-12-19 10:38
225 查看
9月9日,迅雷2014校招笔试编程题:
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
链表结点的结构类型定义如下:
struct node
{
int elem;
node* next;
};
请完成函数void difference(node** LA , node* LB)
点评:参考答案或更多题目请参见:/article/1385382.html。
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
链表结点的结构类型定义如下:
struct node
{
int elem;
node* next;
};
请完成函数void difference(node** LA , node* LB)
点评:参考答案或更多题目请参见:/article/1385382.html。
#include<iostream> using namespace std; struct node { int elem; node* next; }; /*void difference(node* LA , node* LB) { node *tempA, *tempB, *preA, *preB; tempA = LA; tempB = LB; while(LA->elem == LB->elem && LA != NULL && LB != NULL) { tempA = LA; LA = LA->next; LB = LB->next; delete tempA; } preA = LA; preB = LB; if(LA != NULL) tempA = LA->next; if(LB != NULL) tempB = LB->next; while(tempA != NULL && tempB != NULL) { if(tempA->elem > tempB->elem) { tempB = tempB->next; } else if(tempA->elem < tempB->elem) { tempA = tempA->next; } } };*/ void difference(node** LA , node* LB) { node *pa, *pb, *pre, *q; pre = NULL; pa = *LA; while(pa) { pb = LB; while(pb->elem != pa->elem) { pb = pb->next; if(pb == NULL)//此处不能省略,若pb为空时, break; } if(pb == NULL)//LB链不含LA当前节点 { if(pre == NULL)//可修改为:if(!pre) { *LA = pa; pre = pa; pa = pa->next; } else { pre = pa; pa = pa->next; } } else//LB链含LA当前节点 { if(pre == NULL) { q = pa; pa = pa->next; delete q; *LA = pa; } else { q = pa; pa = pa->next; pre->next = pa; delete q; } } } } /* void difference(node** LA , node* LB) { node *pa , *pb , *pre , *q; pre = NULL; pa = *LA; //1 while(pa) { pb = LB; while(pb && pa->elem != pb->elem) //2 pb = pb->next; if(pb != NULL) //3 { if(!pre) *LA = pa->next; //4 else pre->next = pa->next; //5 q = pa; pa = pa->next; free(q); } else { pre = pa; //6 pa = pa->next; } } } */ int main() { int A[6] = {5,10,20,15,25,30}; int B[4] = {5,15,35,25}; node* LA = new node; LA = NULL; node* LB = new node; LB = NULL; for(int i=5;i>=0;i--) { node *temp = new node; temp->elem = A[i]; temp->next = LA; LA = temp; } for(int i=3;i>=0;i--) { node *temp = new node; temp->elem = B[i]; temp->next = LB; LB = temp; } difference(&LA, LB); while(LA != NULL) { cout<<LA->elem<<" "; LA = LA->next; } return 0; }
相关文章推荐
- 从la中删除字第i个元素起共len个元素后,将他们插入到表lb中第j个元素之前
- 删除Lb重复的数,用La输出(顺序表)
- 把元素递增的线性表La和Lb合并为Lc,且Lc的中的元素递减排列,使用原空间
- function [eigf,eigv,dof]=laplaceeig(node,elem,problem)
- 数据结构----实现对2个链表La,Lb有序合并,对相同的元素进行删除,
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- LB和LA
- 2.16-从la中删除从i开始len个元素后,把删除的元素放到lb中的j位之前
- 数据结构中La表的数据合并到Lb表中
- java编程实现将两个有序单链表LA,LB合并成新的LA
- 已知头指针分别为la和lb的有序单链表,其数据元素都是按值非递减排列。现要归并la和lb得到单链表lc,使得lc中的元素按值非递减排列。
- 单链表应用——La∪Lb或La∩Lb
- 实现La和Lb的交集、并集、差集,并把结果存入Lc中(数据结构)
- 线性表LA和LB非递减有序排列,将LA,LB进行归并为新的线性表LC,要求LC中的数据元素扔非递减有序列排列
- 将La和Lb合并为一个新的线性表Lc的几种结构的归纳
- La_Lb_Lc
- 假设利用两个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的 集合A=AUB。这就要求对线性表作如下操作:扩大线性表La,将存在于线性表Lb中而不存在于线
- 数据结构中La表的数据合并到Lb表中
- 数据结构之表中在Lb中但不在La中的元素插入到La中
- 用顺序表求lc=la-lb