数据结构作业

一、第二章课后作业

1、将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间。表中不允许有重复的数据。

3、已知两个链表A和B分别表示两个集合,其元素递增排列。请设计一个算法,用于求出A和B的交集,并存放在A链表中。

6、设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点。

7、设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表中的存储空间,换句话说,要求算法的空间复杂度为O(1)。

8、设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同)。

10、已知长度为n的线性表A采用顺序存储结构,请写一个时间复杂度为O(1)的算法,该算法可删除线性表中所有值为item的数据元素。

二、课上作业

1、单链表的逆置

void inverse(LinkList &L)
//逆置带头结点的单链表L 
{
	p=L->next;
	L->next=NULL;
	while(p)
	{
		q=p->next;//q指向*p的后继
		p->next=L->nextt
		L->next=p;//*p插在头结点后
		p=q; 
	}
}

2、链表实现两个一元多项式的相加

#include<iostream>
using namespace std;

typedef struct Term
{
	float coef;   //系数
	int exp;      //指数
} Term;

typedef struct Lnode
{
	Term data;
	struct Lnode *next;
} Lnode, *LinkList;

void CreateList(LinkList &L, int n)    //按照指数从小到大的方式创建链表存储
{
	L = new Lnode;
	L->next = NULL;
	while(n--)
	{
		Lnode *r = L;
		Lnode *p = new Lnode;
		cin >> p->data.coef >> p->data.exp;
		if(!p->data.coef) //系数为零直接跳过
			continue;
		while(r->next != NULL && r->data.exp < p->data.exp)
		{
			r = r->next;
		}
		p->next = r->next;
		r->next = p;
	}
}

void PrintList(LinkList &L)
{
	if(!L->next)
	{
		cout << "0" << endl;
		return;
	}
	Lnode *p = L->next;
	while (p != NULL)
	{
		cout << p->data.coef << "X^" << p->data.exp;
		p = p->next;
		if(p != NULL)
		{
			cout << " + ";
		}
	}
	cout << endl;
}

LinkList AddList(LinkList &L1, LinkList &L2)
{
	LinkList s = new Lnode;
	s->next = NULL;
	L1 = L1->next;
	L2 = L2->next;
	Lnode * r = s;
	while(L1 != NULL && L2 != NULL)
	{
		if(L1->data.exp < L2->data.exp)
		{
			r->data.coef = L1->data.coef;
			r->data.exp = L1->data.exp;
			r->next = L1;
			r = r-> next;
			L1 = L1->next;
		}
		else if(L1->data.exp > L2->data.exp)
		{
			r->data.coef = L2->data.coef;
			r->data.exp = L2->data.exp;
			r->next = L2;
			r = r-> next;
			L2 = L2->next;
		}
		else
		{
			L1->data.coef += L2->data.coef;
			if(L1->data.coef)
			{
				r->next = L1;
				r = r-> next;
			}
			L1 = L1->next;
			L2 = L2->next;
		}
	}
	if(L1 != NULL)
		r->next = L1;
	else
		r->next = L2;
	return s;
}

int main()
{
	LinkList L1, L2, s;
	int m, n;
	cout << "请依次输入第一个和第二个多项式的项数:" << endl;
	cin >> m >> n;
	cout << "请输入第一个多项式各项的系数和指数:" << endl;
	CreateList(L1, m);
	PrintList(L1);
	cout << "请输入第二个多项式各项的系数和指数:" << endl;
	CreateList(L2, n);
	PrintList(L2);
	s = AddList(L1, L2);
	PrintList(s);
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值