线性表之顺序表的创建、初始化、查找、删除、插入和合并

本文参考国家精品课程耿国华的数据结构写的,发现了书上的一些问题,并做了简单修正,补足了整个程序过程,若有不足,请跟帖指正!!!


#include<iostream>
#include<cstdio>
using namespace std;
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct
{
	ElemType *elem;
	int last;
}SqList;
int  Locate(SqList *L, ElemType e)
{
	int i=0;        /*i为扫描计数器,初值为0,即从第一个元素开始比较*/
	while ((i<=L->last)&&(L->elem[i]!=e))/*顺序扫描表,直到找到值为e的元素, 或扫描到表尾而没找到*/
		i++;
	if  (i<=L->last)
		return(i+1);  /*若找到值为e的元素,则返回其序号*/
	else
		return(-1);  /*若没找到,则返回空序号*/
}
/*在顺序表L中第i个数据元素之前插入一个元素e。 插入前表长n=L->last+1,
i的合法取值范围是 1≤i≤L->last+2  */
int  InsList(SqList *L,int i,ElemType e)
{
	int k;
	if((i<1) || (i>L->last+2)) /*首先判断插入位置是否合法*/
	{
		printf("插入位置i值不合法");
		return(ERROR);
	}
	if(L->last>= MAXSIZE-1)
	{
		printf("表已满无法插入");
		return(ERROR);
	}
	for(k=L->last;k>=i-1;k--)   /*为插入元素而移动位置*/
		L->elem[k+1]=L->elem[k];
	L->elem[i-1]=e;   /*在C语言数组中,第i个元素的下标为i-1*/
	L->last++;
	return(OK);
}
int  DelList(SqList *L,int i)
/*在顺序表L中删除第i个数据元素。i的合法取值为1≤i≤L.last+1 */
{
	int k;
	if((i<1)||(i>L->last+1))
	{
		printf("删除位置不合法!");
		return(ERROR);
	}
	for(k=i; k<=L->last; k++)
		L->elem[k-1] = L->elem[k];  /*将后面的元素依次前移*/
	
	L->last--;
	return(OK);
}
void print(SqList *L)
{
	int i;
	for(i=0;i<=L->last;i++)
		cout<<L->elem[i]<<"  ";
	cout<<endl;
}
void Init(SqList *L)
{
	L->elem=new ElemType[MAXSIZE];
	if(! L->elem) {  
		exit(0);  
	}  
	int n,i=0;
	cout<<"请输入顺序表元素个数"<<endl;
	cin>>n;
	while(i<n)
	{
		cin>>L->elem[i++];
	}
	L->last=i-1;
}
void merge(SqList *LA,  SqList *LB,  SqList *LC)
{
	int i,j,k;
	i=0;j=0;k=0;
	while(i<=LA->last&&j<=LB->last)
		if(LA->elem[i]<=LB->elem[j])
		{
			LC->elem[k]= LA->elem[i];
			i++; 
			k++;
		}
		else
		{
			LC->elem[k]=LB->elem[j];
			j++; 
			k++;
		}
		while(i<=LA->last)	/*当表LA有剩余元素时,则将表LA余下的元素赋给表LC*/
		{
			LC->elem[k]= LA->elem[i];
			i++; 
			k++;
		}
		while(j<=LB->last)  /*当表LB有剩余元素时,则将表LB余下的元素赋给表LC*/	
		{
			LC->elem[k]= LB->elem[j];
			j++; 
			k++;
		}
		LC->last=LA->last+LB->last+1;
		print(LC);
}
int main()
{
	SqList L,L1,L2;
	ElemType e;
	int i,t;
	cout<<"顺序表操作顺序:(1.初始化2.查找3.插入4.删除)"<<endl;
	
	Init(&L);
	
	print(&L);
	/*	cout<<"请输入要查找顺序表元素"<<endl;
	cin>>e;
	t=Locate(&L,e);
	if(t)
	cout<<"第"<<t<<"个!"<<endl;
	else
	cout<<"没有找到!"<<endl;
	
	  cout<<"请输入要插入的顺序表元素和位置"<<endl;
	  cin>>e>>i;
	  t=InsList(&L,i,e);
	  if(t)
	  {
	  cout<<"插入后的顺序表为"<<endl;
	  print(&L);
	  }
	  else
	cout<<"插入失败!"<<endl;*/
	cout<<"请输入要删除的顺序表元素位置"<<endl;
	cin>>i;
	t=DelList(&L,i);
	if(t)
	{
		cout<<"删除后的顺序表为"<<endl;
		print(&L);
	}
	else
		cout<<"删除失败!"<<endl;
	cout<<"对L1、L2进行初始化操作:"<<endl;
	Init(&L1);
	Init(&L2);
	cout<<"L1,L2,L合并后为:"<<endl;
	merge(&L1,&L2,&L);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值