顺序线性表的初始化,插入,删除,查找以及合并操作(伪代码)

顺序线性表的相关操作

1.线性表的初始化操作(即构造空线性表):initlist_sq(sqlist &l)

     就是为顺序表分配一个预定义大小的数组空间,并将线性表长度设为0;其中定义的listsize为当前分配的存储容量,随着元素的增加其存储容量也要增加。因此为其增加了一个存储 LISTINCREMENT个数据元素的空间 。

2. 线性表的插入操作 :在顺序线性表l的第i个位置前插入元素e  。listinsert(sqlist &l,int i ,elmetype e)

    第一步判断插入位置是否合法,如果不合法则异常退出。第二步判断线性表存储空间是否不足,如果不足则增加存储容量。第三步将插入位置及之后元素后移。第四步将待插入元素插入。


 3.线性表的删除操作。从顺序线性表l中删除第i个元素,并用e返回其值  。
listdelete(sqlist &l,int i,elmetype *e )

    第一步判断删除位置是否合法,如果不合法则异常退出。第二步将待删除位置元素的值赋于e。第三步将被删除之后的元素左移 。

 

4.线性表的查找操作。线性表l查找第一个与元素e满足compare()元素的位置。若在,返回其在l中的次序。若不存在则返回0 。

int locateelem_sq(sqlist *l,elemtype e,status (*compare)(elemtype, elemtype))

    第一步设i=1,从线性表第一个位置开始查找。第二步进入循环,判断当前位置的值是否与e相等,并且是否循环到列表最后一个元素。如果未循环到尾部并且值还不相等,则继续循环,寻找符合条件元素的位置。第三步判断,如果当前位置不在线性表尾部,则说明已找到符合的i值。若在性表尾部,则说明循环到最后一个元素也为找到符合元素。返回0;

5.线性表的合并操作。已知la,lb中元素按非递减排列,归并la和lb的元素放入lc中,其也按非递减排列。

void mergelist_sq(sqlist la,sqlist lb,sqlist *lc)

第一步为lc分配空间。第二步进入while循环,如果两个都未循环到表尾,则比较相应位置元素,把较小的元素放入lc中,并且将lc和较小元素的线性表当前位置向后移动一个。直到一个线性表循环完成后,退出此循环。第三步将剩余那个列表中的剩余元素插入lc中。

//线性表的动态分配顺序存储结构 
#define LIST_INIT_SIZE 100	//线性表存储空间的初始分配量 
#define LISTINCREMENT 10	//线性表存储空间的分配增量 
typedef struct 
{
	elemtype *elem;			//存储空间基址 
	int length;				//当前长度 
	int listsize;			//当前分配的存储容量 
 } sqlist;
 
 //构造空线性表l 
 status initlist_sq(sqlist &l)
 {
 	l.elem=(elemtype *)malloc(LIST_INIT_SIZE*sizeof(elemtype));
 	if(!l.elem)
 		exit(1);            //分配失败 ,1为异常退出 
	 l.length=0;
	 l.listsize= LIST_INIT_SIZE;
	 return 0;
 }
 //线性表的初始化操作就是为顺序表分配一个预定义大小的数组空间,并将线性表长度设为0;
 //listsize为当前分配的存储容量,随着元素的增加其存储容量也要增加。因此为其增加了一个存储 LISTINCREMENT个数据元素的空间 
 
 //插入操作。在顺序线性表l的第i个位置前插入元素e
 status listinsert(sqlist &l,int i ,elmetype e)
 {
 	if(i<1||i>l.length+1)
 	 return 0;		        //i值不合法 
 	if(l.length>=l.listsize)//当前存储位置已满,增加分配
	 {
	 	newbase=(elmetype *)realloc(l.elem,(listsize+LISTINCREMENT)*sizeof(elemtype));
	 	if(!newbase)        //存储分配失败 
	 		exit(1);
	 	l.listsize+= LISTINCREMENT;//增加存储容量 
	 } 
	 int *q,*p;
	  q=&(l.elem[i-1]);    //q为插入地址
	  for(p=&(l.elem[l.listsize-1]);p>=q;p--)//插入位置及之后的元素后移一个位置 
	  	*(p+1)=*p;
	
	 *q=e;                //插入e
	 l.length++;//表长增加1 
	 return 0; 
  } 

//删除操作。从顺序线性表l中删除第i个元素,并用e返回其值  
 status listdelete(sqlist &l,int i,elmetype *e )
 {
 	if(i<1||i>l.length+1)
 	 return 0;		    //i值不合法 
	 int *q,*p;
	p=&(l.elem[i-1]);   //q为删除元素地址
	e=*p; 
	q=l.elem+l.length-1; //表尾元素位置 
	for(p++;p<=q;p++)    //被删除之后的元素左移  注意初始值为p++ 
		*(p-1)=*p;
	
	 l.length--;        //表长减1 
	 return 0; 
  } 
 
//查找操作 
int locateelem_sq(sqlist l,elemtype e,status (*compare)(elemtype, elemtype))
 {
	 //在顺序线性表l中查找第一个与元素e满足compare()元素的位置(即返回第一个与e值相等的元素位置)。
	//若存在,返回其在l中的次序。若不存在则返回0 
 	 int compare(elemtype e1, elemtype e2)
		{
		  if (e1==e2) 
			return 1;
		  else 
		  	if (e1 > e2) return 0;
		  	else  return -1;
		} 
	
 	int i,*p;
	i=1;
	p=l.elem;//p为第一个元素的存储位置 
	while(i<=l.length&&!(*compare)(*p++,e))
		i++;
	if(i<=l.length)
		return i;
	else return 0;
	 
 }
 
 //合并操作 
 void mergelist_sq(sqlist la,sqlist lb,sqlist *lc)
 {
 	//已知la,lb中元素按非递减排列
	 //归并la和lb的元素也按非递减排列
	 pa=la.elem;
	 pb=lb.elem;
	 lc.listsize=la.listsize+lb.listsize;
	 pc=lc.elem= (elemtype *)malloc(lc.listsize*sizeof(elemtype));
	 if(!lc.elem)
	 	exit(1);//存储分配失败
	 pa_last=la.elem+la.length-1;
	 pb_last=lb.elem+lb.length-1;
	while(pa<=pa_last&&pb<=pb_last)//归并 
	{
		if(*pa<=*pb)
			*pc++=*pa++;
		else *pc++=*pb++;
	}
	while(pa<=pa_last)//插入la剩余元素 
		*pc++=*pa++;
 	while(pb<=pb_last)//插入lb剩余元素 
		*pc++=*pb++;
  } 
 
 
 
 
 
 
  • 7
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值