C++程序设计教程 第3版——习题九16、17题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、问题

请添加图片描述

二、代码

16

代码如下:

#include<iostream>
#include<iomanip>
using namespace std;
struct node
{
	int data;
	node *next;
};
node *insert(node *head,node *p)
{
	node *p1,*p2=NULL;
	if(head==NULL)
	{
		head=p;
		p->next=NULL;
		return(head);
	}
	p1=head;
	while((p->data)>(p1->data)&&p1->next!=NULL)
	{
		p2=p1;
		p1=p1->next;
	}
	if((p->data)<=(p1->data))
	{
		p->next=p1;
		if(head==p1) head=p;
		else p2->next=p;
	}
	else
	{
		p1->next=p;
		p->next=NULL;
	}
	return(head);
}
node *sort(node*head)
{
	node *p3;
	int a;
	cout<<"正在创建一条升序链表...\n";
	cout<<"请输入一个整数,以-1结束:";
	cin>>a;
	while(a!=-1)
	{
		p3=new node;
		p3->data=a;
		head=insert(head,p3);
		cout<<"请输入一个整数,以-1结束:";
		cin>>a;
	}
	return(head);
}
void print(const node*head)
{
	const node *p2;
	p2=head;
	cout<<"链表中各节点数据为:";
	while(p2!=NULL)
	{
		cout<<setw(4)<<(p2->data);
		p2=p2->next;
	}
	cout<<endl;
}
node *merge(node*a,node*b)
{
	node*c=NULL,*p1,*p2=NULL;
	while((a!=NULL)&&(b!=NULL))
	{
		p1=new node;
		if(c==NULL)
		{
			if(a->data<=b->data)
			{
				p1->data=a->data;
				c=p2=p1;
				a=a->next;
			}
			else
			{
				p1->data=b->data;
				c=p2=p1;
				b=b->next;
			}
		}
		else
		{
			if(a->data<=b->data)
			{
				p1->data=a->data;
				p2->next=p1;
			    p2=p1;
				a=a->next;
			}
			else
			{
				p1->data=b->data;
				p2->next=p1;
				p2=p1;
				b=b->next;
			}
		}
	}
	while(a==NULL&&b!=NULL)
	{
		p1=new node;
		p1->data=b->data;
		p2->next=p1;
		p2=p1;
		b=b->next;
	}
	while(b==NULL&&a!=NULL)
	{
		p1=new node;
		p1->data=a->data;
		p2->next=p1;
		p2=p1;
		a=a->next;
	}
	return(c);
}
int main()
{
	node*ah=NULL,*bh=NULL,*ch;
	ah=sort(ah);
	bh=sort(bh);
	print(ah);
	print(bh);
	ch=merge(ah,bh);
	print(ch);
	cout<<'\n';
	return 0;
}

17

代码如下:

#include<iostream>
#include<iomanip>
using namespace std;
struct node
{
	int data;
	node *next;
};
const node *search(const node*head,int x)
{
	const node*p;
	p=head;
	while(p!=NULL)
	{
		if(p->data==x)
			return p;
		p=p->next;
	}
	return NULL;
}
bool is_sub_set(node*L1,node*L2)
{
	for(;L1!=NULL;L1=L1->next) 
		if(search(L2,L1->data)==NULL) return false;
	return true;
}
node *create()
{
	node *p1,*p2=NULL,*head;
	int a;
	head=NULL;
	cout<<"正在创建一条无序列表...\n";
	cout<<"请输入一个正整数,以0结束:";
	cin>>a;
	while(a!=0)
	{
		p1=new node;
		p1->data=a;
		if(head==NULL)
			head=p2=p1;
		else
		{
			p2->next=p1;
			p2=p1;
		}
		cout<<"请输入一个正整数,以0结束:";
		cin>>a;
	}
	if(head!=NULL)
		p2->next=NULL;
	return(head);
}
int main()
{
	node*L1,*L2;
	L1=create();
	L2=create();
	if(is_sub_set(L1,L2)==false)
		cout<<"L1不是L2的子集"<<endl;
	else cout<<"L1是L2的子集"<<endl;
	return 0;
}



总结

如果这篇文章对你有帮助的话,可以点赞支持一下哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值