数据结构假设分别以两个元素的值递增有序线性表a,b表示两个集合,现在要构成一个新的线性表c,c表示a b的交
// 将合并逆置后的结果放在C表中,并删除B表
Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C)
{
LinkList pa,pb,qa,qb;
pa=A;
pb=B;
qa=pa;// 保存pa的前驱指针
qb=pb;// 保存pb的前驱指针
pa=pa->next;
pb=pb->next;
A->next=NULL;
C=A;
while(pa&&pb){
if(pa->datadata){
qa=pa;
pa=pa->next;
qa->next=A->next;//将当前最小结点插入A表表头
A->next=qa;
}
else{
qb=pb;
pb=pb->next;
qb->next=A->next;//将当前最小结点插入A表表头
A->next=qb;
}
}
while(pa){
qa=pa;
pa=pa->next;
qa->next=A->next;
A->next=qa;
}
while(pb){
qb=pb;
pb=pb->next;
qb->next=A->next;
A->next=qb;
}
pb=B;
free(pb);
return OK;
}
#include"stdio.h"
#include"malloc.h"
struct list
{
int data;
struct list *next;
};
struct list *head1,*head2,*p1,*p2,*q1,*q2;
void main()
{
int n=0;
void unionlist();
p1=q1=(struct list*)malloc(sizeof(struct list));
printf("请输入第一个链表的信息
");
scanf("%d",&p1->data);
while(p1->data!=0)
{
n=n+1;
if(n==1)
head1=q1;
else
q1->next=p1;
q1=p1;
p1=(struct list*)malloc(sizeof(struct list));
scanf("%d",&p1->data);
}
q1->next=NULL;
n=0;
p2=q2=(struct list*)malloc(sizeof(struct list));
printf("请输入第二个链表的信息
");
scanf("%d",&p2->data);
while(p2->data!=0)
{
n=n+1;
if(n==1)
head2=q2;
else
q2->next=p2;
q2=p2;
p2=(struct list*)malloc(sizeof(struct list));
scanf("%d",&p2->data);
}
q2->next=NULL;
unionlist();
}
void unionlist()
{
struct list *head,*p;
int i=0;
p1=head1;
p2=head2;
head=p=(struct list*)malloc(sizeof(struct list));
p->data=0;
while(p1 && p2)
{
if(p1->datadata)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
p->next=p1?p1:p2;
p=head;
printf("合并后的链表为如下:
");
while(p)
{
i=i+1;
if(i==1)
p=p->next;
printf("%3d",p->data);
p=p->next;
}
printf("
");
free(head1);
free(head2);
}
using namespace std;
struct Node
{
int data;
Node *next;
};
class LinkList
{
public:
Node * intLinkList(int a[],int n)
{
first=new Node;
first->next=NULL;
for(int i=(n-1);i>=0;i--)
{
Node *s;
s=new Node;
s->data=a[i];
s->next=first->next;
first->next=s;
}
return first;
}
void PrintList()
{
Node *p;
p=first->next;
while(p)
{
cout<<p->data<<"\t";
p=p->next;
}
}
private:
Node *first;
};
void Interest(Node *A, Node *B)
{
Node *p, *q;
p=A->next; q=B->next;
while(p && q)
{
if(p->data<q->data)
{
A->next=p->next;
p=p->next;
}
else if(p->data>q->data) q=q->next;
else{
p=p->next;
q=q->next;
}
}
}
void Bingji(Node *A, Node *B)
{
Node *p, *q,*r;
p=A->next; q=B->next;
while(p&&q)
{
if(p->data<q->data){ r=p; p=p->next;}
else if(p->data>q->data)
{
B->next=q->next;
q->next=p;
r->next=q;
q=B;
}
else if(p->data=q->data){
r=p;
p=p->next;
q=q->next;
}
}
r->next=q;
}
void Chaji(Node *A, Node *B)
{
Node *p, *q;
p=A->next; q=B->next;
while(p &&q)
{
Node *r;
if(p->data<q->data)
{
r=p;
p=p->next;
}
else if(p->data>q->data) q=q->next;
else{
Node *s;
s=p;
r->next=p->next;
p=r->next;
delete s;
}
}
}
void main()
{
cout<<"************两个集合的 交,并,差 运算**************"<<endl;
int A1[]={ 1,2,3,4,5,6};
int B1[]={ 3,4,5,6,7,8};
int A2[]={ 1,2,3,4,5,6};
int B2[]={ 3,4,5,6,7,8};
int A3[]={ 1,2,3,4,5,6};
int B3[]={ 3,4,5,6,7,8};
LinkList L1; LinkList P1;
LinkList L2; LinkList P2;
LinkList L3; LinkList P3;
Node *Head1=L1.intLinkList(A1 ,6);
Node *Head12=P1.intLinkList(B1 ,6);
Node *Head2=L2.intLinkList(A2 ,6);
Node *Head22=P2.intLinkList(B2 ,6);
Node *Head3=L3.intLinkList(A3 ,6);
Node *Head32=P3.intLinkList(B3 ,6);
Interest(Head1,Head12);
cout<<"两个集合的交集是:";
L1.PrintList();
cout<<endl<<"****************************"<<endl;
Bingji(Head2,Head22);
cout<<"两个集合的并集是:";
L2.PrintList();
cout<<endl<<"****************************"<<endl;
Chaji(Head3,Head32);
cout<<"两个集合的差集是:";
L3.PrintList();
cout<<endl<<"****************************"<<endl;
}
勤快点吧,用归并算法。。。不是很难,不会了再回我
sd
答:循环链表按值递增??我想知道你的链表尾部最后会链接到头部去。。怎么递增?。。蛇吞尾吗?
答:node));head->next=NULL;}void input(list &h){list p,q;q=h;printf("输入数据的个数 n : ");int n;scanf("%d",&n);printf("请输入 %d 个有序递增数据:\n",n);for (int i=0;i<n;i++){//printf("第 %d 个: ",i+1);p=(list)malloc(sizeof(node));scanf("%d",...
答:sqlist union(sqlist sa,sqlist sb){int sc[maxsize];sa.length=length(sa);sb.length=length(sb);maxsize=sa.length+sb.length;i=0;while(i<sa.length&&i<sb.length){j=0;if(sa[i]<=sb[i]) {sc[j]=sa[i];j++} i++;} while(i<sa.length&&i<sb.length){sc[j]=sa[...
答:其它定义 1.Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实 例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。2.Clifford A.Shaffer在《数据...
答://函数说明://先输入n,表示首先建立一个链表的元素个数//然后输入n个元素,建立有序链表//再输入要插入的元素,调用函数插入//输出最终链表#include <stdio.h>#include <stdlib.h>struct node{ int data; struct node *next;};void insert(struct node *head,int x)//链表的插入函数...
答:数据结构问题:给定一组数据{6,2,7,10,3,12}以它构造一棵哈夫曼树,则树高为5,带权路径96。
答:选数组成两道加法算式和两道减法算式:8+14=22、14+8=22、22-14=8、22-8=14。1.数组的基本概念及存储方式 数组是一种线性数据结构,由一系列相同类型的元素组成。数组中的元素按照顺序存储在连续的内存空间中。每个元素可以通过数组的下标来访问,下标从0开始递增。使用数组可以方便地存储和访问多个...
答:元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:双指针解法: 当 nums[j] 与给定的值相等时,递增 j 以跳过该元素。只要 nums[j] != val,我们就复制 nums[j] 到 nums[i] 并同时递增两个索引。重复这一过程,直到 j 到达数组的末尾,该数组的新长度为 i。给定一...
答:常用运算方法:1、检索。检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。2、插入。往数据结构中增加新的节点。3、删除。把指定的结点从数据结构中去掉。4、更新。改变指定节点的一个或多个字段的值。5、排序。把节点按某种指定的顺序重新排列。例如递...
答:非递减有序排列 其实就是递增的序列,只过允许有重复的元素,单调递增不允许有重复的元素