数据结构-顺序表

来源:互联网 发布:mac x ov10.11 编辑:程序博客网 时间:2024/05/21 23:31
#include <stdio.h>#include <stdlib.h>#define LIST_INIT_SIZE 10#define LISTINCREMENT 100#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int status;typedef int ElemType;typedef struct{    ElemType *elem;    int length;    int listsize;} SqList;status InitList(SqList *L);                         //构造空线性表status ListInsert_Sq(SqList *L, int i, ElemType e); //线性表i位置前插入新元素estatus ListDelete_Sq(SqList *L, int i, ElemType *e);//线性表i位置元素删除,用e返回其值status DestroyList(SqList *L);                      //销毁线性表status ClearList(SqList *L);                        //制空线性表status ListEmpty(SqList L);                         //线性表判空,空为truestatus ListLength(SqList L);                        //线性表长度status GetElem(SqList L, int i, ElemType *e);       //用e返回线性表i位置的元素值status LocateElem(SqList L, ElemType e,status *compare(ElemType a,ElemType b));     //返回第一个和e满足compare关系的元素位置status PriorElem(SqList L, ElemType cur_e, ElemType *pre_e);                        //用pre_e返回e 的前驱status NextElem(SqList L, ElemType cur_e, ElemType *next_e);                        //用next_e返回e的后继status ListTraverse(SqList L,status visit(ElemType a));                             //使用visit遍历线性表status Equal(ElemType a , ElemType b);status visit(ElemType a);int main(){    int i = 0;    ElemType e;    SqList list;    InitList(&list);    printf("After carry out InitList(&list) the length of list: %d\n",ListLength(list));    for(i = 1 ; i < 9 ; i++)        ListInsert_Sq(&list , 1 , i);    printf("After carry out \nfor(i = 0 ; i < 8 ; i++)\n\tListInsert(&list , 1 ,i) \nthe length of list: %d\n",ListLength(list));    if(ListEmpty(list))        printf("At present the list is empty\n");    else printf("At present the list is't empty\n");    GetElem(list,1,&e);    printf("After carry out GetElem(list,1,&e); the value of e is : %d\n", e);    printf("The Equal() is used to determine the equality of the function\nAfter carry out LocateElem(list , 3 , Equal)");    printf("The value it returned is %d\n",LocateElem(list , 3 , Equal));    printf("After carry out ListTraverse(list , visit)\n");    ListTraverse(list , visit);    return 0;}status DestroyList(SqList *L){    free(L->elem);    L->length=0;    L->listsize=0;    L->elem= NULL;    return OK;}status ClearList(SqList *L){    L->length=0;    return OK;}status ListEmpty(SqList L){    if(0 == L.length)        return TRUE;    return FALSE;}status 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 a,ElemType b)){    int i=0;    ElemType *p = L.elem;    while(i < L.length && !compare(e, *p++))        i++;    if(i <= L.length)        return i;    return 0;}status PriorElem(SqList L, ElemType cur_e, ElemType *pre_e){    ElemType *p = L.elem;    int i = 1;    while(1)        if(*++p == cur_e && ++i <= L.length)        {            *pre_e = *--p;            return OK;        }    return ERROR;}status NextElem(SqList L, ElemType cur_e, ElemType *next_e){    ElemType *p = L.elem;    int i = 1;    while(1)        if(*p++ == cur_e && i++ <= L.length)        {            *next_e = *++p;            return OK;        }    return ERROR;}status ListTraverse(SqList L, status visit(ElemType a)){    int i = 0;    ElemType *p = L.elem;    while(i++ < L.length)    {        visit(*p++);    }}status InitList(SqList *L){    L->elem = (ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType));    if (!L->elem)        exit(OVERFLOW);    L->length = 0;    L->listsize = LIST_INIT_SIZE;    return OK;}status ListInsert_Sq(SqList *L, int i, ElemType e){    if (i < 1 || i > L->length + 1)        return ERROR;    if (L->length >= L->listsize)    {        ElemType *newbase;        newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType)) ;        if  (!newbase)            exit (OVERFLOW);        L->elem = newbase;        L->listsize = L->listsize + LISTINCREMENT;    }    ElemType *q,*p;    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 *q,*p;    if (i < 1 || i > L->length)        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;}status Equal(ElemType a, ElemType b){    if(a == b)        return 1;    return 0;}status visit(ElemType a){    printf("visit : %d \n",a);}

0 0