顺序线性表的插入,删除操作

1..插入 :在顺序线性表l的第i个位置前插入元素e  。

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


 2..删除:从顺序线性表l中删除第i个元素,并用e返回其值  。

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

 代码实现:

//插入,删除操作
#include<stdio.h>
#include <stdlib.h> //定义杂项函数及内存分配函数
#include<iostream>
using namespace std;
typedef int elemtype;//将int起别名为 elemtype


//线性表的动态分配顺序存储结构 
#define LIST_INIT_SIZE 100	//线性表存储空间的初始分配量 
#define LISTINCREMENT 2	//线性表存储空间的分配增量 
typedef struct 
{
elemtype *elem;	//存储空间基址 
int length;	//当前长度 
int listsize;	//当前分配的存储容量 
 } sqlist;
 
 //插入操作 
elemtype listinsert(sqlist &l,int i ,elemtype &e)
 {
 	if(i<1||i>l.length+1)
 	 return 1;	//i值不合法
 	if(l.length>=l.listsize)//当前存储位置已满,增加分配
	 {elemtype *newbase;
	 	newbase=(elemtype *)malloc((l.listsize+LISTINCREMENT)*sizeof(elemtype));
	 	if(!newbase)//存储分配失败 
	 	{
	 		cout<<"存储分配失败";
	 		exit(1);//存储分配失败 ,1为异常退出
	 	}  
	 	for(int j = 0 ; j < l.length ; j++)
			newbase[j] = l.elem[j];//给各元素赋值 
	 	l.elem=newbase;//首地址赋值 
	 	l.listsize+= LISTINCREMENT;//增加存储容量,为一个elemtype型元素所占内存 
	 } 
 //newbase=(elemtype *)realloc(l.elem,((l.listsize+LISTINCREMENT)*sizeof(elemtype)));
 
 elemtype *q,*p;
  q = &(l.elem[i-1]);//q为插入地址
  for(p=&(l.elem[l.length-1]);p>=q;p--)//插入位置及之后的元素后移一个位置 
  	*(p+1)=*p;

	 *q=e;//插入e
	 l.length++;//表长增加1 
	 cout<<"插入元素后:"; 
	 for(int i = 0 ; i < l.length ; i++)
  	cout<<l.elem[i]<<" ";
  	cout<<endl; 
	 return 0; 
  }   
  
  //删除操作。从顺序线性表l中删除第i个元素,并用e返回其值  
elemtype  listdelete(sqlist &l,int i,elemtype *e)
 {
 	if(i<1||i>l.length+1)
 	 return 1;	//i值不合法  
 	 int *p,*q; 
	p=&(l.elem[i]);//p为删除元素地址
	e=p; 
	cout<<"被删除值的值为:"<<*e<<endl; 
	q=l.elem+l.length-1;//表尾元素位置 

	for(p++;p<=q;p++)//被删除之后的元素左移   注意初始值为p++ 
	*(p-1)=*p;

	 l.length--;//表长减1 
	 cout<<"删除元素后:"; 
	for(int i=0;i<l.length;i++)
	  	cout<<l.elem[i]<<" ";
	  	cout<<endl;
	  return 0; 
  } 
  
  
int main()
{
  	sqlist l;
  	elemtype b[]={1,4,5,6};
  	l.elem=b;
 	l.length=sizeof(b)/sizeof(elemtype); 
  	l.listsize=sizeof(elemtype)*l.listsize;
  	elemtype e,d;
  	e = 9;//待插入元素的值 
  	cout<<"原序列:" ;
  	for(int i=0;i<l.length;i++)
  		cout<<l.elem[i]<<" ";
  		cout<<endl;
	listinsert(l,2,e);   
  	
  	listdelete(l,3,&d);
} 
//int *p;
//p=&(l.elem[i]);
//
//与int *p=&(l.elem[i]);含义相同 
  	

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_40243295/article/details/81811516
今日推荐