首页 > 代码库 > 线性表

线性表

#define LOCAL#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define OK   1#define ERROR  0#define TRUE 1#define FALSE 0#define ElemType int#define    MAXSIZE  100   /*此处的宏定义常量表示线性表可能达到的最大长度*/typedef  struct{     ElemType  elem[MAXSIZE];  /*线性表占用的数组空间*/    int       last;    /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/}SeqList;int  Locate(SeqList L, ElemType e){        int i=0;        /*i为扫描计数器,初值为0,即从第一个元素开始比较*/    while ((i<=L.last)&&(L.elem[i]!=e))/*顺序扫描表,直到找到值为e的元素, 或扫描到表尾而没找到*/        i++;     if  (i<=L.last)        return(i+1);  /*若找到值为e的元素,则返回其序号*/    else        return(-1);  /*若没找到,则返回空序号*/}/*在顺序表L中第i个数据元素之前插入一个元素e。 插入前表长n=L->last+1,i的合法取值范围是 1≤i≤L->last+2  */int  InsList(SeqList *L,int i,ElemType e){     int k;    if((i<1) || (i>L->last+2)) /*首先判断插入位置是否合法*/    {        printf("插入位置i值不合法");        return(ERROR);    }    if(L->last>= MAXSIZE-1)    {        printf("表已满无法插入");        return(ERROR);    }    for(k=L->last;k>=i-1;k--)   /*为插入元素而移动位置*/        L->elem[k+1]=L->elem[k];    L->elem[i-1]=e;   /*在C语言数组中,第i个元素的下标为i-1*/    L->last++;    return(OK);}int  DelList(SeqList *L,int i,ElemType *e)/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。i的合法取值为1≤i≤L.last+1 */    {     int k;    if((i<1)||(i>L->last+1))       {         printf("删除位置不合法!");        return(ERROR);    }    *e = L->elem[i-1];  /* 将删除的元素存放到e所指向的变量中*/    for(k=i; i<=L->last; k++)        L->elem[k-1] = L->elem[k];  /*将后面的元素依次前移*/    L->last--;    return(OK);}void    merge(SeqList *LA,  SeqList *LB,  SeqList *LC){    int i,j,k;    i=0;j=0;k=0;    while(i<=LA->last&&j<=LB->last)        if(LA->elem[i]<=LB->elem[j])        {            LC->elem[k]= LA->elem[i];            i++;             k++;        }        else        {            LC->elem[k]=LB->elem[j];            j++;             k++;                            }    while(i<=LA->last)    /*当表LA有剩余元素时,则将表LA余下的元素赋给表LC*/    {        LC->elem[k]= LA->elem[i];        i++;         k++;    }    while(j<=LB->last)  /*当表LB有剩余元素时,则将表LB余下的元素赋给表LC*/        {        LC->elem[k]= LB->elem[j];        j++;         k++;    }    LC->last=LA->last+LB->last+1;}void Display(SeqList *Sq){    for(int i=0; i<=Sq->last; i++)    {        printf("%d ",Sq->elem[i]);    }}int main(){#ifdef LOCAL    freopen("2.in","r",stdin);    freopen("2.out","w",stdout);#endif    SeqList LA,LB,LC;    int i,r;    printf("请输入线性表LA的长度:\n");    scanf("%d",&r);    LA.last = r-1;    printf("请输入线性表的各元素值:\n");    for(i=0; i<=LA.last; i++)    {        scanf("%d",&LA.elem[i]);    }    printf("请输入线性表LB的长度:\n");    scanf("%d",&r);    LB.last = r-1;    printf("请输入线性表的各元素值:\n");    for(i=0; i<=LB.last; i++)    {        scanf("%d",&LB.elem[i]);    }    merge(&LA,&LB,&LC);    Display(&LC);    /*    SeqList l;    int p,q,r;    int i;    printf("请输入线性表的长度:\n");    scanf("%d",&r);    l.last = r-1;    printf("请输入线性表的各元素值:\n");    for(i=0; i<=l.last; i++)    {        scanf("%d",&l.elem[i]);    }    printf("请输入要查找的元素值:\n");    scanf("%d",&q);    p=Locate(l,q);    if(p == -1)        printf("在此线性表中没有该元素!\n");    else        printf("该元素在线性表中的位置为:%d\n",p);        ElemType key;    int local;    printf("请输入要插入元素值key,和要插入的位置local.\n");    scanf("%d%d",&key,&local);    printf("插入元素值:");     if(InsList(&l,key,local)==OK)    {        printf("OK\n");    }else    {        printf("ERROR\n");    }        scanf("请输入要删除元素的位置:\n",&local);        printf("删除元素值:");     if(DelList(&l,local,&key)==OK)    {        printf("OK,key=%d\n",key);    }else    {        printf("ERROR\n");    }    */        return 0;}

 

线性表