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]);含义相同
运行结果: