线性表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;
}

线性表List的基本创建

线性表List的基本创建