顺序表的基本操作用c语言实现

来源:互联网 发布:淘宝app怎么下载不了 编辑:程序博客网 时间:2024/06/06 00:52
#include <stdio.h>#include <stdbool.h>#include <malloc.h>#define initSize 20typedef struct{    int *data;    int len,maxsize;//当前元素个数和最大容量}SqList;bool InitList(SqList *L);bool ListInsert(int i,int x,SqList *L);bool ListDelete(int i,SqList *L);int LocateElem(int x,SqList *L);void ListPrint(SqList *L);void ListRevrse(SqList *L);void DeleteElem(SqList *L);void MergeList(SqList *LA,SqList *LB,SqList *L);int main(){    SqList L,LA,LB;    InitList(&LA);    LA.data[0]=1;LA.data[1]=3;LA.data[2]=5;LA.data[3]=7;LA.data[4]=9;    LA.len=5;    InitList(&LB);    LB.data[0]=2;LB.data[1]=4;LB.data[2]=5;LB.data[3]=6;LB.data[4]=10;LB.data[5]=11;LB.data[6]=12;    LB.len=7;    InitList(&L);    ListPrint(&L);    /*ListInsert(1,1,&L);    ListInsert(2,2,&L);    ListInsert(3,2,&L);    ListInsert(4,2,&L);    ListInsert(5,2,&L);    ListInsert(6,3,&L);    ListInsert(7,3,&L);    ListInsert(8,3,&L);    ListInsert(9,4,&L);    ListInsert(10,4,&L);    ListInsert(11,5,&L);    ListPrint(&L);    printf("-------在第2个位置插入80--------\n");    bool flag=ListInsert(2,80,&L);    if(flag==false)        printf("插入出错!\n");    else        ListPrint(&L);    printf("-------删除第4个位置的数据--------\n");    ListDelete(4,&L);    ListPrint(&L);    printf("-------找出4位于第几个位置--------\n");    int pos=LocateElem(67,&L);    printf("%d\n",pos);    printf("-------逆置线性表--------\n");    ListRevrse(&L);    ListPrint(&L);    printf("-------删除重复的元素--------\n");    DeleteElem(&L);    ListPrint(&L);*/    printf("-------合并表--------\n");    MergeList(&LA,&LB,&L);    ListPrint(&L);    printf("-------交换顺序--------\n");    MergeList(&L,5,6);    ListPrint(&L);    return 0;}bool InitList(SqList *L)//构造一个空的线性表{    L->data=(int*)malloc(initSize*sizeof(int));    if(L->data==NULL)        return false;    L->len=0;    L->maxsize=initSize;    return true;}bool ListInsert(int i,int x,SqList *L)//插入元素{    int j;    if(i>L->len+1||i<1)//判断插入位置是否合法        return false;    if(L->len>=L->maxsize)//判断表是否已满        return false;    for(j=L->len;j>=i;j--){        L->data[j]=L->data[j-1];    }    L->data[j]=x;    L->len++;    return true;}bool ListDelete(int i,SqList *L)//删除元素{    int j;    if(i<1||i>L->len)//判断删除位置是否合法        return false;    for(j=i;j<L->len;j++)        L->data[j-1]=L->data[j];    L->len--;    return true;}int LocateElem(int x,SqList *L)//查找元素{    int i;    for(i=0;i<L->len;i++){        if(L->data[i]==x){            return i+1;        }    }    return 0;}void ListRevrse(SqList *L)//逆置元素,要求空间复杂度为(1){    int i,j,dep;    for(i=0;i<L->len/2;i++)    {        j=L->len-1-i;        dep=L->data[i];        L->data[i]=L->data[j];        L->data[j]=dep;    }}void DeleteElem(SqList *L)//删除重复的元素{    int i,n=0,k=L->data[0];    for(i=1;i<L->len;i++)    {        if(L->data[i]==k)            n++;        else            k=L->data[i];            L->data[i-n]=L->data[i];    }    L->len-=n;}void MergeList(SqList *LA,SqList *LB,SqList *L)//合并{    int i=0,j=0;    while(i<LA->len&&j<LB->len)    {        if(LA->data[i]<=LB->data[j])        {            L->data[i+j]=LA->data[i];            i++;        }        else        {            L->data[i+j]=LB->data[j];            j++;        }    }    if(i==LA->len)    {        for(;j<LB->len;j++)            L->data[i+j]=LB->data[j];    }    else    {        for(;i<LA->len;i++)            L->data[i+j]=LB->data[i];    }    L->len=i+j;}void ExchangeList(SqList *L,int m,int n)//将数组中两个线性表顺序互换{    int i;    if(m<n)    {        int s[n];        for(i=0;i<n;i++)            s[i]=L->data[i+m];        for(i=0;i<m;i++)            L->data[n+i]=L->data[i];        for(i=0;i<n;i++)            L->data[i]=s[i];    }    else    {        int s[m];        for(i=0;i<m;i++)            s[i]=L->data[i];        for(i=0;i<n;i++)            L->data[i]=L->data[m+i];        for(i=0;i<m;i++)            L->data[n+i]=s[i];    }}void ListPrint(SqList *L){    int i;    if(L->len==0)        printf("线性表为空\n");    for(i=0;i<L->len;i++){        printf("%d\n",L->data[i]);    }    printf("length=%d\n",L->len);}
原创粉丝点击