线性表的基本操作

#include<stdio.h>
#include<stdlib.h>
typedef struct
{
    int *elem;
    int length;
    int listsize;
}SqList;

#define LIST_MAX 10
#define LIST_ADD 2

int InitList(SqList *L)
{
    L->elem=(int*)malloc(LIST_MAX*sizeof(int));
    if(!L->elem)
    {
        printf("初始化失败!\n");
        exit(-1);
    }
    L->length=0;
    L->listsize=LIST_MAX;
    return 1;
}

int DestoryList(SqList *L)
{
    free(L->elem);
    L->elem=NULL;
    
    return 1;
}
int ClearList(SqList *L)
{
    L->length=0;
    return 1;
}
int GetList(SqList L,int i,int *e)
{
    if(i<0||i>L.length)
    {
        printf("输出查找的长度超过已有的链表的长度!\n");
        exit(-1);
    }
    *e=*(L.elem+i-1);
    return 1;
}

int InsertList(SqList *L,int i,int e)
{
    int *newbase,*p,*q;
    if(i<0||i>L->length+1)
    {
        printf("打算插入的位置超出了链表的长度!\n");
        exit(-1);
    }
    if(L->length>=L->listsize)
    {
        newbase=(int *)realloc(L->elem,(L->listsize+LIST_ADD)*sizeof(int));
        if(!newbase)
            exit(-1);
        L->listsize+=LIST_ADD;
        L->elem=L->elem;
    }
    p=L->elem+i-1;
    for(q=L->elem+L->length-1;q>=p;q--)
        *(q+1)=*q;    
    *p=e;    
    ++(L->length);
        
    return 1;
}
int ListEmpty(SqList L)
{
    if(L.length==0)
        return 1;
    else
        return 0;
}
int ListLength(SqList L)
{
    return L.length;
}
int DeleteList(SqList *L,int i,int *e)
{
    int *p;
    if(i<0||i>L->length)
    {
        printf("要删除的元素位置不存在链表中!\n");
        exit(-1);
    }
    p=L->elem+i-1;
    *e=*p;
    for(;p<L->elem+L->length-1;p++)
        *p=*(p+1);    
    --L->length;
    return 1;
}    
int LocateElem(SqList L,int e,int (*compare)(int v1,int v2))
{
    int *p;
    int i=1;
    p=L.elem;
    while(i<=L.length&&!compare(*(p++),e))
        ++i;
    if(i<=L.length)
        return i;
    else
        return 0;
}    
int equal(int v1,int v2)
{
    if(v1==v2)
        return 1;
    else
        return 0;
}

int PriorElem(SqList L,int cur_e,int *pre_e)
{
    int i;
    i=LocateElem(L,cur_e,equal);
    if(i>1)
    {
        *pre_e=*(L.elem+i-2);
        return 1;
    }
    else
    {
        printf("没有前驱! \n");
        exit(-1);
    }
}
int NextElem(SqList L,int cur_e,int *next_e)
{
    int i=1;
    int *p=L.elem;
    while(i<L.length&&*p!=cur_e)
    {
        ++i;
        ++p;
    }
    if(i==L.length)
        return 0;
    else
    {
        *next_e=*(++p);
        return 1;
    }
}
int ListTraverse(SqList L,int (*visit)(int e))
{
    int i=1;
    for(i=1;i<=L.length;i++)
        visit(*(L.elem+i-1));
    return 1;
}
int print(int e)
{
    printf("%d ",e);
    return 1;
}
int main()
{
    int i,e0;
    SqList L;
    InitList(&L);

    for(i=1;i<=11;i++)
        InsertList(&L,i,i*2);
    
    printf("链表是否为空:%d(1.表示空,0表示非空)\n",ListEmpty(L));
    
    for(i=1;i<=11;i++)
    {
        GetList(L,i,&e0);
        printf("%d ",e0);
    }

    printf("\n");
    
    DeleteList(&L,1,&e0);
    printf("删除第一个元素%d\n",e0);

    printf("该链表的长度为:%d\n",ListLength(L));
    
    printf("查找连表中是否存在4,存在的话,它的位置为%d\n",LocateElem(L,4,equal));
    
    PriorElem(L,8,&e0);
    printf("请输出8的前一个元素是:%d\n",e0);

    NextElem(L,8,&e0);
    printf("请输出8的后一个元素是:%d\n",e0);

    ListTraverse(L,print);
    printf("\n");

    DestoryList(&L);

    return 0;
}

posted @ 2016-05-08 19:28  小宏~  阅读(835)  评论(0编辑  收藏  举报