001.线性表顺序存储C实例

#使用C语言实现线性表顺序存储的初始化、插入、删除、查找与合并。

#include <stdio.h>
#include <stdlib.h>

#define LIST_INIT_SIZE 10
#define LISTINCREMENT 10

typedef struct{
    int *elem;
    int length;
    int listsize;
}SqList;

int InitList_Sq(SqList* L)
{
    int i=0;
    L->elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
    if(!L->elem)
        exit(-1);
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
    while(i<L->listsize)
    {
        printf("input L->elem[%d]=",i);
        scanf("%d",&L->elem[i]);
        L->length++;
        i++;
    }
    return 0;
}

void Print_Sq(SqList *L)
{
    int i;
    for(i=0;i<L->length;i++)
        printf("%d ",L->elem[i]);
}

int ListInsert_Sq(SqList* L,int i,int e)
{
    int* newbase;
    int* p;
    int* q;
    if((i<1)||(i>L->length+1))
        return -1;
    if(L->length+1>=L->listsize)
    {
        newbase=(int*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)
            exit(-1);
        L->elem=newbase;
        L->listsize+=LISTINCREMENT;
    }
    q=&(L->elem[i-1]);
    for(p=&(L->elem[L->length-1]);p>=q;p--)
    {
        *(p+1)=*p;
    }
    L->length++;
    *q=e;

    return 0;
}

int ListDelete_Sq(SqList* L,int i,int* e)
{
    int* p;
    int* q;
    if((i<1)||(i>L->length))
        return -1;
    p=&(L->elem[i-1]);
    *e=*p;
    q=L->elem+L->length-1;
    for(++p;p<=q;p++)
        *(p-1)=*p;
    L->length--;

    return 0;
}

int compare(int a,int b)
{
    if(a==b)
        return 1;
    else
        return 0;
}

int LocateElem_Sq(SqList* L,int e)
{
    int i=1;
    int* p=L->elem;
    while((i<=L->length)&&!(compare(*p++,e)))
        i++;
    if(i<=L->length)
        return i;
    else
        return 0;
}

void MergeList_Sq(SqList* La,SqList* Lb,SqList* Lc)
{
    int* pa=La->elem;
    int* pb=Lb->elem;
    int* pa_last=La->elem+La->length-1;
    int* pb_last=Lb->elem+Lb->length-1;
    Lc->listsize=Lc->length=La->length+Lb->length;
    int* pc=Lc->elem=(int *)malloc(Lc->listsize*sizeof(int));
    if(!Lc->elem)
        exit(-1);
    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++;
}

int main()
{
    SqList L,La,Lb,Lc;
    int i=0,e;

    //init
    InitList_Sq(&L);

    //insert
    printf("Please input insert number:\n");
    scanf("%d",&e);
    printf("Please input insert position:\n");
    scanf("%d",&i);
    ListInsert_Sq(&L,i,e);

    //delete
    printf("Please input which one delete:\n");
    scanf("%d",&i);
    ListDelete_Sq(&L,i,&e);
    printf("e = %d:\n",e);

    //locate
    printf("Please input search number:\n");
    scanf("%d",&e);
    printf("locate = %d\n",LocateElem_Sq(&L,e));
 
    //merge
    InitList_Sq(&La);
    InitList_Sq(&Lb);
    MergeList_Sq(&La,&Lb,&Lc);
    Print_Sq(&Lc);

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值