顺序表的创建,插入,删除,清空。销毁。查找,输出功能

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

 

#defineTRUE 1

#defineFALSE 0

#defineOK 1

#defineERROR 0

#defineINFEASIBLE -1

#defineOVERFLOW -2

 

typedefint Status ;

 

typedefint ElemType ;

 

//线性表的动态分配顺序存储结构

 

#defineLIST_INIT_SIZE 100  //线性表存储空间的初始分配量

#defineLISTINTCREMENT 10  //线性表存储空间的分配增量

typedefstruct

{

    ElemType *elem ; // 存储空间基址

    int length ; //当前长度

    int listsize ; //当前分配的存储容量

}SqList;

 

//初始化顺序表

StatusInitList_Sq(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 ;

}

 

voidCreateList(SqList&L) //创建顺序表

{

    int i; 

    printf("请输入你要创建的顺序表元素个数");

    scanf("%d",&L.length); 

    printf("请输入你要创建的顺序表:\n");

    for(i = 0 ; i < L.length ; i++)

    scanf("%d" , &L.elem[i]) ;

}

 

 

//查找

Statuslocation( SqList &L,ElemType e)//查找元素的位置

{

    int i = 0 ;

    while(L.elem[i]!=e &&i<L.length)

        i++;

    if(i>L.length)  return -1;

    else return i+1;//由于c语言是从下标0開始的当i=0时实际上是顺序表的第i+1个元素

}

 

 

//在顺序表中第i个位置插入一个新的元素e

StatusListInsert_Sq(SqList &L ,int i ,ElemType e)

{

    ElemType *newbase,*q,*p;

    if(i < 1 || i > L.length+1 )

       return ERROR ; // i不合法

    if(L.length >= L.listsize)

    {

       //当前存储空间已满,添加分配

       newbase = (ElemType *)realloc(L.elem , (L.listsize+LISTINTCREMENT) * sizeof(ElemType)) ;

       if(!newbase)

          exit(OVERFLOW) ;// 分配地址失败

       L.elem = newbase ;   //新基址

       L.listsize +=LISTINTCREMENT ; // 添加储存容量

    }

    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 ;

}

 

//在顺序表中删除第i个元素。并用e返回其值

StatusListDelete_Sq(SqList &L , int i , ElemType &e)

{

    ElemType *q,*p;

    if(i < 1 || i > L.length+1 )

       return ERROR ; // i不合法

    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 ;

}

 

//推断表是否为空

StatusListEmpty(SqList &L)

 { //假设L为空表,返回TRUE,否则返回FALSE

  if(L.length==0)

  {

     printf("此表为空表\n");

     return TRUE ;

  }

  else return FALSE;

 }

 

//将表置空

 void ClearList(SqList &L)//将L重置为空表

 {

    for(int i = 0; i < L.length; i++)

    {

       L.elem[i] = NULL;

    }

    printf("表已经清空\n");

 }

//销毁表

voidBurning_List(SqList &L)

{

    L.length = 0;

//  free(L) ;

    printf("表已经销毁\n");

}

 

 void print( SqList &L)//输出顺序表

{

   int i ; 

   for(i = 0 ; i < L.length ; i++)

   printf("%3d" , L.elem[i]);

   printf("\n") ;

 

voidmain()

{

    SqList la ;

    int i , j ; 

    ElemType e ;

    InitList_Sq(la) ;

    CreateList(la) ;//创建表

    //查找

    printf("请输入要查找的元素:\n") ;

    scanf("%d" , &e) ;

    j=location(la , e) ; 

    printf("该元素的位置为%d\n" , j) ;

     //插入

    printf("请输入要插入的位置和元素:\n");

    scanf("%d%d" , &i , &e) ;

    ListInsert_Sq(la,i,e) ; 

    printf("输出插入后的顺序表:\n") ;

    print(la) ; 

    //删除

    printf("请输入要删除的位置:\n") ;

    scanf("%d" , &i) ; 

    ListDelete_Sq(la,i,e) ; 

    printf("删除的那个元素是:%d\n" , e) ;

    printf("输出删除后的顺序表:\n") ;

    print(la) ;

    //清空

    ClearList(la) ;

    print(la) ;

    //销毁

    Burning_List(la) ;

    print(la) ;

}