c语言中线性表基本操作方法

/*线性表的操作*/
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
struct List
{
    ElemType *list;
    int size;
    int MaxSize;
};

/*初始化列表,即动态存储空间分配并置L为一个空列表*/
void initList(struct List *L,int ms)
{
    if(ms<=0)
    {
        printf("MaxSize 非法!");
        exit(1);
    }
    L->MaxSize = ms;
    L->size = 0;
    L->list=malloc(ms * sizeof(ElemType));
    if(!L->list)
    {
        printf("空间分配失败!");
        exit(1);        
    }
    /*printf("%d\n",sizeof(ElemType));*//*暂用字节数*/
    return ;
}
void againMalloc(struct List *L)
{
    ElemType *p = realloc(L->list,2*L->MaxSize*sizeof(ElemType));
    if(!p)
    {
        printf("存储空间分配失败!");
        exit(1);
    }
    L->list = p; /*使list指向新线性表空间*/
    L->MaxSize=2 * L->MaxSize; /*把线性空间大小修改为新的长度*/
}
/*向线性表L的表尾插入元素*/
void insertLastList(struct List *L,ElemType x)
{
    if(L->size==L->MaxSize){
       /*重新分配更大空间*/
         /*againMalloc(L);*/
        printf("max\n");
    }
    L->list[L->size]= x ;
    L->size++;
    printf("x=%d\n" ,x);
    return ;
}

/*插入内容*/
int insertPostList(struct List *L,int pos,ElemType x)
{
    int i;
    if(pos<1 || pos> L->size+1)
    {
       /*     若Pos越界则插入失败  */
        return 0 ;
    }
    if(L->size==L->MaxSize){
        /*重新分配更大的存储空间*/
        againMalloc(L);    
    }
    L->list[pos-1] = x;
    L->size++;
 /*     printf("%d\n", L->list[pos-1] );  */
    return 1 ;
}
/* 按下标获得元素值  */
ElemType GetElem(struct List *L ,int pos)
{
    if(pos<1 || pos>L->size)
    {
        printf("元素序号越界!");
        exit(1);
    }
    return L->list[pos-1]; /* 返回线性表中序号为Pos值的元素  */
}

/* 顺序扫描(即遍历)输出线性表L中的每个元素  */
void traverseList(struct List *L)
{
    int i ;
    for(i = 0; i<L->size;i++)
    {
        printf("%d ",L->list[i]);
    }
    printf("\n");
    return ;
}

/*值与X相等的元素,若查找成功则返回其位置,否则返回-1*/
int findList(struct List *L,ElemType x)
{
    int i;
    for(i = 0;i<L->size;i++){
        if(L->list[i]==x){
           return i ;
        }
    }
    return -1 ;
}
/* 把线性表L中第pos个元素的值修改为X的值,若修改成功批回1,否则返回0  */
int updatePostList(struct List *L,int pos,ElemType x)
{
    if(pos<1 || pos>L->size){
        return  0 ;    
    }
    L->list[pos-1]= x;
    return 1 ;
}
/*  从线性表中L删除表头元素并返回它,若删除失败则停止程序运行 */
ElemType deleteFirstList(struct List *L)
{
    ElemType temp;
     int i ;
    if(L->size == 0){
        printf("线性表为空,不能进行删除操作!");
        exit(1);
    }
    temp = L->list[0];
    for(i = 0 ;i<L->size;i++)
        L->list[i-1] = L->list[i];    
    L->size--;
    return temp;    
}
/* 线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行  */
ElemType deleteLastList(struct List  *L)
{
    if(L->size==0){
        printf("线性表为空,不能进行删除操作!");
        exit(1);
    }
    L->size--;
/*     返回原来表尾的值  */
    return L->list[L->size];
}
/* 从线性表L中删除第pos个元素并返回它,若删除失则停止程序运行  */
ElemType deletePostList(struct List *L ,int pos)
{
    ElemType temp;
    int i;
    if(pos < 1 || pos > L->size){        /* pos越界则删除失败 */
        printf("pos值越界,不能进行删除操作! ");
        exit(1);
    }
    temp = L->list[pos-1];
    for(i = pos; i < L->size; i++)
        L->list[i-1] = L->list[i];
        L->size--;
    return temp;
}
/* 返回线性表L当前的长度,若L 为空则返回0  */
int sizeList(struct List *L)
{
    return L->size ;
}
/* 是不是一个空列表  */
int EmptyList(struct List *L)
{
    if(L->size==0){
         return 1;
    }
    else{
        return 0 ;
    }
}

/* 清除线性表L中的所有元素,释放存储空间,使之成为一个空表  */
void clearList(struct List *L)
{
    if(L->list!=NULL){
        free(L->list);
        L->list=0;
        L->size = L->MaxSize  = 0 ;
        
    }
    return ;
}

main()
{
    int a[10]={2,4,6,8,10,12,14,16,18,20};
    struct List L;
    int i ;
    initList(&L,5);
    for(i = 0 ;i<10;i++)
    {
         insertLastList(&L,a[i]);
    }
    /* 在当前下标下存入该值  */
    insertPostList(&L,11,48);
    /* 在当前下标下输入该值  */
    insertPostList(&L,3,25);
    /* 按下标获得当前下标的值  */
     printf("GetElem=%d\n",GetElem(&L,11));
    /* 输出当前列表中的所有数据  */
    traverseList(&L);
    /* 查询与 当前指标的值 */
    printf("%d\n",findList(&L,8));
    /* 在当前指标下修改值  */
    updatePostList(&L, 3, 20);
    /* 批指标来获得值  */
    printf("%d\n",GetElem(&L,3));
    /*  从线性表L中删除头元素并返回它,若删除失败则停止程序运行 */
/*     deleteFirstList(&L);  */
    /* 再删除表头 */
/*     deleteFirstList(&L);  */
/*     traverseList(&L);  */
    /* 删除最后表头的值  */
/*      deleteLastList(&L);  */
/*     deleteLastList(&L);  */
    /* 指定删除下标进行删除  */
    printf("%d\n",deletePostList(&L,5));
    
    printf("%d\n ", sizeList(&L));
    printf("%d\n", EmptyList(&L));
    
    traverseList(&L);
/* 清除线性列表  */
    clearList(&L);
/* 清除了没有值了  */
    traverseList(&L);
}
posted @ 2010-01-12 01:14  平凡网客  阅读(4123)  评论(0编辑  收藏  举报