您的位置:首页 > 其它

线性表的顺序表示和实现基本操作之插入元素

2017-11-28 15:57 357 查看
//-------线性表的动态分配顺序存储结构------
#include<stdio.h>
#include<process.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
typedef int Status;
typedef int ElemType;
typedef struct//typedef的作用:指定新的类型名代替已有的类型名
{
ElemType *elem;//定义指向ElemType类型的指针,存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;//声明一个新类型名SqList,代表上边的结构体类型
Status InitList_Sq(SqList &L)//构造一个空的线性表L
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
//数组中第一个元素的地址为数组的地址
if(!L.elem) exit(OVERFLOW);//分配存储空间失败
L.length=0;//空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
return OK;
}
int Length(SqList &L)
{
return L.length;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e)//在顺序表L的第i个位置之前插入元素e
{
ElemType *newbase,*p,*q;
if(i<1||i>L.length+1) return ERROR;//判断i值是否合法
if(L.length>=L.listsize)//当前长度大于分配容量(当前空间已满),增加分配
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加分配存储容量
}
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
return OK;
}

Status ListDelete_Sq(SqList &L,int i,ElemType &e)//在顺序表中删除第i个元素,并用e返回其值
{
ElemType *p,*q;
if(i<1||i>L.length) return ERROR;
p=&(L.elem[i-1]);//指针p为第i个元素的地址
e=*p; //被删除元素的值赋给e
q=L.elem+L.length-1;//表尾元素的位置
for(++p;p<=q;++p)//被删除元素之后的元素前移
*(p-1)=*p;
--L.length;//表长减1
return OK;
}

int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
//寻找第一个与e满足compare()关系的元素的位序,没有则返回0
{
int i;
ElemType *p;
i=1;//i的处置为第一个元素的位序
p=L.elem;//p的处置为第一个元素的存储位置
while(i<=L.length&&!(*compare)(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
int main()
{
SqList L;
ElemType e,e1;
InitList_Sq(L);
for(int i=1;i<=6;i++)
{
scanf("%d",&e);
ListInsert_Sq(L,i,e);
}
printf("插入元素后表L为:");
for(int i=1;i<=L.length;i++)
printf("%d ",L.elem[i-1]);
printf("\n");

ListInsert_Sq(L,3,81);
printf("插入元素后表L为:");
for(int i=1;i<=L.length;i++)
prin
4000
tf("%d ",L.elem[i-1]);
printf("\n");

ListDelete_Sq(L,1,e);
//printf("%d\n",e);
printf("删除元素后表L为:");
for(int i=1;i<=L.length;i++)
printf("%d ",L.elem[i-1]);
printf("%d\n",e);
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