代码-线性表

#include <stdio.h>
#include "malloc.h"
#define OVERFLOW   -2
#define INITSIZE   10
#define LISTINCREMENT 10
typedef  int ElemType;
typedef struct
{
    int sno;
    float score;
} Student;
typedef struct
{
    Student *Stu;
    ElemType    *data;
    int   Length;
    int   ListSize;
} SqList;

SqList La,Lb,Lc,S;

int initlist(SqList *L)
{
    //初始化顺序表

    L->data= (ElemType*) malloc (INITSIZE*sizeof(ElemType) );
    if (L->data==NULL) //分配空间失败
        return 0;
    L-> Length=0;  //分配成功,把表长赋值为0,即创建一个空表
    L->ListSize=INITSIZE;
    return 1 ;
}
void MenuList()
{
    printf("\n\n\n**************************\n");
    printf("  1  -------  初始化顺序表\n");
    printf("  2  -------  生成顺序表La\n");
    printf("  3  -------  输出顺序表中的元素 \n");
    printf("  4  -------  向顺序表中插入元素\n");
    printf("  5  -------  删除顺序表中的元素 \n");
    printf("  6  -------  查找顺序表中值为X的元素 \n");
    printf("  7  -------  将顺序表置空 \n");
    printf("  8  -------  合并两个有序顺序表 \n");
    printf(" 9  -------   将顺序表中的元素倒置 \n");
    printf(" 10  ------- 删除顺序表中值为x的所有元素 \n");
    printf(" 11 -------   求两个顺序表的交集 \n");
    printf(" 12  -------  建立学生顺序表 \n");
    printf(" 0  ------- 退出 \n");
    printf("**************************\n");
}

void  Init(SqList *L,int i)
{
    //生成顺序表,即向初始化的空顺序表中插入元素
    int j=0 ;
    ElemType  e;
    ElemType  *p;
    p=L->data;
    while (j<i)
    {
        //依次输入元素
        scanf("%d",&e);//输入一个元素值后回车
        *(p+j)=e;//或者写成:p[j]=e;
        j++;
    }
    L->Length=i;
}
void printsq(SqList *L)
{
    //输出顺序表中所有元素
    int i;
    printf("Size=%d    Length=%d   \n",L->ListSize,L->Length);
    for (i=0; i<L->Length; i++)
        printf("第%d 个元素为: %d\n",i+1,L->data[i]);
}

