顺序链表

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

typedef int ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1

#define LISTSIZE 10
#define ADDSIZE 2
typedef struct 
{
    ElemType *elem;
    int length;
    int listsize;
}SqList;

Status InitList(SqList *L)
{
    (*L).elem=(ElemType *)malloc (LISTSIZE*sizeof(ElemType));
    if(!(*L).elem)
        exit(OVERFLOW);
    (*L).length=0;
    (*L).listsize=LISTSIZE;
    return OK;
}
Status DestoryList(SqList *L)
{
    free((*L).elem);
    (*L).elem=NULL;
    (*L).length=0;
    (*L).listsize=0;
    return OK;
}
Status ClearList(SqList *L)
{
    (*L).length=0;
    return OK;
}
Status ListEmpty(SqList L)
{
    if(L.length==0)
        return TRUE;
    else
        return ERROR;
}
int ListLength(SqList L)
{
    return L.length;
}
Status GetElem(SqList L,int i,ElemType *e)
{
    if(i<1||i>L.length)
        return ERROR;
    *e=*(L.elem+i-1);
    return OK;
}
Status LocateElem(SqList L,ElemType e,Status (*compare)(ElemType,ElemType))
{
    ElemType *p;
    int i;
    p=L.elem;
    while(i<=L.length&&!compare(*p,e))
    {
        i++;
        p++;
    }
    if(i<=L.length)
        return i;
    else
        return ERROR;
}
Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)
{
    ElemType *p,*q,i=2;
    p=L.elem+1;
    q=L.elem+L.length-1;
    while(i<=L.length&&*(L.elem+i-1)!=cur_e)
        i++;
    *pre_e=*(--p);
    return OK;
}
Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)
{
    ElemType *p,*q,i=1;
    p=L.elem;
    q=L.elem+L.length-1;
    while(i<L.length&&*(L.elem+i-1)!=cur_e)
        ++i;
    *next_e=*(++p);
    return OK;
}
Status ListInsert(SqList *L,int i,ElemType e)
{
    ElemType *newbase,*p,*q;
    if(i<1||i>(*L).length+1)
        return ERROR;
    if((*L).length>=(*L).listsize)
    {
        newbase=(ElemType *)realloc((*L).elem,((*L).listsize+ADDSIZE)*sizeof(ElemType));
        if(!newbase)
            exit(OVERFLOW);
        (*L).elem=newbase;
        (*L).listsize+=ADDSIZE;
    }
    p=(*L).elem+i-1;
    q=(*L).elem+(*L).length-1;
    while(p<=q)
    {
        *(q+1)=*q;
        --q;
    }
    *p=e;
    ++(*L).length;
    return OK;
}
Status DeleteList(SqList *L,int i,ElemType *e)
{
    ElemType *p,*q;
    p=(*L).elem+i-1;
    q=(*L).elem+(*L).length-1;
    *e=*p;
    while(p<q)
    {
        *p=*(p+1);
        ++p;
    }
    --(*L).length;
    return OK;
}
Status ListTraverse(SqList L,void(*visit)())
{
    ElemType *p,i=1;
    p=L.elem+i-1;
    while(i<=L.length)
    {
        visit(*p);
        ++i;
    }
    return OK;
}
void main()
{
    ElemType e,i=1,k;
    SqList L;
    InitList(&L);
    printf("初始化线性表L后,它的成员变量分别为:\n");
    printf("L.elem=%u(地址) L.length=%d  L.listsize=%d\n",L.elem,L.length,L.listsize);
    printf("请输入打算在线性表L中插入几个数:");
    scanf("%d",&k);
    printf("向线性表中输入%d个数\n",k);
    while(i<=k)
    {
        scanf("%d",&e);
        ListInsert(&L,i,e);
        i++;
    }
    i=1;
    while(i<=k)
    {
        GetElem(L,i,&e);
        printf("%d  ",e);
        i++;
    }
/*    for(j=1;j<=10;j++)
        ListInsert(&L,j,j);
    printf("在L的表尾依次插入1~10后:,*L.elem=\n");
    for(j=1;j<=10;j++)
        printf("%d ",*(L.elem+j-1));*/
    printf("\n");
    ClearList(&L);
    printf("输出清空之后L的成员变量分别为:L.elem=%u(地址) L.length=%d L.listsize=%d\n",L.elem,L.length,L.listsize);

    
    
}

顺序链表_第1张图片

你可能感兴趣的:(链表)