顺序结构的线性表实现

list.h

typedef char EleType;
typedef struct {
    EleType *buf;
    unsigned int n;
    unsigned int max;
}List;
List * CreateList(int);
void DestroyList(List *);
void ClearList(List *);
int ListAppend(List *,EleType);
int ListInsert(List *,int ,EleType);
int ListDelete(List *,int);
int GetElement(List *,int ,EleType *);
int IsFull(List *);
int IsEmpty(List *);
int TraverseList(List *,int (*)(EleType *));
List * CreateList(int n){
    List *list;
    list=(List *)malloc(sizeof(List));
    if(!list) return 0;
    list->buf=(EleType *)malloc(n*sizeof(List));
    list->n=0;
    list->max=n;
    return list;
}
void DestroyList(List *list){
    ClearList(list);
    free(list->buf);
    free(list);
}
void ClearList(List *list){
    list->n=0;
}
int ListAppend(List *list,EleType data){
    if(IsFull(list)) return 0;
    list->buf[list->n++]=data;
    return 1;
}
int ListInsert(List *list,int pos,EleType data){
    int i;
    if(IsFull(list) || pos<1 || pos>list->n+1) return 0;
    pos-=1;
    for(i=list->n;i>=pos;i--)
        list->buf[i+1]=list->buf[i];
    list->buf[i+1]=data;
    list->n++;
    return 1;
}
int ListDelete(List *list,int pos){
    int i;
    if(IsEmpty(list) || pos<1 || pos>list->n) return 0;
    pos-=1;
    for(i=pos;i<list->n;i++)
        list->buf[i]=list->buf[i+1];
    list->n--;
}
int GetElement(List *list,int pos,EleType *data){
    if(IsEmpty(list) || pos<1 || pos>list->n) return 0;
    (*data)=list->buf[pos-1];
    return 1;
}
int IsFull(List *list){
    if(list->n==list->max) return 1;
    return 0;
}
int IsEmpty(List *list){
    if(list->n == 0) return 1;
    return 0;
}
int TraverseList(List *list,int (*f)(EleType *data)){
    int i;
    for(i=0;i<list->n;i++)
        if(!f(&(list->buf[i])))
            return i+1;
    return 0;
}

测试程序:

#include"list.h"
#define CREATELIST 0
#define LISTAPPEND 1
#define LISTINSERT 2
#define LISTDELETE 3
#define GETELEMENT 4
#define CLEARLIST  5

#define titleTest printf("yours:");
#define titleSyst printf("\n syst:");

char *strArr[]={
    "----------CreateList TEST----------",
    "----------ListAppend TEST----------",
    "----------ListInsert TEST----------",
    "----------ListDelete TEST----------",
    "----------GetElement TEST----------",
    "----------ClearList  TEST----------",
};
void ShowResult(List *list,int pos,char *answer);
int putE(char *data);
main(){
    int n;
    List *list;
    char ch;
    char *arr="perfect world";
    char chArr[]={0,0,0,0,0};
    list = CreateList(30);
    puts(strArr[CREATELIST]);
    if(!list){
        puts("CreateList error!");
        return ;
    }else
        puts("CreateList Success!");
    puts(""); getch();

    for(n=0;n<13;n++) ListAppend(list,arr[n]);
    ShowResult(list,LISTAPPEND,"perfect world");

    ListInsert(list,1,'I');
    ListInsert(list,2,' ');
    ListInsert(list,16,'!');
    ListInsert(list,3,' ');
    ListInsert(list,3,'a');
    ListInsert(list,2,'n');
    n=ListInsert(list,0,'0');
    n+=ListInsert(list,-1,'0');
    n+=ListInsert(list,21,'0');
    ShowResult(list,LISTINSERT,"In a perfect world!");
    if(n) puts("ListInsert error!");

    GetElement(list,1,&ch); chArr[0]=ch;
    GetElement(list,19,&ch); chArr[1]=ch;
    n=GetElement(list,0,&ch);
    n+=GetElement(list,-1,&ch);
    n+=GetElement(list,20,&ch);
    puts(strArr[GETELEMENT]);
    titleTest printf("%s",chArr);
    titleSyst printf("I!");
    puts(""); getch();
    if(n) puts("GetElement error!");

    ListDelete(list,11);
    ListDelete(list,5);
    ListDelete(list,10);
    ListDelete(list,6);
    ListDelete(list,8);
    ListDelete(list,5);
    ListDelete(list,13);
    ListDelete(list,6);
    ListDelete(list,5);
    n=ListDelete(list,0);
    n+=ListDelete(list,-1);
    n+=ListDelete(list,11);
    ShowResult(list,LISTDELETE,"In a world");
    if(n) puts("ListDelete error!");

    ClearList(list);
    ShowResult(list,CLEARLIST,"");
}
void ShowResult(List *list,int pos,char *answer){
    puts(strArr[pos]);
    titleTest TraverseList(list,putE);
    titleSyst printf("%s",answer);
    puts(""); getch();
}
int putE(char *data){
    printf("%c",*data);
    return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记与思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值