顺序表的操作

作者在 2009-10-16 10:00:30 发布以下内容
#include <stdio.h>/*EOF(=^z或F6),NULL*/
#include <process.h>/* exit() */
#include <malloc.h>
#define LIST_INIT_SIZE 10/*线性表存储空间的初始分配量*/
#define LISTINCREMENT 2/*线性表存储空间的分配增量*/
typedef int ElemType;
typedef struct
{
 ElemType *elem;/*存储空间基址*/
 int length;/*当前长度*/
 int listsize;/*当前分配的存储容量(以sizeof(ElemType))为单位*/
}SqList;
/*函数结果状态代码*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2/*因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/
typedef int Status;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedef int Boolean;/*Boolean是布尔类型,其值是TRUE或FALSE*/
Status InitList(SqList &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;
}
Status ListInsert(SqList &L,int i,ElemType e)
{   /*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1*/
 /*操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1*/
 ElemType *newbase,*q,*p;
 if(i<1||i>L.length+1)/* i值不合法*/
  return ERROR;
 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 GetElem(SqList L,int i,ElemType &e)
{   /*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
 /*操作结果:用e返回L中第i个数据元素的值*/
 if(i<1||i>L.length)
  exit(ERROR);
 e=L.elem[i-1];
 return OK;
}
Status ListDelete(SqList &L,int i,ElemType &e)
{   /*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
 /*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1*/
 ElemType *p,*q;
 if(i<1||i>L.length)/*i值不合法*/
  return ERROR;
 p=&L.elem[i-1];/*p为被删除元素的位置*/
 e=*p;/*被删除元素的值赋给e*/
 q=L.elem+L.length-1;/*表尾元素的位置*/
 for(++p;p<=q;++p)/*被删除元素之后的元素左移*/
  *(p-1)=*p;
  L.length--;/*表长减1*/
 return OK;
}
Status ListTraverse(SqList L)
{   /*初始条件:顺序线性表L已存在*/
 /*操作结果:依次对L的每个数据元素访问并输出*/
 ElemType *p;
 int i;
 p=L.elem;
 for(i=1;i<=L.length;i++)
  printf("%d\t",*p++);
  printf("\n");
 return OK;
}
void main()
{
 SqList L;
 ElemType e;
 Status i;
 int j;
 i=InitList(L);//初始化顺序表
 for(j=1;j<=6;j++)
 {
  printf("please input the value:\n");
  scanf("%d",&e);//通过键盘输入为e赋值
  ListInsert(L,1,e);//调用ListInsert函数,在L中第1个位置之前插入新的数据元素e
 }
 printf("L,length=%d\n",L.length);
 GetElem(L,3,e);
 printf("the 3rd element is:%d\n",e);
 printf("please input the value in the 2nd place:");
 scanf("%d",&e);
 ListInsert(L,2,e);//调用ListInsert函数,在L中第2个位置之前插入新的数据元素e
 printf("the Lists are:\n");
 ListTraverse(L);//依次对L的每个数据元素访问并输出
 ListDelete(L,4,e);//删除顺序表第4个元素
 printf("the value of deleted element is %d\n",e);
 printf("the Lists are:\n");
 ListTraverse(L);//依次对L的每个数据元素访问并输出
}
默认分类 | 阅读 763 次
文章评论,共0条
游客请输入验证码