day 7

C++ 线性表

1.设A、B均为用数组实现的List类型的有序顺序表,试设计一个函数Alternate,从A、B读取值,构件数组C,使得C的值也有序。
要求:用不同的方式实现(至少两种)

#include<iostream>
#include<malloc.h> // malloc()
#include<process.h> //exit() 
using namespace std;
const int LIST_INIT_SIZE = 100;
struct SqList{
	int *elem;
	int length;
	int listsize;
};
//初始化线性表,构造一个空表 
void InitList(SqList &L);
//清空线性表 
void ClearList(SqList &L);
//返回线性表数据元素的个数 
int ListLength(SqList L);
//获取线性表第i个位置上的数据
void GetElem(SqList L,int i,int &e);
//将空表的前n项填上数字
void Add_num_to_List(SqList &L,int num);
//插入操作 
void  ListInsert(SqList &L,int i,int e);
//合并到表C 法1 
void  Alternate_1(SqList L_A,SqList L_B,SqList &L_C);
//合并到表C法2
void Alternate_2(SqList L_A,SqList L_B,SqList &L_C);
//打印出线性表内容
void PrintList(SqList L); 
int main()
{
	SqList L_A,L_B,L_C;
	InitList(L_A);
	InitList(L_B);
	InitList(L_C);
	Add_num_to_List(L_A,5);
	Add_num_to_List(L_B,6);
	PrintList(L_A);
	PrintList(L_B);
	Alternate_1(L_A,L_B,L_C);
	PrintList(L_C);
	ClearList(L_C);
	Alternate_2(L_A,L_B,L_C);
	PrintList(L_C);	 	
}


//初始化线性表,构造一个空表 
void InitList(SqList &L)
{
	//分配空间 
	//L.elem = new int[LIST_INIT_SIZE];
	L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!L.elem)
	{
		cout<<"内存空间分配失败!"<<endl;
		exit(0);
	}
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;	
}

//清空线性表 
void ClearList(SqList &L)
{
	for(int i =1;i <= L.length;i++)
	{
		L.elem[i-1] = 0;
	}
	L.length = 0;
	//cout<<"清空线性表成功!"<<endl;
}

//返回线性表数据元素的个数 
int ListLength(SqList L)
{
	return L.length;
}

//获取线性表第i个位置上的数据
void GetElem(SqList L,int i,int &e)
{
	for(int j = 1;j <= L.length;j++)
	{
		if(j == i)
		{
			e = L.elem[j-1];
			break;
		}
	}
	
}


//将空表的前n项填上数字
void Add_num_to_List(SqList &L,int num)
{
	L.length = num;
	for(int i = 1;i <= L.length;i++)
	{
		cin>>L.elem[i-1];
	}
} 
 
//拓展空间操作
bool ExpandList(SqList &L,int num)
{
	int *p=L.elem;
	//拓展新的大小 
	//L.elem = new int[L.length+num]; 
	L.elem = (int *)malloc((L.length+num)*sizeof(int));
	if(!L.elem)
	{
		return false;
		exit(0);
	}
	else
	{
		for(int i =1;i <=L.length;i++)
		{
			//将原有的数据元素搬入新开辟的内存空间中 
			L.elem[i-1] = p[i-1];
		}
		L.length = L.length + num;
		L.listsize = LIST_INIT_SIZE + num; 
		free(p);//将旧的空间释放 
		//delete [] p;
		return true;
	}	
}

//插入操作 
void ListInsert(SqList &L,int i,int e)
{
	if(i<1||i>L.length+1)
	{
	//	cout<<"超出可插入的线性表范围,请重新输入插入的位序!"<<endl;
	//	return false;
		exit(0);
	}
	if(L.length >= LIST_INIT_SIZE)
	{
		bool flag = ExpandList(L,(L.length-LIST_INIT_SIZE));
		if(flag == true)
		{
			for(int j = L.length;j >= i;j--)
			{
				L.elem[j]=L.elem[j-1];
			}
			L.elem[i-1] = e;
			L.length++;
		//	return true;
		}
		else
		{
		//	cout<<"线性表空间已满且未成功分配空间!";
		//	return false;
			 exit(0);
		}
	}
	else
	{
		for(int j = L.length;j >=i;j--)
		{
			L.elem[j]=L.elem[j-1];
		}
		L.elem[i-1] = e;
		L.length++;
	//	return true;
	}
}

//打印线性表
void PrintList(SqList L)
{
	for(int i = 1;i <=L.length; i++)
	{
		cout<<L.elem[i-1]<<" ";
	}
	cout<<endl;
 }
 
//合并到表C 法1 升序输入到c中 
void  Alternate_1(SqList L_A,SqList L_B,SqList &L_C)
{
	int a,b;
	int i,j,k;
	i = j = k =1;
	int L_A_len = ListLength(L_A);
	int L_B_len = ListLength(L_B);
	int a_e,b_e;
	while((i <= L_A_len)&&(j <= L_B_len))
	{
		GetElem(L_A,i,a_e);
		GetElem(L_B,j,b_e);
		if(a_e <= b_e)
		{
			ListInsert(L_C,k,a_e);
			k++;
			i++;
		} 
		else
		{
			ListInsert(L_C,k,b_e);
			k++;
			j++;
		}	
	}
	while( i <= L_A_len)
	{
		GetElem(L_A,i,a_e);
		ListInsert(L_C,k,a_e);
			k++;
			i++;
	}
	while(j <= L_B_len)
	{
		GetElem(L_B,j,b_e);
		ListInsert(L_C,k,b_e);
			k++;
			j++;
	}
	
}
//合并到表C法2
void Alternate_2(SqList L_A,SqList L_B,SqList &L_C)
{
	int j,temp;
	int k = 1;
	for(int i = 1;i <= L_A.length;i++)
	{
		ListInsert(L_C,k,L_A.elem[i-1]);
		k++;
	}
	for(int i = 1;i <= L_B.length;i++)
	{
		ListInsert(L_C,k,L_B.elem[i-1]);
		k++;
	}
	for(int i = 1;i < L_C.length-1;i++)
	{
		temp = L_C.elem[i];//要插入的数
		j = i-1;
		while(j >= 0&&L_C.elem[j]>temp)
		{
			L_C.elem[j+1] = L_C.elem[j];
			j--;
		} 
		L_C.elem[j+1] = temp;	 
	}
	
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值