作者在 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*/
#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;
}
{ /*操作结果:构造一个空的顺序线性表*/
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;
}
{ /*初始条件:顺序线性表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;
}
{ /*初始条件:顺序线性表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;
}
{ /*初始条件:顺序线性表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;
}
{ /*初始条件:顺序线性表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;
{
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的每个数据元素访问并输出
}
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的每个数据元素访问并输出
}