数据结构4:线性表中的10个扩展函数

来源:互联网 发布:sql万能钥匙 编辑:程序博客网 时间:2024/05/16 07:32

//201482110:08:44

//功能:10个顺序存储结构的线性表的常用操作函数

//author:BGY

1.l中按照非降的顺序插入新的数据元素el的长度加上

void insertascend(sqlist &l,elemtype e) {     elemtype *newbase ,*p;     int k;     if(l.length>=l.listsize)//当前的存储空间已经满了,需要增加分配     {        if(!(newbase=(elemtype *)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(elemtype))))          exit(overflow);        l.elem=newbase;        l.listsize+=LISTINCREMENT;      }      p=l.elem;     for(k=1;k<=l.length;k++)     {      if(e>*p)      p++;      else break;     }     listinsert(l,k,e);} 

2.在l中按照非升的顺序插入新的数据元素e,l的长度加上1
void insertdescend(sqlist &l,elemtype e){    elemtype *newbase ,*p;     int k;     if(l.length>=l.listsize)//当前的存储空间已经满了,需要增加分配     {        if(!(newbase=(elemtype *)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(elemtype))))          exit(overflow);        l.elem=newbase;        l.listsize+=LISTINCREMENT;      }      p=l.elem;     for(k=1;k<=l.length;k++)     {      if(e<*p)//和第一个函数的差别就在这里上面       p++;      else break;     }     listinsert(l,k,e);}

3.顺序线性表l已经存在,在l的又不插入心得数据元素e,l的长度加上1
status headinsert(sqlist &l,elemtype e){  elemtype *p,*q,*newbase;  if(l.length>=l.listsize)  {     if(!(newbase=(elemtype *)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(elemtype))))       exit(overflow);     l.elem=newbase;     l.listsize+=LISTINCREMENT;  }  q=l.elem;  for(p=l.elem+l.length-1;p>=q;--p)    *(p+1)=*p;//把所有的元素进行后移   *q=e;  l.length++;  return ok;}

4.在l的尾部插入新的数据元素e,l的长度加上1
status endinsert(sqlist &l,elemtype e){      elemtype *q,*newbase;      if(l.length>=l.listsize)//当前的存储空间已经满了,增加分配      {         if(!(newbase=(elemtype *)realloc(l.elem,(l.listsize+LISTINCREMENT)*sizeof(elemtype))))           exit(overflow);         l.elem=newbase;         l.listsize+=LISTINCREMENT;      }       q=l.elen+l.length;      *q=e;      l.length++;      return ok;}

5.删除l的第一个元素,用e返回该值

status deletefirst(sqlist &l,elemtype &e){  elemtype *p,*q;  if(listempty(l))//空表无法返回    return error;   p=l.elem;//指向第一个元素   e=*p;   q=l.elem+l.length-1;//指向最后一个元素     for(++p;p<=q;++p)    {       *(p-1)=*p;    }   l.length--;   return ok;} 

6.删除最后一个元素

status deletetail(sqlist &l,elemtype &e){  elemtype *p;  if(!l.length)    return error;  p=l.elem+l.length-1;  e=*p;  l.length--;  return ok;} 

7.删除表中值为e的元素,并且返回true

status deleteelem(sqlist &l,elemtype e){   int i=0,j;   while(i<l.length&&e!=*(l.elem+i))     i++;   if(i==l.length)       return false;   else   {     for(j=i;j<l.length;j++)     {     *(l.elem+j)=*(l.elem+j+1);     }     l.length--;     return true;   }} 

8.用e取代表l中第i个元素

status replaceelem(sqlist l,int i,elemtype e){  if(i<1||i>l.length)  exit(error);  *(l.elen+i-1)=e;  return ok;} 

9.按照非降序建立n个元素的线性表

status creatascend(sqlist &l,int n){  int i,j;  elemtype e;  initlist(l);  printf("请输入%d个元素:\n",n);  cin>>e;  listinsert(l,1,e)//在空表中插入第一个元素  for(i=1;i<n;i++)  {     cin>>e;     for(j=0;j<l.length;j++)       if(e<=*(l.elem+j)) break;      listinsert(l,j+1,e); //这里为什么是j+1呢?主要是涉及到listinsert的内部操作       //q=l.elem+i-1;//q为插入的位置   } } 

10.按照非肾虚建立n个元素的线性表

status creatascend(sqlist &l,int n){  int i,j;  elemtype e;  initlist(l);  printf("请输入%d个元素:\n",n);  cin>>e;  listinsert(l,1,e)//在空表中插入第一个元素  for(i=1;i<n;i++)  {     cin>>e;     for(j=0;j<l.length;j++)       if(e>=*(l.elem+j)) break;//和上一个的差别就在这里       listinsert(l,j+1,e); //这里为什么是j+1呢?主要是涉及到listinsert的内部操作       //q=l.elem+i-1;//q为插入的位置   } } 



0 0