线性表List的基本创建
#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdio.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define IINFEASIBLE -1
#define OVERFLOW -2
typedef int Status; /*类型名定义用status代替int;Status是返回的状态,程序中的error,ok就是和它对应的!*/
#define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量
#define LISTINCREAMENT 2 //线性表存储空间的分配增量
typedef int ElemType; /*定义ElemType为int类型*/
typedef struct
{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
Status InitList(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;
}//InitList
Status ListInsert(SqList &L,int i,ElemType e){
//在顺序线性表L中第i个位置之前插入新的元素e,i的合法值为1<=i<=ListLength(L)+1;
int *newbase,*q,*p;
if(i<1 || i>L.length+1) return ERROR;
if(L.length>=L.listsize){
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREAMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);//存储分配失败
L.elem = newbase; //新基址
L.listsize +=LISTINCREAMENT;//增加存储容量
}
q=L.elem+i-1;//q为插入位置,也可写成&(L.elem[i-1])
for(p = &(L.elem[L.length-1]);p>=q;--p)
*(p+1) = *p;//插入位置及之后的元素后移
*q = e; //插入e
++L.length;//表长增1
return OK;
}//ListInsert
Status ListDelete(SqList &L,int i,ElemType e){//在顺序表中删除第i个元素,并用e返回其值,i的合法值为1<=i<=ListLength
int *q,*p;
if(i<1 || i>L.length) return ERROR;//i值不合法
p = &(L.elem[i-1]);//p为被删除位置
e = *p;//被删除的元素赋给e
q = L.elem + L.length-1;//表尾元素的位置,或写成&L.elem[L.length-1]
for(++p;p<=q;++p)//被删除元素之后的元素左移
*(p-1)=*p;
--L.length;
return OK;
}//ListDelete
int LocatElem(SqList L,ElemType e)
{
int *p;
int i = 1;//i的初值为第一个元素的位序
p = L.elem;//p的初值为第一个元素的存储位置
while(i<=L.length&&(*p++!=e))
++i;
if(i<=L.length)
return i ;
else return 0;
}//LocateElem
void print (SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
}
int main()
{
SqList L;
ElemType e;
int i,n,t;
InitList(L);
printf("请输入需要插入元素的个数:\n");
scanf("%d",&n);
printf("请输入需要插入的元素:\n");
for(i=1;i<=n;i++)
{
scanf("%d",&e);
ListInsert(L,i,e);
}
printf("插入之后的表中元素为:\n");
print(L);
printf("请输入需要删除元素的位置:\n");
scanf("%d",&i);
t = ListDelete(L,i,e);
if(t==ERROR)
printf("删除失败!\n");
else{
printf("已经成功删除元素!\n");
printf("删除之后的表中元素为:\n");
print(L);
}
printf("请输入需要查找的元素:\n");
scanf("%d",&e);
i=LocatElem(L,e);
if(i==0)
printf("查找失败!");
else
printf("在表中的位置为%d",i);
return 0;
}