数据结构(C语言版)顺序表相关算法代码实现

  这两天实现了一下顺序表的相关操作,包括顺序表初始化、创建、遍历、第i个元素前插入,删除第i个元素、查找元素e的位置、清空顺序表、销毁顺序表、合并两个非递减顺序表操作。

  这次在网上学习到了新的布局方法,将顺序表的存储结构定义,函数说明部分放在了头文件里,源文件中实现的是主函数和各功能函数。

  这次使用的编译环境是vc++6.0

//头文件部分
#define LIST_INIT_SIZE 5
#define INCREAMENT 5
typedef char Elemtype;
typedef int Status;
//线性表存储结构定义
typedef struct {
Elemtype *elem;
int length;
int listsize;
}SqList;
//函数说明部分
Status InitList(SqList &L);
Status CreateList(SqList &L,int size);
Status TraverseList(SqList L);
Status ListInsert(SqList &L,int i,Elemtype e);
Status ListDelete(SqList &L,int i,Elemtype &e);
int LocateElem(SqList L,Elemtype e,Status (*compare)(Elemtype e,Elemtype temp));
Status ClearList(SqList &L);
Status DestroyList(SqList &L);
Status EqualElem(Elemtype e,Elemtype temp);
void MergeList(SqList La,SqList Lb,SqList &Lc);



//源文件部分
#include<stdio.h>
#include <stdlib.h>//malloc函数包含在其中
//将自定义头文件包含进来时只能用""
#include"ListHeader.h"
//程序入口
void main(){
    int size=6;
    SqList list;
    Elemtype deletes;
    InitList(list);
    CreateList(list,size);
//    TraverseList(list);
//    ListInsert(list,5,'o');
//    TraverseList(list);
//    ListDelete(list,5,deletes);
//    TraverseList(list);
//    printf("找到符合compare关系的元素位序是:%d\n",LocateElem(list,'b',EqualElem));
//    ClearList(list);
//    TraverseList(list);
//    DestroyList(list);
//    TraverseList(list);
    SqList list2;
    InitList(list2);
    CreateList(list2,5);
    SqList list3;
    InitList(list3);
    MergeList(list,list2,list3);
    TraverseList(list3);
    getchar();
}
//初始化一个顺序表
Status InitList(SqList &L){
       //分配内存
    L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
    if(!L.elem){
        return false;
    }
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return true;
}
//创建顺序表(判断是否需要重新分配内存,将元素读入)
Status CreateList(SqList &L,int size){
    if(size>L.listsize){
        Elemtype *newbase;
        newbase=(Elemtype *)realloc(L.elem ,(L.listsize+INCREAMENT)*sizeof(Elemtype));
        if(!newbase){
            return false;
        }
        L.elem=newbase;
        L.listsize+=INCREAMENT;
        }
    printf("输入创建顺序表内容:\n");
    for(int i=0;i<size;i++){
        scanf("%c",L.elem+i);
        getchar();//输入了6个元素,只输入三次就自动结束,因为vc6.0将回车也算进字符里,这里用getchar()接收
    }
    L.length=size;
    return true;
}
//顺序表的遍历,用指针来操作
Status TraverseList(SqList L){
    if(L.length==0){
        printf("空表!");
        return false;
    }
    printf("遍历结果:\n");
    for(int i=0;i<L.length;i++){
        printf("%c",*(L.elem++));
        printf("\n");
    }
    return true;
}
//顺序表中第i个元素之前插入元素,下标是i-1
Status ListInsert(SqList &L,int i,Elemtype e){
    //非法判断
    if(i<0||i>L.length){
        return false;
    }
    if(L.length>=L.listsize){
        Elemtype *newbase;//这里为了更好的判断出空间分配结果,新建一个变量newbase
        newbase=(Elemtype *)realloc(L.elem,(L.listsize+INCREAMENT)*sizeof(Elemtype));
        if(!newbase){
            return false;
        }
        L.listsize+=INCREAMENT;
        }
    Elemtype *itemp,*ttemp;
    itemp=&(L.elem[i-1]);
    ttemp=&(L.elem[L.length-1]);
    for(ttemp;ttemp>=itemp;ttemp--){
        *(ttemp+1)=*ttemp;
        }
    *itemp=e;              //这里的itemp始终指向第i个元素的位置,所以用他赋值较好
    L.length+=1;
    return true;
}
//删除顺序表中第i个元素
Status ListDelete(SqList &L,int i,Elemtype &e){
    if(i<0||i>L.length){
        return false;
    }
    Elemtype *itemp=&(L.elem[i-1]);
    e=*itemp;
    Elemtype *ttemp=&(L.elem[L.length-1]);
    for(itemp;itemp<ttemp;itemp++){
        *itemp=*(itemp+1);
    }
    L.length--;
    return true;
}
//返回顺序表中第一个与e满足compare()关系的元素位序,不存在返回0
int LocateElem(SqList L,Elemtype e,Status (*compare)(Elemtype e,Elemtype temp)){
    int i=1;
    Elemtype *temp=L.elem;
    while(!(*compare)(e,*temp)&&i<=L.length){
        temp++;
        i++;
    }
    if(i>L.length){
        i=0;
    }
    return i;
}
//清空顺序表,只让length=0
Status ClearList(SqList &L){
    L.length=0;
    return true;
}
//销毁顺序表,释放elem指针
Status DestroyList(SqList &L){
    if(L.elem){
        free(L.elem);
    }
    L.length=0;
    return true;
}
//两个元素是否相等
Status EqualElem(Elemtype e,Elemtype temp){
    if(e==temp){
        return true;
    }
    return false;
}
//将两个值不递减的顺序表合并到一个新的顺序表中
void MergeList(SqList La,SqList Lb,SqList &Lc){
    Lc.listsize=La.length+Lb.length;
    Lc.length=Lc.listsize;
    Lc.elem=(Elemtype *)malloc(Lc.listsize*sizeof(Elemtype));
    Elemtype *pa,*pb,*pa_last,*pb_last,*pc;
    pa=&La.elem[0];
    pb=&Lb.elem[0];
    pa_last=&(La.elem[La.length-1]);
    pb_last=&(Lb.elem[Lb.length-1]);
    pc=&Lc.elem[0];
    while(pa<=pa_last&&pb<=pb_last){
        if(*pa<*pb){
            *pc++=*pa++;
        }
        else{
            *pc++=*pb++;
        }
    }
    while(pa<=pa_last){
            *pc++=*pa++;
    }
    while(pb<=pb_last){
            *pc++=*pb++;
    }
}

 

posted @ 2016-04-16 23:17  姜姜csu  阅读(1991)  评论(0编辑  收藏  举报