线性表的顺序表示和实现

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef int Status;
typedef int ElemType;

typedef struct
{
    ElemType *elem;

    int length;

    int listsize;
}SqList;


Status InitList_Sq(SqList &L)//线性表的初始化
{
    L.elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);

    if(!L.elem)
    {
        printf("存储分配失败");
        exit(OVERFLOW);
    }
    L.length=0;
    L.listsize=LIST_INIT_SIZE;

    return OK;
}

Status ListInsert_Sq(SqList &L,int i,ElemType e)//插入
{
    ElemType *newbase,*p,*q;

    if(i<1 || i>L.length+1)
    {
        printf("i的值不合法");
        return ERROR;
    }

    if(L.length>=L.listsize)
    {
        newbase=(ElemType *)realloc(L.elem,sizeof(ElemType)*(L.length+LISTINCREMENT));

        if(!newbase)
        {
            printf("存储分配失败");
            exit(OVERFLOW);
        }
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }

    q=&(L.elem[i-1]);

    for(p=&(L.elem[L.length-1]) ; p>=q ; p--)
        *(p+1)=*p;

    *q=e;
    ++L.length;

    return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType e)//删除
{
    ElemType *p,*q;

    if(i<1 || i>L.length+1)
    {
        printf("i的值不合法");
        return ERROR;
    }

    p=&(L.elem[i-1]);
    e=*p;
    q=L.elem+L.length-1;

    for(++p; p<=q ; ++p)
        *(p-1)=*p;

    --L.length;

    return OK;
}

int compare(ElemType  e1, ElemType  e2)
 {
     if(e1==e2)
         return 1;
    else
        return 0;
 }
 
int LocateElem_Sq(SqList L,ElemType e)//定位
{
    int i;

    ElemType *p;

    i=1,p=L.elem;

    while(i<=L.length && !compare(*p++,e))
        ++i;

    if(i<L.length) return i;

    return 0;
}
Status PrintList_Sq(SqList &L)//打印
{
    ElemType i;

    for(i=0 ; i<L.length; i++ )
    {
        printf("%d ",*(L.elem+i));
    }
    return OK;
}
Status ClearList_Sq(SqList &L)//清空
{
    L.length=0;

    return OK;
}
Status DestoryList_Sq(SqList &L)//销毁
{
    int i;
    for(i=0 ; i<L.length ; i++)
    {
        free(L.elem+i);
    }

    return OK;
}
int ListLength_Sq(SqList &L)//长度
{
    return L.length;
}
Status ListEmpty_Sq(SqList &L)//是否为空
{
    if(L.length)
        return FALSE;
    return TRUE;
}
Status GetElem_Sq(SqList L,int i,ElemType &e)//获得元素
{
    if(i<0 || i>L.length+1)
    {
        printf("i的值不合法");
        return ERROR;
    }
    e=*(L.elem+i);

    return OK;
}

Status NextElem(SqList &L,ElemType cur_e,ElemType &next_e)//下一个元素
{
    int i;
    i=LocateElem_Sq(L,cur_e)-1;
    if(i>L.length-1 || i<0)
        return ERROR;
    else
        next_e=*(L.elem+i+1);

    return OK;
}

    
int PriorElem(SqList &L,ElemType cur_e,ElemType &pre_e)//上一个元素
{
  int i;             
  i=LocateElem_Sq(L,cur_e)-1; 
  {
     if (i>=1) 
     {
       pre_e=*(L.elem+i-1);  
       return OK;
     }  
     else
     {
       return ERROR;
     }
  }
}
int main()
{
    int i=1;
    SqList L;

    ElemType data,search,prior,next;

    InitList_Sq(L);

    printf("请输入要插入的数,以0结束\n");

    while(scanf("%d",&data),data)
    {
        ListInsert_Sq(L,i,data);
        i++;
    }


    printf("你创建的线性表的长度是:%d\n",ListLength_Sq(L));
    


    printf("\n请输入你要查找的数\n");
    scanf("%d",&search);
    if(!LocateElem_Sq(L,search))
    {
        printf("您输入的不存在\n");
    }
    else
    {
        printf("你要查找的数的位子是在第%d位\n",LocateElem_Sq(L,search));
    }


    printf("\n请输入你要查找数的后一位(即找他的前一位)\n");
    scanf("%d",&search);
    if(!PriorElem(L,search,prior))
    {
        printf("你所输入的数的前一位不存在\n");
    }
    else
    {
    
        printf("%d,的前一位是%d\n",search,prior);
    }


    printf("\n请输入你要查找数的前一位(即找他的后一位)\n");
    scanf("%d",&search);
    if(!NextElem(L,search,next))
    {
        printf("你所输入的数的后一位不存在\n");
    }
    else
    {
        printf("%d,的后一位是%d\n",search,next);
    }


    printf("\n你所创建的顺序表是:\n");
    PrintList_Sq(L);
    printf("\n");



    return 0;
}







    

数据结构->第二章->线性表的顺序表示和实现

 

 

posted @ 2012-06-09 19:59  小跳蚤  阅读(140)  评论(0编辑  收藏  举报