int  ListInsert(SqList *L,int i,int e)//插入
{
    ElemType *newbase,j;
    if(i<1||i>L->Length+1)
        return 0;
    if(L->Length==L->ListSize)
    {
        //空间不够,分配空间
        newbase=(ElemType *)realloc(L->data,(L->ListSize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)//分配失败
            return 1;
        L->data=newbase;
        L->ListSize+=LISTINCREMENT;
    }
    for(j=L->Length-1; j>=i-1; j--)
        L->data[j+1]=L->data[j];//将线性表第i个元素之后的所有元素向后移动
    L->data[i-1]=e;//将新元素放在线性表的第i个位置
    L->Length++;//表长加一
    return 2;
}

int  Listdelete(SqList *L,int i)//删除顺序表中第i个元素
{
    if(L->Length==0)
        return 0;
    int j;
    if(i<1||i>L->Length)
        return 1;
    for(j=i; j<L->Length; j++)
        L->data[j-1]=L->data[j];//将线性第i+1个元素之后的所有元素向前移动
    L->Length--;
    return 2;
}
int  Listfind(SqList *L,int x)
{
    // 查找值为x的元素
    int i;
    for(i=0; i<L->Length; i++)
    {
        if(L->data[i]==x)
            return i+1;//返回值为x的元素在线性表中的位置

    }
    return 0;
}
int  delx(SqList *L,int x)
{
    // 删除值为x的所有元素
    if(L->Length==0)
        return 0;
    int i,j=0;
    for(i=0; i<L->Length;i++)
        if(L->data[i]==x)
            j++;
        else
            L->data[i-j]=L->data[i];
    L->Length=L->Length-j;
    return 1;
}


int TList( SqList *L)
{
    //将顺序表中的元素倒置
    int i;
    ElemType t;
    for(i=0; i<L->Length/2; i++)
    {
        t=L->data[i];
        L->data[i]=L->data[L->Length-i-1];
        L->data[L->Length-i-1]=t;
    }
    return 1;
}

int MList( SqList *La,SqList *Lb,SqList *Lc)
{
    //合并两个有序顺序表
    ElemType* pa=La->data;//指针pa指向La的首元素
    ElemType* pb=Lb->data;
    Lc->Length=La->Length+Lb->Length;
    ElemType* pc=Lc->data;
    ElemType* pa_last=La->data+La->Length-1;
    ElemType* pb_last=Lb->data+Lb->Length-1;
    while(pa<=pa_last&&pb<=pb_last)
    {
        if(*pa>*pb)
            *pc++=*pa++;
        else if(*pa<*pb)*pc++=*pb++;
        else{
            *pc++=*pa++;
            *pb++;
            Lc->Length--;
        }
    }
    while(pa<=pa_last)
        *pc++=*pa++;//当Lb已经到达表尾,而La还没到达表尾时
    while(pb<=pb_last)
        *pc++=*pb++;//当La已经到达表尾,而Lb还没到达表尾时
    return 1;
}

int RList( SqList *La,SqList *Lb)
{
    //求两个有序表的交集
    int i,e,j=0;
    for(i=0; i<Lb->Length; i++)
    {
        //e=Lb->data[i];
      //  if(!Listfind(La,e)){
        if(La->data[j]<Lb->data[i]) {
            e = Lb->data[i];
            delx(Lb, e);
            i--;
        }
        else if(La->data[j]==Lb->data[i])
        j++;
        else{
            j++;
            i--;
        }
        }
    return 1;
}
int Create( SqList *L){
    int i;
    for(i=0;;i++)
    {
        printf("请输入学生的信息:\n");
        printf("学号:") ;
        scanf("%d",&L->Stu[i].sno) ;
        if(L->Stu[i].sno==0)
            return 1;
        printf("成绩:") ;
        scanf("%f",&L->Stu[i].score) ;
        L->Length++;
    }
}
int main()
{
    int s,m=100,f,q;
    while (m!=0)
    {
        MenuList();
        printf("请输入菜单中的功能选项编号:"	);
        scanf("%d",&m);
        if (m==1)
        {
            s= initlist(&La);
            if (s==0)
                printf("La空间申请失败");
            else
                printf("La空间申请成功");
        }
        if (m==2 )
        {
            printf("请输入线性表中的元素个数:");
            scanf("%d",&f);
            Init(&La,f);
        }

        if (m==3)  printsq(&La) ;
        if (m==4)
        {
            printf("请输入插入位置:");
            scanf("%d",&f);
            printf("请输入插入元素:");
            scanf("%d",&q);
            s=ListInsert(&La,f,q);
            if (s==0)
                printf("插入位置不合法");
            else if(s==1)
                printf("新分配空间失败");
            else {
                printf("插入成功\n");
                printsq(&La);
            }
        }
        if (m==5)
        {
            printf("请输入删除位置:");
            scanf("%d",&f);
            s=Listdelete(&La,f);
            if (s==0)
                printf("表为空,无法执行删除操作");
            else if(s==1)
                printf("删除位置不合法");
            else
                printf("删除成功\n");
            printsq(&La);
        }
        if (m==6)
        {
            printf("请输入查找元素的值:");
            scanf("%d",&f);
            s=Listfind(&La,f);
            if (s==0)
                printf("线性表中不存在值为%d的元素",f);
            else
                printf("值为%d的元素在线性表中的位置为%d",f,s);
        }
        if (m==7)
        {
            s= initlist(&La);
            if (s==0)
                printf("线性表置空失败");
            else
                printf("线性表置空成功");
            printsq(&La);
        }
        if (m==8)
        {
            initlist(&Lb);
            printf("请输入Lb中的元素个数:");
            scanf("%d",&f);
            Init(&Lb,f);
            initlist(&Lc);
            s=MList(&La,&Lb,&Lc);
            if(s==1){
                printf("合并成功,合并后的结果为:\n");
                printsq(&Lc);}
            else
                printf("合并失败");
        }
        if (m==9)
        {
            s=TList(&La);
            if(s==1) {
                printf("倒置成功\n");
                printsq(&La);
            }
            else
                printf("倒置失败");
        }
        if(m==10)
        {
            printf("请输入需要删除元素的值:");
            scanf("%d",&f);
            s=delx(&La,f);
            if (s==0)
                printf("表为空,无法执行删除操作");
            else
                printf("删除成功\n");
            printsq(&La);
        }
        if(m==11)
        {
            initlist(&Lb);
            printf("请输入Lb中的元素个数:");
            scanf("%d",&f);
            Init(&Lb,f);
            s=RList(&La,&Lb);
            if(s==1)
            {
                printf("操作成功,取交集后的结果为:\n");
                printsq(&Lb);
            }
        }
        if(m==12)
        {
            S.Stu= (Student*) malloc (INITSIZE*sizeof(Student) );
            if (S.Stu==NULL) //分配空间失败
                return 0;
            S.Length=0;  //分配成功,把表长赋值为0,即创建一个空表
            S.ListSize=INITSIZE;
            s=Create(&S);
            if(s==1)
            {
                int i;
                printf("创建成功!\n学生信息表为:\n");
                printf("Size=%d    Length=%d   \n",S.ListSize,S.Length);
                printf("---------------------\n");
                for (i=0; i<S.Length; i++){
                    printf("学号:%d |",S.Stu[i].sno);
                    printf(" 成绩:%.1f\n",S.Stu[i].score);
                    printf("---------------------\n");
                }
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值